| /******************************************************************************* |
| * You may amend and distribute as you like, but don't remove this header! |
| * |
| * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets. |
| * See http://www.codeplex.com/EPPlus for details. |
| * |
| * Copyright (C) 2011 Jan Källman |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * See the GNU Lesser General Public License for more details. |
| * |
| * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php |
| * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html |
| * |
| * All code and executables are provided "as is" with no warranty either express or implied. |
| * The author accepts no liability for any damage or loss of business that this product may cause. |
| * |
| * Code change notes: |
| * |
| * Author Change Date |
| ******************************************************************************* |
| * Jan Källman Added 25-Oct-2012 |
| *******************************************************************************/ |
| |
| using System; |
| using System.Collections.Immutable; |
| using System.IO; |
| using System.IO.Compression; |
| using System.Runtime.InteropServices; |
| |
| namespace OfficeOpenXml.Packaging; |
| |
| internal class ZipPackagePart : ZipPackageRelationshipBase, IDisposable { |
| internal ZipPackagePart(ZipPackage package, ZipArchiveEntry entry, ImmutableArray<byte> data) { |
| Package = package; |
| SaveHandler = null; |
| Uri = new(package.GetUriKey(entry.FullName), UriKind.Relative); |
| _data = data; |
| } |
| |
| private readonly ImmutableArray<byte> _data; |
| |
| internal ZipPackagePart( |
| ZipPackage package, |
| Uri partUri, |
| string contentType, |
| Action<StreamWriter> saveHandler) { |
| Package = package; |
| Uri = partUri; |
| ContentType = contentType; |
| SaveHandler = saveHandler; |
| } |
| |
| private ZipPackage Package { get; } |
| |
| internal override ZipPackageRelationship CreateRelationship( |
| Uri targetUri, |
| TargetMode targetMode, |
| string relationshipType) { |
| var rel = base.CreateRelationship(targetUri, targetMode, relationshipType); |
| rel.SourceUri = Uri; |
| return rel; |
| } |
| |
| internal MemoryStream GetStream() { |
| return new(ImmutableCollectionsMarshal.AsArray(_data) ?? [], false); |
| } |
| |
| private string _contentType = ""; |
| |
| public string ContentType { |
| get => _contentType; |
| internal set { |
| if (!string.IsNullOrEmpty(_contentType)) { |
| if (Package._contentTypes.ContainsKey(Package.GetUriKey(Uri.OriginalString))) { |
| Package._contentTypes.Remove(Package.GetUriKey(Uri.OriginalString)); |
| Package._contentTypes.Add( |
| Package.GetUriKey(Uri.OriginalString), |
| new(value, false, Uri.OriginalString)); |
| } |
| } |
| _contentType = value; |
| } |
| } |
| |
| public Uri Uri { get; } |
| |
| internal Action<StreamWriter> SaveHandler { get; set; } |
| |
| internal void WriteZip(ZipArchive zipArchive) { |
| if (SaveHandler == null) { |
| if (_data.Length == 0) { |
| return; |
| } |
| var zipEntry = zipArchive.CreateEntry(Uri.OriginalString); |
| using var os = zipEntry.Open(); |
| os.Write(_data.AsSpan()); |
| } else { |
| var zipEntry = zipArchive.CreateEntry(Uri.OriginalString); |
| using var streamWriter = new StreamWriter(zipEntry.Open()); |
| SaveHandler(streamWriter); |
| } |
| |
| if (_rels.Count > 0) { |
| string f = Uri.OriginalString; |
| var name = Path.GetFileName(f); |
| _rels.WriteZip(zipArchive, $"{f.Substring(0, f.Length - name.Length)}_rels/{name}.rels"); |
| } |
| } |
| |
| public void Dispose() {} |
| } |