| /******************************************************************************* |
| * 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.IO; |
| using System.IO.Compression; |
| |
| namespace OfficeOpenXml.Packaging; |
| |
| internal class ZipPackagePart : ZipPackageRelationshipBase, IDisposable { |
| internal delegate void SaveHandlerDelegate(StreamWriter streamWriter); |
| |
| internal ZipPackagePart(ZipPackage package, ZipArchiveEntry entry) { |
| Package = package; |
| SaveHandler = null; |
| Uri = new(package.GetUriKey(entry.FullName), UriKind.Relative); |
| } |
| |
| internal ZipPackagePart( |
| ZipPackage package, |
| Uri partUri, |
| string contentType, |
| CompressionLevel compressionLevel) { |
| Package = package; |
| //Entry = new ZipEntry(); |
| //Entry.FileName = partUri.OriginalString.Replace('/','\\'); |
| Uri = partUri; |
| ContentType = contentType; |
| CompressionLevel = compressionLevel; |
| } |
| |
| internal ZipPackage Package { get; set; } |
| |
| internal CompressionLevel CompressionLevel; |
| private MemoryStream _stream; |
| |
| internal MemoryStream Stream { |
| get => _stream; |
| set => _stream = value; |
| } |
| |
| 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 GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite); |
| } |
| |
| internal MemoryStream GetStream(FileMode fileMode) { |
| return GetStream(FileMode.Create, FileAccess.ReadWrite); |
| } |
| |
| internal MemoryStream GetStream(FileMode fileMode, FileAccess fileAccess) { |
| if (_stream == null || fileMode == FileMode.CreateNew || fileMode == FileMode.Create) { |
| _stream = new(); |
| } else { |
| _stream.Seek(0, SeekOrigin.Begin); |
| } |
| return _stream; |
| } |
| |
| 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; private set; } |
| |
| internal SaveHandlerDelegate SaveHandler { get; set; } |
| |
| internal void WriteZip(ZipArchive zipArchive) { |
| byte[] b; |
| if (SaveHandler == null) { |
| b = GetStream().ToArray(); |
| if (b.Length |
| == 0) //Make sure the file isn't empty. DotNetZip streams does not seems to handle zero sized files. |
| { |
| return; |
| } |
| var zipEntry = zipArchive.CreateEntry(Uri.OriginalString); |
| using var os = zipEntry.Open(); |
| os.Write(b); |
| } 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"); |
| } |
| b = null; |
| } |
| |
| public void Dispose() { |
| _stream.Close(); |
| _stream.Dispose(); |
| } |
| } |