Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

mhtml.h

Go to the documentation of this file.
00001 
00002 
00003 // © Copyright Marko Grönroos 1996, all rights reserved.                     //
00004 // Omistusoikeus Marko Grönroos, 1996, kaikki oikeudet pidätetään.           //
00005 //   Tämän tiedoston kopiointi, lukeminen ja käyttö ja erityisesti tämän     //
00006 // ilmoitustekstin muuttaminen on kiellettyä ilman asianmukaista lupaa.      //
00007 //                                                                           //
00008 //                                             Marko Grönroos (magi@utu.fi)  //
00010 
00011 // mhtml.h
00012 //- Tukioperaatiot HTML-sivuille.
00013 
00014 #ifndef HTML_H
00015 #define HTML_H
00016 
00017 #include "magic/mobject.h"
00018 #include "magic/mmap.h"
00019 
00020 BEGIN_NAMESPACE (MagiC);
00021 
00022 // HTML-kutsu. Näitä objekteja ei sitten mielellään saa luoda enempää
00023 // kuin yhden instanssin, siis erityisesti jos method = POST.
00024 class HTMLQuery : public Object {
00025     decl_dynamic (HTMLQuery);
00026   public:
00027 
00028     int     contlen;    // CONTENT_LENGTH
00029     String  contype;    // CONTENT_TYPE
00030     String  docroot;    // DOCUMENT_ROOT
00031     String  gwif;       // GATEWAY_INTERFACE = "cgi/1.1"
00032     String  hosttype;   // HOSTTYPE = "i386" | ...
00033     String  httpaccpt;  // HTTP_ACCEPT = "*/*, image/gif, image/jpeg, ..."
00034     String  httppragma; // HTTP_PRAGMA = "no-cache" | ...
00035     String  useragent;  // HTTP_USER_AGENT = "Mozilla xxxx" | ...
00036     String  pathinfo;   // PATH_INFO
00037     String  pathtrans;  // PATH_TRANSLATED
00038     String  querystr;   // QUERY_STRING
00039     String  remaddr;    // REMOTE_ADDR = "ip.ip.ip.ip"
00040     String  remhost;    // REMOTE_HOST = "name.address.some.where"
00041     String  method;     // REQUEST_METHOD = "GET" | "POST"
00042     String  sptname;    // SCRIPT_NAME
00043     String  srvname;    // SERVER_NAME = "address.of.local.host"
00044     int     srvport;    // SERVER_PORT = "80", ...
00045     String  srvprot;    // SERVER_PROTOCOL = "http/1.0"
00046     String  srvsoft;    // SERVER_SOFTWARE
00047 
00048     Map<String,String>  query;  // QUERY_STRING pilkotussa muodossa
00049 
00050     // Konstruktori lukee objektin kentät ympäristömuuttujista
00051                     HTMLQuery   ();
00052 
00053     // Sokerointi QUERY_STRING-mapin arvojen noudolle
00054     const String&   operator [] (const String& key) const {return query[key];}
00055 
00056     // Tulostaa kyselyn kenttiä vastaavat piilotetut INPUT-kentät
00057     void            printhidden () const;
00058 
00059     // Sivuvaihde. Lukee PATH_INFO-parametrin arvon (esim. "sivu.html"
00060     // ja kutsuu sen mukaan luokan "sivu_html" metodia printqry. Katso
00061     // alla HTMLPageBase- ja HTMLPage-luokkia.
00062     virtual void    any         ();
00063 
00064     // Kuten yllä, mutta kutsuu tietyn nimistä sivu-luokka-metodia
00065     int             call        (const String& pagename);
00066 };
00067 
00068 
00069 class HTMLPageBase : public Object {
00070     decl_dynamic (HTMLPageBase);
00071 
00072   public:
00073                     HTMLPageBase    () {;}
00074 
00075     // Hook-operaatio, jonka käyttäjän tulisi overloadata.
00076     // HTMLPage-makro paketoi tämän kaiken kauniiseen pakettiin
00077     virtual void    printqry        (HTMLQuery& qry) {
00078         content ();
00079         title ("Error");
00080         printf ("<H1>Error - no print method in page handler</H1>\n");
00081     }
00082 
00083     // Tulostaa Content-type-otsikon
00084     void            content         (const char* str="text/html") {
00085         printf ("Content-type: text/html\n\n");
00086     }
00087 
00088     // Tulostaa sivun otsikon
00089     void            title           (const char* str) const {
00090         printf ("<TITLE>%s</TITLE>\n", str);
00091     }
00092 };
00093 
00094 //- Alleoleva luokka on siis makro, jota kutsutaan:
00095 //- HTMLPage(CLASS,APPCLASS) { ... }
00096 //- Tässä "funktiossa" on parametri 'query', joka on tyyppiä APPCLASS.
00097 //- Tätä "funktiota" kutsutaan kun saadaan kutsu "funktio.html", ja
00098 //- CLASS-parametri on funktio_html.
00099 //- Hieman monimutkaista, eh?
00100 
00101 #define HTMLPage(CLASS,APPCLASS) \
00102 class CLASS : public HTMLPageBase {\
00103     decl_dynamic (CLASS);\
00104   public:\
00105                     CLASS       () {;}\
00106     void            print       (APPCLASS& app);\
00107     void            printqry    (HTMLQuery& qry) {\
00108         if (APPCLASS* app = dynamic_cast<APPCLASS*>(&qry))\
00109             print (*app);\
00110     }\
00111 };\
00112 impl_dynamic (CLASS, "HTMLPageBase");\
00113 void CLASS::print (APPCLASS& query)
00114 
00115 
00116 #define ASSERTHTML(expr,message) {if (!(expr)) {cout << "Content-type: text/html\n\n<H3>%ERR: Violation of assertion at " << __FILE__ << "[" << __LINE__ << "].</H3>\n%ERR: " << message << "\n"; exit (2);}}
00117 
00118 #define DIEHTML(message) {cout << "Content-type: text/html\n\n<H3>%ERR: Unconditional death at " << __FILE__ << "[" << __LINE__ << "].</H3>\n%ERR: " << message << "\n"; exit (2);}
00119 
00120 END_NAMESPACE;
00121 
00122 #endif
00123 

Generated on Thu Feb 10 20:06:41 2005 for LibMagiC by doxygen1.2.18