using FastReport.Preview;
using FastReport.Table;
using System;
using System.Drawing;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Web;
using System.Web.SessionState;
namespace FastReport.Web.Handlers
{
///
/// Web handler class
///
public partial class WebExport : IHttpHandler, IRequiresSessionState
{
///
/// You will need to configure this handler in the web.config file of your
/// web and register it with IIS before being able to use it. For more information
/// see the following link: http://go.microsoft.com/?linkid=8101007
///
#region IHttpHandler Members
private WebReportCache cache;
private WebReport webReport;
private WebLog log;
private Report Report
{
get { return webReport.Report; }
}
private WebReportProperties Properties
{
get { return webReport.Prop; }
}
///
///
///
public bool IsReusable
{
get { return true; }
}
///
/// Process Request
///
///
public void ProcessRequest(HttpContext context)
{
// init of cache
cache = new WebReportCache(context);
// pictures
if (context.Request.Params[WebUtils.PicsPrefix] != null)
SendPicture(context);
// export
else if (context.Request.QueryString[WebUtils.ConstID] != null)
SendExport(context);
// print
else if (context.Request.Params[WebUtils.PrintPrefix] != null &&
context.Request.Params[WebUtils.ReportPrefix] != null)
SendPrint(context);
// report
else if (context.Request.Params["object"] != null)
SendObjectResponse(context);
else if (context.Request.Params["previewobject"] != null)
SendPreviewObjectResponse(context);
else if (context.Request.Params["form"] != null)
SendForm(context);
else if (context.Request.Params["respic"] != null)
SendResourcePic(context);
else if (context.Request.Params["getReport"] != null)
SendReportTemplate(context);
else if (context.Request.Params["putReport"] != null)
SetReportTemplate(context);
else if (context.Request.Params["getPreview"] != null)
SendReportPreview(context);
else if (context.Request.Params["designerMSChartTemplateName"] != null)
SendMsChartTemplate(context);
else if (context.Request.Params["makePreview"] != null)
MakeReportPreview(context);
else if (context.Request.Params["getFunctions"] != null)
MakeFunctionsList(context);
else if (context.Request.Params["getDesignerConfig"] != null)
MakeDesignerConfig(context);
else if (context.Request.Params["getConnectionTypes"] != null)
MakeConnectionTypes(context);
else if (context.Request.Params["getConnectionTables"] != null)
MakeConnectionTables(context);
else if (context.Request.Params["getConnectionStringProperties"] != null)
GetConnectionStringProperties(context);
else if (context.Request.Params["makeConnectionString"] != null)
MakeConnectionString(context);
else
SendDebug(context);
}
private void Finalize(HttpContext context)
{
// clean for objects in file cache
if (cache.WebFarmMode)
{
if (webReport != null)
{
if (webReport.Report != null)
{
if (webReport.Report.PreparedPages != null)
{
webReport.Report.PreparedPages.Clear();
}
webReport.Report.Dispose();
webReport.Report = null;
}
webReport.Dispose();
webReport = null;
}
}
// see https://stackoverflow.com/questions/20988445/how-to-avoid-response-end-thread-was-being-aborted-exception-during-the-exce
context.Response.Flush();
context.Response.SuppressContent = true;
context.ApplicationInstance.CompleteRequest();
//context.Response.End();
}
private string GetResourceTemplateUrl(HttpContext context, string resName)
{
return new System.Web.UI.Page().ClientScript.
GetWebResourceUrl(this.GetType(), string.Format("FastReport.Web.Resources.Templates.{0}", resName));
}
private void SendReportPreview(HttpContext context)
{
string guid = context.Request.Params["getPreview"];
WebUtils.SetupResponse(webReport, context);
context.Response.StatusCode = 501;
Finalize(context);
}
private bool CertificateValidationCallBack(object sender,
X509Certificate certificate,
X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
//Return True to force the certificate to be accepted.
return true;
}
private void SendResourcePic(HttpContext context)
{
if (WebUtils.SetupResponse(null, context))
{
string file = context.Request.Params["respic"];
context.Response.AddHeader("Content-Type", string.Concat("image/", Path.GetExtension(file)));
string resname = file.Replace('/', '.');
using (Stream stream = this.GetType().Assembly.GetManifestResourceStream(string.Concat("FastReport.Web.Resources.jquery.", resname)))
using (BinaryReader reader = new BinaryReader(stream))
{
byte[] res = reader.ReadBytes((int)stream.Length);
context.Response.OutputStream.Write(res, 0, res.Length);
res = null;
}
}
Finalize(context);
}
private void SendObjectResponse(HttpContext context)
{
string uuid = context.Request.Params["object"];
SetUpWebReport(uuid, context);
if (WebUtils.SetupResponse(webReport, context))
{
if (!NeedExport(context) && !NeedPrint(context))
{
if (webReport.DesignReport)
{
webReport.ReportLoad(context);
webReport.ReportRegisterDataAndRunEvent();
SendDesigner(context, uuid);
}
else
{
SendReport(context);
}
}
cache.PutObject(uuid, webReport);
}
Finalize(context);
}
private void SendReport(HttpContext context)
{
StringBuilder sb = new StringBuilder();
if (context.Request.Params["settab"] != null)
{
int i = 0;
if (int.TryParse(context.Request.Params["settab"], out i))
if (i >= 0 && i < webReport.Tabs.Count)
webReport.CurrentTabIndex = i;
}
else if (context.Request.Params["closetab"] != null)
{
int i = 0;
if (int.TryParse(context.Request.Params["closetab"], out i))
if (i >= 0 && i < webReport.Tabs.Count)
{
webReport.Tabs[i].Report.Dispose();
webReport.Tabs.RemoveAt(i);
if (i < webReport.Tabs.Count)
webReport.CurrentTabIndex = i;
else
webReport.CurrentTabIndex = i - 1;
}
}
Properties.ControlID = context.Request.Params["object"];
if (String.IsNullOrEmpty(Properties.ControlID))
Properties.ControlID = context.Request.Params["previewobject"];
context.Response.AddHeader("Content-Type", "html/text");
try
{
webReport.Localize();
if (context.Request.Params["refresh"] != null)
{
webReport.Refresh();
sb.Append(
webReport.Toolbar.GetHtmlProgress(
context.Response.ApplyAppPathModifier(WebUtils.HandlerFileName), Properties.ControlID, false, webReport.Width, webReport.Height));
}
else
{
if (context.Request.Params["reload"] != null)
webReport.Refresh();
if (context.Request.Params["dialog"] != null)
webReport.SetUpDialogs(context);
SetReportPage(context);
if (Properties.RefreshTimeout > 0)
sb.Append(
webReport.Toolbar.GetAutoRefresh(
context.Response.ApplyAppPathModifier(
WebUtils.HandlerFileName), Properties.ControlID, Properties.RefreshTimeout * 1000));
webReport.BeginReport(sb, context);
StringBuilder sb_rep = new StringBuilder();
webReport.GetReportHTML(sb_rep, context);
webReport.GetReportTopToolbar(sb);
sb.Append(sb_rep);
webReport.GetReportBottomToolbar(sb);
webReport.EndReport(sb);
}
}
catch (Exception e)
{
log.AddError(e);
}
if (log.Text.Length > 0)
{
context.Response.Write(log.Text);
log.Flush();
log.Clear();
}
SetContainer(context, Properties.ControlID);
context.Response.Write(sb.ToString());
}
private void SetContainer(HttpContext context, string p)
{
context.Response.AddHeader("FastReport-container", p);
}
private bool NeedPrint(HttpContext context)
{
if (context.Request.Params["print_browser"] != null)
webReport.ExportHtml(context, true, true);
else if (context.Request.Params["print_pdf"] != null)
webReport.ExportPdf(context, true, true, true);
else
return false;
return true;
}
private bool NeedExport(HttpContext context)
{
bool result = true;
if (context.Request.Params["export_pdf"] != null)
webReport.ExportPdf(context);
else if (context.Request.Params["export_excel2007"] != null)
webReport.ExportExcel2007(context);
else if (context.Request.Params["export_word2007"] != null)
webReport.ExportWord2007(context);
else if (context.Request.Params["export_pp2007"] != null)
webReport.ExportPowerPoint2007(context);
else if (context.Request.Params["export_text"] != null)
webReport.ExportText(context);
else if (context.Request.Params["export_rtf"] != null)
webReport.ExportRtf(context);
else if (context.Request.Params["export_xps"] != null)
webReport.ExportXps(context);
else if (context.Request.Params["export_ods"] != null)
webReport.ExportOds(context);
else if (context.Request.Params["export_odt"] != null)
webReport.ExportOdt(context);
else if (context.Request.Params["export_mht"] != null)
webReport.ExportMht(context);
else if (context.Request.Params["export_xml"] != null)
webReport.ExportXmlExcel(context);
else if (context.Request.Params["export_dbf"] != null)
webReport.ExportDbf(context);
else if (context.Request.Params["export_csv"] != null)
webReport.ExportCsv(context);
else if (context.Request.Params["export_fpx"] != null)
webReport.ExportPrepared(context);
else
result = false;
return result;
}
private void SetReportPage(HttpContext context)
{
if (context.Request.Params["next"] != null)
webReport.NextPage();
else if (context.Request.Params["prev"] != null)
webReport.PrevPage();
else if (context.Request.Params["first"] != null)
webReport.FirstPage();
else if (context.Request.Params["last"] != null)
webReport.LastPage();
else if (context.Request.Params["goto"] != null)
{
int i = 0;
if (int.TryParse(context.Request.Params["goto"], out i))
webReport.SetPage(i - 1);
}
else if (context.Request.Params["bookmark"] != null)
{
int i = PageNByBookmark(context.Server.UrlDecode(context.Request.Params["bookmark"]));
if (i != -1)
webReport.SetPage(i);
}
else if (context.Request.Params["advmatrix_click"] != null)
{
string[] clickParams = context.Request.Params["advmatrix_click"].Split(',');
if (clickParams.Length == 3)
{
int index = 0;
int pageN = 0;
if (int.TryParse(clickParams[1], out pageN) &&
int.TryParse(clickParams[2], out index))
{
DoClickAdvancedMatrixObjectByParamID(clickParams[0], pageN, index);
}
}
}
else if (context.Request.Params["click"] != null)
{
string[] clickParams = context.Request.Params["click"].Split(',');
if (clickParams.Length == 4)
{
float left = 0;
float top = 0;
int pageN = 0;
if (int.TryParse(clickParams[1], out pageN) &&
float.TryParse(clickParams[2], out left) &&
float.TryParse(clickParams[3], out top))
{
DoClickObjectByParamID(clickParams[0], pageN, left, top);
}
}
}
else if (context.Request.Params["detailed_report"] != null)
{
string[] detailParams = context.Server.UrlDecode(context.Request.Params["detailed_report"]).Split(',');
if (detailParams.Length == 3)
{
if (!String.IsNullOrEmpty(detailParams[0]) &&
!String.IsNullOrEmpty(detailParams[1]) &&
!String.IsNullOrEmpty(detailParams[2])
)
{
DoDetailedReport(detailParams[0], detailParams[1], detailParams[2]);
}
}
}
else if (context.Request.Params["detailed_page"] != null)
{
string[] detailParams = context.Server.UrlDecode(context.Request.Params["detailed_page"]).Split(',');
if (detailParams.Length == 3)
{
if (!String.IsNullOrEmpty(detailParams[0]) &&
!String.IsNullOrEmpty(detailParams[1]) &&
!String.IsNullOrEmpty(detailParams[2])
)
{
DoDetailedPage(detailParams[0], detailParams[1], detailParams[2]);
}
}
}
else if (context.Request.Params["zoom_width"] != null)
webReport.Prop.ZoomMode = ZoomMode.Width;
else if (context.Request.Params["zoom_page"] != null)
webReport.Prop.ZoomMode = ZoomMode.Page;
else if (context.Request.Params["zoom_300"] != null)
webReport.Prop.Zoom = 3;
else if (context.Request.Params["zoom_200"] != null)
webReport.Prop.Zoom = 2;
else if (context.Request.Params["zoom_150"] != null)
webReport.Prop.Zoom = 1.5f;
else if (context.Request.Params["zoom_100"] != null)
webReport.Prop.Zoom = 1;
else if (context.Request.Params["zoom_90"] != null)
webReport.Prop.Zoom = 0.9f;
else if (context.Request.Params["zoom_75"] != null)
webReport.Prop.Zoom = 0.75f;
else if (context.Request.Params["zoom_50"] != null)
webReport.Prop.Zoom = 0.5f;
else if (context.Request.Params["zoom_25"] != null)
webReport.Prop.Zoom = 0.25f;
else if (context.Request.Params["checkbox_click"] != null)
{
string[] clickParams = context.Request.Params["checkbox_click"].Split(',');
if (clickParams.Length == 4)
{
float left = 0;
float top = 0;
int pageN = 0;
if (int.TryParse(clickParams[1], out pageN) &&
float.TryParse(clickParams[2], out left) &&
float.TryParse(clickParams[3], out top))
{
DoCheckboxClick(clickParams[0], pageN, left, top);
}
}
}
else if (context.Request.Params["text_edit"] != null)
{
string[] clickParams = context.Request.Params["text_edit"].Split(',');
string text = context.Request.Form["text"];
if (clickParams.Length == 4 && text != null)
{
float left = 0;
float top = 0;
int pageN = 0;
if (int.TryParse(clickParams[1], out pageN) &&
float.TryParse(clickParams[2], out left) &&
float.TryParse(clickParams[3], out top))
{
string decodedText = HttpUtility.HtmlDecode(text);
// we need to normalize line endings because they are different in .net and browsers
string normalizedText = System.Text.RegularExpressions.Regex.Replace(decodedText, @"\r\n|\n\r|\n|\r", "\r\n");
DoTextEdit(clickParams[0], pageN, left, top, normalizedText);
}
}
}
}
private void DoCheckboxClick(string objectName, int pageN, float left, float top)
{
if (Report.PreparedPages == null)
return;
bool found = false;
while (pageN < Report.PreparedPages.Count && !found)
{
ReportPage page = Report.PreparedPages.GetPage(pageN);
if (page != null)
{
ObjectCollection allObjects = page.AllObjects;
System.Drawing.PointF point = new System.Drawing.PointF(left + 1, top + 1);
foreach (Base obj in allObjects)
{
CheckBoxObject c = obj as CheckBoxObject;
if (c != null &&
c.Name == objectName &&
c.AbsBounds.Contains(point))
{
c.Checked = !c.Checked;
if (webReport.Report.NeedRefresh)
webReport.Report.InteractiveRefresh();
else
webReport.Report.PreparedPages.ModifyPage(pageN, page);
found = true;
break;
}
}
page.Dispose();
pageN++;
}
}
}
private void DoTextEdit(string objectName, int pageN, float left, float top, string text)
{
if (Report.PreparedPages == null)
return;
Action AssignText = delegate (TextObject t, ReportPage page)
{
t.Text = text;
if (webReport.Report.NeedRefresh)
webReport.Report.InteractiveRefresh();
else
webReport.Report.PreparedPages.ModifyPage(pageN, page);
};
ProcessClick(objectName, pageN, left, top, null, AssignText, null);
}
private void DoDetailedReport(string objectName, string paramName, string paramValue)
{
if (!String.IsNullOrEmpty(objectName))
{
ReportComponentBase obj = Report.FindObject(objectName) as ReportComponentBase;
if (obj != null && obj.Hyperlink.Kind == HyperlinkKind.DetailReport)
{
Report tabReport = new Report();
string fileName = obj.Hyperlink.DetailReportName;
if (File.Exists(fileName))
{
tabReport.Load(fileName);
Data.Parameter param = tabReport.Parameters.FindByName(paramName);
if (param != null && param.ChildObjects.Count > 0)
{
string[] paramValues = paramValue.Split(obj.Hyperlink.ValuesSeparator[0]);
if (paramValues.Length > 0)
{
int i = 0;
foreach (Data.Parameter childParam in param.ChildObjects)
{
childParam.Value = paramValues[i++];
if (i >= paramValues.Length)
break;
}
}
}
else
tabReport.SetParameterValue(paramName, paramValue);
Report.Dictionary.ReRegisterData(tabReport.Dictionary);
webReport.AddTab(tabReport, paramValue, false);
int prevTab = webReport.CurrentTabIndex;
webReport.CurrentTabIndex = webReport.Tabs.Count - 1;
webReport.Prop.PreviousTab = prevTab;
}
}
}
}
private void DoDetailedPage(string objectName, string paramName, string paramValue)
{
if (!String.IsNullOrEmpty(objectName))
{
Report currentReport = webReport.CurrentTab.NeedParent ? webReport.ReportTabs[0].Report : Report;
ReportComponentBase obj = currentReport.FindObject(objectName) as ReportComponentBase;
if (obj != null && obj.Hyperlink.Kind == HyperlinkKind.DetailPage)
{
ReportPage reportPage = currentReport.FindObject(obj.Hyperlink.DetailPageName) as ReportPage;
if (reportPage != null)
{
Data.Parameter param = currentReport.Parameters.FindByName(paramName);
if (param != null && param.ChildObjects.Count > 0)
{
string[] paramValues = paramValue.Split(obj.Hyperlink.ValuesSeparator[0]);
if (paramValues.Length > 0)
{
int i = 0;
foreach (Data.Parameter childParam in param.ChildObjects)
{
childParam.Value = paramValues[i++];
if (i >= paramValues.Length)
break;
}
}
}
else
{
currentReport.SetParameterValue(paramName, paramValue);
}
PreparedPages oldPreparedPages = currentReport.PreparedPages;
PreparedPages pages = new PreparedPages(currentReport);
Report tabReport = new Report();
currentReport.SetPreparedPages(pages);
currentReport.PreparePage(reportPage);
tabReport.SetPreparedPages(currentReport.PreparedPages);
webReport.AddTab(tabReport, paramValue, true, true);
int prevTab = webReport.CurrentTabIndex;
currentReport.SetPreparedPages(oldPreparedPages);
webReport.CurrentTabIndex = webReport.Tabs.Count - 1;
webReport.Prop.PreviousTab = prevTab;
}
}
}
}
private void DoClickAdvancedMatrixObjectByParamID(string objectName, int pageN, int index)
{
if (webReport.Report.PreparedPages != null)
{
bool found = false;
while (pageN < webReport.Report.PreparedPages.Count && !found)
{
ReportPage page = webReport.Report.PreparedPages.GetPage(pageN);
if (page != null)
{
ObjectCollection allObjects = page.AllObjects;
foreach (Base obj in allObjects)
{
if (obj is ReportComponentBase)
{
if (obj is AdvMatrix.MatrixCollapseButton)
{
AdvMatrix.MatrixCollapseButton collapseButton = obj as AdvMatrix.MatrixCollapseButton;
if (collapseButton.Name == objectName
&& collapseButton.Index == index)
{
collapseButton.MatrixCollapseButtonClick();
Click(collapseButton, pageN, page);
found = true;
break;
}
}
else if (obj is AdvMatrix.MatrixSortButton)
{
AdvMatrix.MatrixSortButton sortButton = obj as AdvMatrix.MatrixSortButton;
if (sortButton.Name == objectName
&& sortButton.Index == index)
{
sortButton.MatrixSortButtonClick();
Click(sortButton, pageN, page);
found = true;
break;
}
}
}
}
page.Dispose();
pageN++;
}
}
}
}
private void DoClickObjectByParamID(string objectName, int pageN, float left, float top)
{
if (webReport.Report.PreparedPages != null)
{
bool found = false;
while (pageN < webReport.Report.PreparedPages.Count && !found)
{
ReportPage page = webReport.Report.PreparedPages.GetPage(pageN);
if (page != null)
{
ObjectCollection allObjects = page.AllObjects;
System.Drawing.PointF point = new System.Drawing.PointF(left + 1, top + 1);
foreach (Base obj in allObjects)
{
if (obj is ReportComponentBase)
{
ReportComponentBase c = obj as ReportComponentBase;
if (c is TableBase)
{
TableBase table = c as TableBase;
for (int i = 0; i < table.RowCount; i++)
{
for (int j = 0; j < table.ColumnCount; j++)
{
TableCell textcell = table[j, i];
if (textcell.Name == objectName)
{
System.Drawing.RectangleF rect =
new System.Drawing.RectangleF(table.Columns[j].AbsLeft,
table.Rows[i].AbsTop,
textcell.Width,
textcell.Height);
if (rect.Contains(point))
{
Click(textcell, pageN, page);
found = true;
break;
}
}
}
if (found)
break;
}
}
else
if (c.Name == objectName &&
#if FRCORE
c.AbsBounds.Contains(point))
#else
c.PointInObject(point))
#endif
{
Click(c, pageN, page);
found = true;
break;
}
}
}
page.Dispose();
pageN++;
}
}
}
}
private void Click(ReportComponentBase c, int pageN, ReportPage page)
{
c.OnClick(null);
if (webReport.Report.NeedRefresh)
webReport.Report.InteractiveRefresh();
else
webReport.Report.PreparedPages.ModifyPage(pageN, page);
}
private int PageNByBookmark(string bookmark)
{
int pageN = -1;
if (webReport.Report.PreparedPages != null)
{
for (int i = 0; i < webReport.Report.PreparedPages.Count; i++)
{
ReportPage page = webReport.Report.PreparedPages.GetPage(i);
if (page != null)
{
ObjectCollection allObjects = page.AllObjects;
for (int j = 0; j < allObjects.Count; j++)
{
ReportComponentBase c = allObjects[j] as ReportComponentBase;
if (c.Bookmark == bookmark)
{
pageN = i;
break;
}
}
page.Dispose();
if (pageN != -1)
break;
}
}
}
return pageN;
}
private void SendDebug(HttpContext context)
{
if (WebUtils.SetupResponse(null, context))
{
int count = cache.CleanFileStorage();
context.Response.ContentType = "text/html";
context.Response.Write("FastReport.Web.WebExport handler: FastReport.NET");
context.Response.Write(String.Concat("v", FastReport.Utils.Config.Version, "
",
"Current server time: ", DateTime.Now.ToString(), "
",
"Cluster mode: ", (cache.WebFarmMode ? "ON" : "OFF"), "
",
"Files in storage: ", count.ToString(), ""));
}
Finalize(context);
}
private void SendPrint(HttpContext context)
{
try
{
string guid = context.Request.Params[WebUtils.ReportPrefix];
SetUpWebReport(guid, context);
if (WebUtils.SetupResponse(webReport, context))
{
if (context.Request.Params[WebUtils.PrintPrefix] == "pdf")
webReport.PrintPdf(context);
else
webReport.PrintHtml(context);
}
}
catch (Exception e)
{
log.AddError(e);
}
if (log.Text.Length > 0)
{
context.Response.Write(log.Text);
log.Flush();
log.Clear();
}
Finalize(context);
}
private void SendExport(HttpContext context)
{
log = new WebLog(false);
string cacheKeyName = context.Request.QueryString[WebUtils.ConstID];
WebExportItem exportItem = cache.GetObject(cacheKeyName) as WebExportItem;
SetUpWebReport(exportItem.ReportID, context);
if (WebUtils.SetupResponse(webReport, context))
{
if (exportItem != null)
{
try
{
bool isIE8 = WebUtils.IsIE8(context);
//cache.Remove(cacheKeyName);
context.Response.ClearContent();
context.Response.ClearHeaders();
if (string.IsNullOrEmpty(exportItem.ContentType))
context.Response.ContentType = "application/unknown";
else
context.Response.ContentType = exportItem.ContentType;
context.Response.AddHeader("Content-Type", context.Response.ContentType);
if (!isIE8)
WebUtils.AddNoCacheHeaders(context);
string disposition = "attachment";
if (context.Request.QueryString["displayinline"].Equals("True", StringComparison.OrdinalIgnoreCase))
disposition = "inline";
string fileName = context.Server.UrlPathEncode(exportItem.FileName).Replace(",", "");
string s = String.Concat(isIE8 ? "=" : "*=UTF-8''", fileName);
string contentDisposition = string.Format("{0}; filename{1}", disposition, s);
context.Response.AddHeader("Content-Disposition", contentDisposition);
context.Response.AddHeader("Cache-Control", "private");
context.Response.Flush();
WebUtils.ResponseChunked(context.Response, exportItem.File);
//exportItem.File = null;
//exportItem = null;
}
catch (Exception e)
{
log.AddError(e);
}
if (log.Text.Length > 0)
{
context.Response.Write(log.Text);
log.Flush();
log.Clear();
}
}
}
Finalize(context);
}
private void SendPicture(HttpContext context)
{
if (WebUtils.SetupResponse(null, context))
{
try
{
string imageKeyName = Convert.ToString(context.Request.Params[WebUtils.PicsPrefix]);
byte[] image = cache.GetObject(imageKeyName) as byte[];
context.Response.ContentType = WebUtils.IsPng(image) ? "image/png" : "image/svg+xml";
context.Response.Flush();
try
{
if (image != null)
WebUtils.ResponseChunked(context.Response, image);
}
finally
{
image = null;
}
}
catch
{
// nothing
}
}
Finalize(context);
}
private void SendForm(HttpContext context)
{
context.Response.AddHeader("Content-Type", "text/html");
string uuid = context.Request.Params["form"];
SetUpWebReport(uuid, context);
if (WebUtils.SetupResponse(webReport, context))
{
string formName = context.Request.Params["formName"];
if (webReport != null && formName == "text_edit")
{
string click = context.Request.Params["formClick"].ToString();
if (!String.IsNullOrEmpty(click))
{
string[] clickParams = click.Split(',');
if (clickParams.Length == 4)
{
int pageN;
float left;
float top;
if (int.TryParse(clickParams[1], out pageN) &&
float.TryParse(clickParams[2], out left) &&
float.TryParse(clickParams[3], out top))
{
WriteTextEditForm(context.Response, clickParams[0], pageN, left, top);
}
}
}
}
}
Finalize(context);
}
private void WriteTextEditForm(HttpResponse response, string objectName, int pageN, float left, float top)
{
if (Report.PreparedPages == null)
return;
ProcessClick(objectName, pageN, left, top, EditClick, null, response);
}
private void EditClick(TextObject c, HttpResponse response)
{
string encodedText = HttpUtility.HtmlEncode((c as TextObject).Text);
WebTemplate template = new WebTemplate(GetResourceTemplate("textedit_form.html"), WebTemplateMode.HTML, true);
template.SetVariable("text", encodedText);
template.SetVariable("cancel-button", GetCancelButton());
template.SetVariable("ok-button", GetOkButton());
response.Write(template.Prepare());
}
private void ProcessClick(string objectName, int pageN, float left, float top, Action HandleClickFront, Action HandleClickBack, HttpResponse response)
{
bool found = false;
while (pageN < Report.PreparedPages.Count && !found)
{
ReportPage page = Report.PreparedPages.GetPage(pageN);
if (page != null)
{
ObjectCollection allObjects = page.AllObjects;
System.Drawing.PointF point = new System.Drawing.PointF(left + 1, top + 1);
foreach (Base obj in allObjects)
{
if (obj is ReportComponentBase)
{
ReportComponentBase c = obj as ReportComponentBase;
if (c is TableBase)
{
TableBase table = c as TableBase;
for (int i = 0; i < table.RowCount; i++)
{
for (int j = 0; j < table.ColumnCount; j++)
{
TableCell textcell = table[j, i];
if (textcell.Name == objectName)
{
RectangleF rect = new RectangleF(table.Columns[j].AbsLeft,
table.Rows[i].AbsTop,
textcell.Width,
textcell.Height);
if (rect.Contains(point))
{
if (HandleClickFront != null)
HandleClickFront(textcell as TextObject, response);
if (HandleClickBack != null)
HandleClickBack(textcell as TextObject, page);
found = true;
break;
}
}
}
if (found)
break;
}
}
else if (c is TextObject)
{
if (c != null && c.Name == objectName && c.AbsBounds.Contains(point))
{
if (HandleClickFront != null)
HandleClickFront(c as TextObject, response);
if (HandleClickBack != null)
HandleClickBack(c as TextObject, page);
found = true;
break;
}
}
if (found)
break;
}
}
page.Dispose();
pageN++;
}
}
}
private string GetCancelButton()
{
StringBuilder sb = new StringBuilder();
WebRes res = webReport.ReportRes;
res.Root("Buttons");
sb.Append(string.Format("", res.Get("Cancel")));
return sb.ToString();
}
private string GetOkButton()
{
StringBuilder sb = new StringBuilder();
WebRes res = webReport.ReportRes;
res.Root("Buttons");
sb.Append(string.Format("", res.Get("Ok")));
return sb.ToString();
}
private void SetUpWebReport(string ID, HttpContext context)
{
if (webReport == null)
{
webReport = new WebReport();
webReport.ReportGuid = ID;
}
webReport = cache.GetObject(ID, webReport) as WebReport;
webReport.Prop.HandlerURL = WebUtils.GetBasePath(context) + WebUtils.HandlerFileName;
cache.Priority = webReport.CachePriority;
cache.Delay = webReport.CacheDelay;
log = new WebLog(webReport.Debug);
if (!String.IsNullOrEmpty(webReport.LogFile))
{
log.LogFile = context.Server.MapPath(webReport.LogFile);
}
}
private string GetResourceTemplate(string name)
{
string result;
using (Stream stream = this.GetType().Assembly.GetManifestResourceStream(string.Format("FastReport.Web.Resources.Templates.{0}", name)))
using (TextReader reader = new StreamReader(stream))
result = reader.ReadToEnd();
return result;
}
#endregion
}
}