// Disabled cause we needn't System.Web reference
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.Collections.Specialized;
//using System.Drawing;
//using System.Drawing.Imaging;
//using System.IO;
//using System.Text;
//using System.Threading;
//using System.Web;
//namespace Svg.Web
//{
// ///
// /// A handler to asynchronously render Scalable Vector Graphics files (usually *.svg or *.xml file extensions).
// ///
// ///
// /// If a crawler requests the SVG file the raw XML will be returned rather than the image to allow crawlers to better read the image.
// /// Adding "?raw=true" to the querystring will alos force the handler to render the raw SVG.
// ///
// public class SvgHandler : IHttpAsyncHandler
// {
// Thread t;
// ///
// /// Gets a value indicating whether another request can use the instance.
// ///
// ///
// /// true if the instance is reusable; otherwise, false.
// public bool IsReusable
// {
// get { return false; }
// }
// ///
// /// Enables processing of HTTP Web requests by a custom HttpHandler that implements the interface.
// ///
// /// An object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.
// public void ProcessRequest(HttpContext context)
// {
// // Not used
// }
// ///
// /// Initiates an asynchronous call to the HTTP handler.
// ///
// /// An object that provides references to intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.
// /// The to call when the asynchronous method call is complete. If is null, the delegate is not called.
// /// Any extra data needed to process the request.
// ///
// /// An that contains information about the status of the process.
// ///
// public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
// {
// string path = context.Request.PhysicalPath;
// if (!File.Exists(path))
// {
// throw new HttpException(404, "The requested file cannot be found.");
// }
// SvgAsyncRenderState reqState = new SvgAsyncRenderState(context, cb, extraData);
// SvgAsyncRender asyncRender = new SvgAsyncRender(reqState);
// ThreadStart ts = new ThreadStart(asyncRender.RenderSvg);
// t = new Thread(ts);
// t.Start();
// return reqState;
// }
// ///
// /// Provides an asynchronous process End method when the process ends.
// ///
// /// An that contains information about the status of the process.
// public void EndProcessRequest(IAsyncResult result)
// {
// }
// ///
// /// The class to be used when
// ///
// protected sealed class SvgAsyncRender
// {
// private SvgAsyncRenderState _state;
// public SvgAsyncRender(SvgAsyncRenderState state)
// {
// this._state = state;
// }
// private void RenderRawSvg()
// {
// this._state._context.Response.ContentType = "image/svg+xml";
// this._state._context.Response.WriteFile(this._state._context.Request.PhysicalPath);
// this._state._context.Response.End();
// this._state.CompleteRequest();
// }
// public void RenderSvg()
// {
// this._state._context.Response.AddFileDependency(this._state._context.Request.PhysicalPath);
// this._state._context.Response.Cache.SetLastModifiedFromFileDependencies();
// this._state._context.Response.Cache.SetETagFromFileDependencies();
// this._state._context.Response.Buffer = false;
// // Allow crawlers to see the raw XML - they can get more information from it that way
// if (this._state._context.Request.Browser.Crawler || !string.IsNullOrEmpty(this._state._context.Request.QueryString["raw"]))
// {
// this.RenderRawSvg();
// }
// else
// {
// try
// {
// Dictionary entities = new Dictionary();
// NameValueCollection queryString = this._state._context.Request.QueryString;
// for (int i = 0; i < queryString.Count; i++)
// {
// entities.Add(queryString.Keys[i], queryString[i]);
// }
// SvgDocument document = SvgDocument.Open(this._state._context.Request.PhysicalPath, entities);
// using (Bitmap bitmap = document.Draw())
// {
// using (MemoryStream ms = new MemoryStream())
// {
// bitmap.Save(ms, ImageFormat.Png);
// this._state._context.Response.ContentType = "image/png";
// ms.WriteTo(this._state._context.Response.OutputStream);
// }
// }
// }
// catch (Exception exc)
// {
// System.Diagnostics.Trace.TraceError("An error occured while attempting to render the SVG image '" + this._state._context.Request.PhysicalPath + "': " + exc.Message);
// }
// finally
// {
// this._state._context.Response.End();
// this._state.CompleteRequest();
// }
// }
// }
// }
// ///
// /// Represents the state of a request for SVG rendering.
// ///
// protected sealed class SvgAsyncRenderState : IAsyncResult
// {
// internal HttpContext _context;
// internal AsyncCallback _callback;
// internal object _extraData;
// private bool _isCompleted = false;
// private ManualResetEvent _callCompleteEvent = null;
// ///
// /// Initializes a new instance of the class.
// ///
// /// The of the request.
// /// The delegate to be called when the rendering is complete.
// /// The extra data.
// public SvgAsyncRenderState(HttpContext context, AsyncCallback callback, object extraData)
// {
// _context = context;
// _callback = callback;
// _extraData = extraData;
// }
// ///
// /// Indicates that the rendering is complete and the waiting thread may proceed.
// ///
// internal void CompleteRequest()
// {
// _isCompleted = true;
// lock (this)
// {
// if (this.AsyncWaitHandle != null)
// {
// this._callCompleteEvent.Set();
// }
// }
// // if a callback was registered, invoke it now
// if (_callback != null)
// {
// _callback(this);
// }
// }
// ///
// /// Gets a user-defined object that qualifies or contains information about an asynchronous operation.
// ///
// ///
// /// A user-defined object that qualifies or contains information about an asynchronous operation.
// public object AsyncState { get { return (_extraData); } }
// ///
// /// Gets an indication of whether the asynchronous operation completed synchronously.
// ///
// ///
// /// true if the asynchronous operation completed synchronously; otherwise, false.
// public bool CompletedSynchronously { get { return (false); } }
// ///
// /// Gets an indication whether the asynchronous operation has completed.
// ///
// ///
// /// true if the operation is complete; otherwise, false.
// public bool IsCompleted { get { return (_isCompleted); } }
// ///
// /// Gets a that is used to wait for an asynchronous operation to complete.
// ///
// ///
// /// A that is used to wait for an asynchronous operation to complete.
// public WaitHandle AsyncWaitHandle
// {
// get
// {
// lock (this)
// {
// if (_callCompleteEvent == null)
// {
// _callCompleteEvent = new ManualResetEvent(false);
// }
// return _callCompleteEvent;
// }
// }
// }
// }
// }
//}