using System; using System.IO; using System.Collections.Generic; using FastReport.Export; using FastReport.Utils; namespace FastReport.Cloud.StorageClient { /// /// The base class for all cloud storage clients. /// public abstract class CloudStorageClient { #region Fields private string filename; private bool isUserAuthorized; private CloudProxySettings proxySettings; #endregion // Fields #region Properties /// /// Gets or sets the filename. /// protected string Filename { get { return filename; } set { filename = value; } } /// /// Gets or set the information is user authorized or not. /// public bool IsUserAuthorized { get { return isUserAuthorized; } set { isUserAuthorized = value; } } /// /// Gets or sets the proxy settings of a client. /// public CloudProxySettings ProxySettings { get { return proxySettings; } set { proxySettings = value; } } #endregion // Properties #region Constructors /// /// Initializes a new instance of the class. /// public CloudStorageClient() { filename = ""; isUserAuthorized = false; proxySettings = null; } #endregion // Constructors #region Protected Methods /// /// Prepares report before it will be saved to cloud storage. /// /// The report template. /// The export filter. /// Memory stream that contains prepared report. protected MemoryStream PrepareToSave(Report report, ExportBase export) { MemoryStream stream = new MemoryStream(); if (export != null) { export.OpenAfterExport = false; if (!export.HasMultipleFiles) { export.Export(report, stream); } else { export.ExportAndZip(report, stream); } } else { report.PreparedPages.Save(stream); } filename = "Report"; if (!String.IsNullOrEmpty(report.FileName)) { filename = Path.GetFileNameWithoutExtension(report.FileName); } string ext = ".fpx"; if (export != null) { if (!export.HasMultipleFiles) { ext = export.FileFilter.Substring(export.FileFilter.LastIndexOf('.')); } else { ext = ".zip"; } } filename += ext; stream.Position = 0; return stream; } /// /// Creates a MemoryStream instance using a Stream instance. /// /// The Stream instance that should be converted. /// The MemoryStream instance. protected MemoryStream CreateMemoryStream(Stream stream) { long originalStreamPosition = stream.Position; stream.Position = 0; byte[] oneByte = new byte[1]; List allBytes = new List(); int bytesRead = 0; do { bytesRead = stream.Read(oneByte, 0, 1); if (bytesRead != 0) { allBytes.Add(oneByte[0]); } } while (bytesRead != 0); stream.Position = originalStreamPosition; MemoryStream ms = new MemoryStream(allBytes.ToArray()); ms.Position = 0; return ms; } /// /// Saves a memory stream to cloud. /// /// The memory stream that should be saved. protected abstract void SaveMemoryStream(MemoryStream ms); #endregion // Protected Methods #region Public Methods /// /// Saves the report to cloud storage. /// /// The report template that should be saved. /// The export filter that should export template before. /// public void SaveReport(Report report, ExportBase export) { using (MemoryStream ms = PrepareToSave(report, export)) { SaveMemoryStream(ms); } } /// /// Saves the stream to cloud storage. /// /// The stream that contains report. /// The filename in which stream will be saved in cloud. public void SaveStream(Stream stream, string filename) { Filename = filename; using (MemoryStream ms = CreateMemoryStream(stream)) { SaveMemoryStream(ms); } } #endregion // Public Methods } }