blob: 47d20fbc45100595d4d1edd01c11d2a140e68e25 [file] [log] [blame]
/*******************************************************************************
* 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() {}
}