Main Page   Class Hierarchy   Compound List   File List   Compound Members  

mhtml.h

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

Generated at Tue Dec 4 19:53:25 2001 for MagiC++ by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001