blob: 06ca81060d5540dd2ab201b6b87bda7574f956f1 [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.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 Uri(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;
MemoryStream _stream = null;
internal MemoryStream Stream
{
get
{
return _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 MemoryStream();
}
else
{
_stream.Seek(0, SeekOrigin.Begin);
}
return _stream;
}
string _contentType = "";
public string ContentType
{
get
{
return _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 ZipPackage.ContentType(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();
}
}
}