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
}
}