Newer
Older
Sunfish / Sunfish / uHttp.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Drawing;
using XWolf;


namespace Umbrella
{
    class uHttp : HttpServerProcessor
    {
        static byte[] logo;

        static uHttp(){
            MemoryStream ms=new MemoryStream();
            Properties.Resources.logo.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            ms.Close();
            logo = ms.ToArray();
        }

        private void Header()
        {
            Write("<html><head><title>Umbrella</title>");
            Write("<style>body,td{font-family:Tahoma;font-size:14px}.bix{font-size:100px}.error{color:red}</style>");
            Write("</head><body background='bg'><table align='center'><tr><td><img src='logo'></td><td class='bix'>Umbrella<small><small><small><small><small><small>" + Program.version + "</td></tr>");
            Write("<tr height='3'><td colspan=2 bgcolor=black></td></tr></table><center>");
#if TRACE
            Write(" TRACE ");
#endif
#if DEBUG
            Write(" DEBUG ");
#endif
            Write("</center><p><table width='600px' align='center'><tr><td width='150px' valign='top'>");
            //Listado servicios
            Write("<table width='100%' height='100%' style='border-right:1px dotted #CCCCCC'><tr><td bgcolor='#EEEEEE'>Servicios:</td></tr>");
            foreach (uService serv in uServices.Services)
            {
                Write("<tr><td align='right'><a href='" + serv.spath + "'>" + serv.Name + "</td></tr>");
            }
            Write("</table></td><td>");
        }

        private void Foot()
        {
            Out.Write("</td></tr></table></body></html>");
        }

        override protected void Process(){
            try
            {
                if (Path.StartsWith("/service_"))
                {
                    doService(Path.Substring(1));
                    return;
                }
            }
            catch (Exception e)
            {
                doError(e);
                return;
            }
            switch (Path.ToLower())
            {
                case "/":
                    doHome();
                    break;
                case "/favicon.ico":
                    doFavicon();
                    break;
                case "/logo":
                    doLogo();
                    break;
                case "/bg":
                    doBack();
                    break;
                default:
                    Error404();
                    break;
            }
        }

        private void doHome()
        {
            Header();
            
            
           
            //misc
            Foot();
        }

        private void doService(string srid)
        {
            uService srv=uServices.ByPath(srid);
            if (srv == null)
                throw new Exception("No existe el servicio");
            if (srv.Acciona(this))
                doGo(Path);
            else
            {
                 srv.setPath(srid);
                 if (srv.rsubpath == "")
                 {
                     Header();
                     srv.Execute();
                     Foot();
                 }
                 else if (srv.rsubpathbin)
                     srv.Execute(srv.rsubpath);
                 else
                 {
                     Header();
                     srv.Execute(srv.rsubpath);
                     Foot();
                 }
            }
        }

        private void doError(Exception e)
        {
            Header();
            Write("<span class='error'>"+e.GetType().FullName+": "+e.Message+"</span><p><small><small>");
            Write(nl2br(e.StackTrace));
            Write("</small></small><hr><center><a href='/'>Indice</a>");
            Foot();
        }

        private void doFavicon()
        {
            Response.Headers[HttpResponseHeader.ContentType] = "image/vnd.microsoft.icon";
            MemoryStream ms=new MemoryStream();
            Properties.Resources.ico.Save(ms);
            Write(ms.ToArray());
            ms.Close();
        }

        private void doBack()
        {
            Response.Headers[HttpResponseHeader.ContentType] = "image/jpeg";
            Write(loadBG());
        }

        private void doLogo()
        {
            Response.Headers[HttpResponseHeader.ContentType] = "image/png";
            Write(logo);
        }

        private void doGo(string href)
        {
            Write("<script>document.location='" + href + "';</script>");
        }

        private byte[] loadBG()
        {
            MemoryStream ms = new MemoryStream();
            Properties.Resources.ubg.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            ms.Close();
            return ms.ToArray();
        }
    }
}