httpsvc.h
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:14k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * httpsvc.h
  3.  *
  4.  * Common classes for service applications using HTTP as the user interface.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: httpsvc.h,v $
  30.  * Revision 1.27  1999/02/16 08:07:10  robertj
  31.  * MSVC 6.0 compatibility changes.
  32.  *
  33.  * Revision 1.26  1998/11/30 02:50:50  robertj
  34.  * New directory structure
  35.  *
  36.  * Revision 1.25  1998/10/29 11:58:51  robertj
  37.  * Added ability to configure the HTTP threads stack size.
  38.  *
  39.  * Revision 1.24  1998/09/23 06:19:34  robertj
  40.  * Added open source copyright license.
  41.  *
  42.  * Revision 1.23  1998/04/01 01:56:47  robertj
  43.  * Added PServiceHTTPFile constructor so file path and URL can be different.
  44.  *
  45.  * Revision 1.22  1998/03/20 03:16:09  robertj
  46.  * Added special classes for specific sepahores, PMutex and PSyncPoint.
  47.  *
  48.  * Revision 1.21  1998/03/17 10:16:00  robertj
  49.  * Allowed registration page to have HTML override.
  50.  *
  51.  * Revision 1.20  1998/02/16 00:15:13  robertj
  52.  * Major rewrite of application info passed in PHTTPServiceProcess constructor.
  53.  *
  54.  * Revision 1.19  1998/01/26 00:28:32  robertj
  55.  * Removed POrderPage completely from httpsvc.
  56.  * Added PHTTPAuthority to PHTTPServiceString constructor.
  57.  * Added option flags to ProcessMacros to automatically load from file etc.
  58.  *
  59.  * Revision 1.18  1997/11/10 12:40:05  robertj
  60.  * Changed SustituteEquivalSequence so can override standard macros.
  61.  *
  62.  * Revision 1.17  1997/11/04 06:02:56  robertj
  63.  * Allowed help gif file name to overridable in PServiceHTML, so can be in subdirectory.
  64.  *
  65.  * Revision 1.16  1997/10/30 10:22:35  robertj
  66.  * Added ability to customise regisration text by application.
  67.  *
  68.  * Revision 1.15  1997/08/28 13:56:34  robertj
  69.  * Fixed bug where HTTP directory was not processed for macros.
  70.  *
  71.  * Revision 1.13  1997/08/20 08:48:18  craigs
  72.  * Added PHTTPServiceDirectory & PHTTPServiceString
  73.  *
  74.  * Revision 1.12  1997/07/26 11:38:18  robertj
  75.  * Support for overridable pages in HTTP service applications.
  76.  *
  77.  * Revision 1.11  1997/06/16 14:12:55  robertj
  78.  * Changed private to protected.
  79.  *
  80.  * Revision 1.10  1997/06/16 13:20:14  robertj
  81.  * Fixed bug where PHTTPThread crashes on exit.
  82.  *
  83.  * Revision 1.9  1997/03/02 03:42:19  robertj
  84.  * Added error logging to standard HTTP Service HTTP Server.
  85.  * Removed extraneous variables that set GIF file size to zero.
  86.  *
  87.  * Revision 1.8  1997/02/05 11:54:52  robertj
  88.  * Added support for order form page overridiing.
  89.  *
  90.  * Revision 1.7  1997/01/27 10:22:33  robertj
  91.  * Numerous changes to support OEM versions of products.
  92.  *
  93.  * Revision 1.6  1996/11/04 03:55:20  robertj
  94.  * Changed to accept separate copyright and manufacturer strings.
  95.  *
  96.  * Revision 1.5  1996/09/14 13:09:12  robertj
  97.  * Major upgrade:
  98.  *   rearranged sockets to help support IPX.
  99.  *   added indirect channel class and moved all protocols to descend from it,
  100.  *   separating the protocol from the low level byte transport.
  101.  *
  102.  * Revision 1.4  1996/08/19 13:43:46  robertj
  103.  * Fixed race condition in system restart logic.
  104.  *
  105.  * Revision 1.3  1996/08/08 13:36:38  robertj
  106.  * Fixed Registation page so no longer has static link, ie can be DLLed.
  107.  *
  108.  * Revision 1.2  1996/06/28 13:15:39  robertj
  109.  * Moved HTTP form resource to another compilation module.
  110.  *
  111.  * Revision 1.1  1996/06/13 13:33:14  robertj
  112.  * Initial revision
  113.  *
  114.  */
  115. #ifndef APPCOMM_H
  116. #define APPCOMM_H
  117. #include <ptclib/httpform.h>
  118. #include <ptlib/svcproc.h>
  119. #include <ptclib/cypher.h>
  120. /////////////////////////////////////////////////////////////////////
  121. class PHTTPServiceProcess : public PServiceProcess
  122. {
  123.   PCLASSINFO(PHTTPServiceProcess, PServiceProcess)
  124.   public:
  125.     enum {
  126.       MaxSecuredKeys = 10
  127.     };
  128.     struct Info {
  129.       const char * productName;
  130.       const char * manufacturerName;
  131.       WORD majorVersion;
  132.       WORD minorVersion;
  133.       CodeStatus buildStatus;    // AlphaCode, BetaCode or ReleaseCode
  134.       WORD buildNumber;
  135.       const char * compilationDate;
  136.       PTEACypher::Key productKey;  // Poduct key for registration
  137.       const char * securedKeys[MaxSecuredKeys]; // Product secured keys for registration
  138.       PINDEX securedKeyCount;
  139.       PTEACypher::Key signatureKey;   // Signature key for encryption of HTML files
  140.       const char * manufHomePage; // WWW address of manufacturers home page
  141.       const char * email;         // contact email for manufacturer
  142.       const char * productHTML;   // HTML for the product name, if NULL defaults to
  143.                                   //   the productName variable.
  144.       const char * gifHTML;       // HTML to show GIF image in page headers, if NULL
  145.                                   //   then the following are used to build one
  146.       const char * gifFilename;   // File name for the products GIF file
  147.       int gifWidth;               // Size of GIF image, if zero then none is used
  148.       int gifHeight;              //   in the generated HTML.
  149.     };
  150.     PHTTPServiceProcess(const Info & inf);
  151.     ~PHTTPServiceProcess();
  152.     virtual void OnConfigChanged() = 0;
  153.     virtual BOOL Initialise(const char * initMsg) = 0;
  154.     BOOL ListenForHTTP(WORD port, PINDEX stackSize = 0x4000);
  155.     BOOL ListenForHTTP(PSocket * listener, PINDEX stackSize = 0x4000);
  156.     virtual PString GetPageGraphic();
  157.     void GetPageHeader(PHTML &);
  158.     void GetPageHeader(PHTML &, const PString & title);
  159.     virtual PString GetCopyrightText();
  160.     const PTime & GetCompilationDate() const { return compilationDate; }
  161.     const PString & GetHomePage() const { return manufacturersHomePage; }
  162.     const PString & GetEMailAddress() const { return manufacturersEmail; }
  163.     const PString & GetProductName() const { return productNameHTML; }
  164.     const PTEACypher::Key & GetProductKey() const { return productKey; }
  165.     const PStringArray & GetSecuredKeys() const { return securedKeys; }
  166.     const PTEACypher::Key & GetSignatureKey() const { return signatureKey; }
  167.     static PHTTPServiceProcess & Current();
  168.     virtual void AddRegisteredText(PHTML & html);
  169.     virtual void AddUnregisteredText(PHTML & html);
  170.     virtual BOOL SubstituteEquivalSequence(PHTTPRequest & request, const PString &, PString &);
  171.   protected:
  172.     PSocket  * httpListeningSocket;
  173.     PHTTPSpace httpNameSpace;
  174.     PTEACypher::Key productKey;
  175.     PStringArray    securedKeys;
  176.     PTEACypher::Key signatureKey;
  177.     PTime      compilationDate;
  178.     PString    manufacturersHomePage;
  179.     PString    manufacturersEmail;
  180.     PString    productNameHTML;
  181.     PString    gifHTML;
  182.     void ShutdownListener();
  183.     void BeginRestartSystem();
  184.     void CompleteRestartSystem();
  185.     PThread *  restartThread;
  186.     PSyncPoint httpThreadClosed;
  187.   friend class PConfigPage;
  188.   friend class PConfigSectionsPage;
  189.   friend class PHTTPServiceThread;
  190. };
  191. /////////////////////////////////////////////////////////////////////
  192. class PHTTPServiceThread : public PThread
  193. {
  194.   PCLASSINFO(PHTTPServiceThread, PThread)
  195.   public:
  196.     PHTTPServiceThread(PINDEX stackSize,
  197.                        PHTTPServiceProcess & app,
  198.                        PSocket & listeningSocket,
  199.                        PHTTPSpace & http);
  200.     void Main();
  201.   protected:
  202.     PHTTPServiceProcess & process;
  203.     PSocket & listener;
  204.     PHTTPSpace & httpNameSpace;
  205.     PINDEX myStackSize;
  206. };
  207. /////////////////////////////////////////////////////////////////////
  208. class PConfigPage : public PHTTPConfig
  209. {
  210.   PCLASSINFO(PConfigPage, PHTTPConfig)
  211.   public:
  212.     PConfigPage(
  213.       PHTTPServiceProcess & app,
  214.       const PString & section,
  215.       const PHTTPAuthority & auth
  216.     );
  217.     PConfigPage(
  218.       PHTTPServiceProcess & app,
  219.       const PString & title,
  220.       const PString & section,
  221.       const PHTTPAuthority & auth
  222.     );
  223.     void OnLoadedText(PHTTPRequest &, PString & text);
  224.     BOOL OnPOST(
  225.       PHTTPServer & server,
  226.       const PURL & url,
  227.       const PMIMEInfo & info,
  228.       const PStringToString & data,
  229.       const PHTTPConnectionInfo & connectInfo
  230.     );
  231.     virtual BOOL Post(
  232.       PHTTPRequest & request,       // Information on this request.
  233.       const PStringToString & data, // Variables in the POST data.
  234.       PHTML & replyMessage          // Reply message for post.
  235.     );
  236.   protected:
  237.     virtual BOOL GetExpirationDate(
  238.       PTime & when          // Time that the resource expires
  239.     );
  240.     PHTTPServiceProcess & process;
  241. };
  242. /////////////////////////////////////////////////////////////////////
  243. class PConfigSectionsPage : public PHTTPConfigSectionList
  244. {
  245.   PCLASSINFO(PConfigSectionsPage, PHTTPConfigSectionList)
  246.   public:
  247.     PConfigSectionsPage(
  248.       PHTTPServiceProcess & app,
  249.       const PURL & url,
  250.       const PHTTPAuthority & auth,
  251.       const PString & prefix,
  252.       const PString & valueName,
  253.       const PURL & editSection,
  254.       const PURL & newSection,
  255.       const PString & newTitle,
  256.       PHTML & heading
  257.     );
  258.     void OnLoadedText(PHTTPRequest &, PString & text);
  259.     BOOL OnPOST(
  260.       PHTTPServer & server,
  261.       const PURL & url,
  262.       const PMIMEInfo & info,
  263.       const PStringToString & data,
  264.       const PHTTPConnectionInfo & connectInfo
  265.     );
  266.     virtual BOOL Post(
  267.       PHTTPRequest & request,       // Information on this request.
  268.       const PStringToString & data, // Variables in the POST data.
  269.       PHTML & replyMessage          // Reply message for post.
  270.     );
  271.   protected:
  272.     virtual BOOL GetExpirationDate(
  273.       PTime & when          // Time that the resource expires
  274.     );
  275.     PHTTPServiceProcess & process;
  276. };
  277. /////////////////////////////////////////////////////////////////////
  278. class PRegisterPage : public PConfigPage
  279. {
  280.   PCLASSINFO(PRegisterPage, PConfigPage)
  281.   public:
  282.     PRegisterPage(
  283.       PHTTPServiceProcess & app,
  284.       const PHTTPAuthority & auth
  285.     );
  286.     PString LoadText(
  287.       PHTTPRequest & request        // Information on this request.
  288.     );
  289.     void OnLoadedText(PHTTPRequest & request, PString & text);
  290.     virtual BOOL Post(
  291.       PHTTPRequest & request,       // Information on this request.
  292.       const PStringToString & data, // Variables in the POST data.
  293.       PHTML & replyMessage          // Reply message for post.
  294.     );
  295.     virtual void AddFields(
  296.       const PString & prefix        // Prefix on field names
  297.     ) = 0;
  298.   protected:
  299.     PHTTPServiceProcess & process;
  300. };
  301. /////////////////////////////////////////////////////////////////////S
  302. class PServiceHTML : public PHTML
  303. {
  304.   PCLASSINFO(PServiceHTML, PHTML)
  305.   public:
  306.     PServiceHTML(const char * title,
  307.                  const char * help = NULL,
  308.                  const char * helpGif = "help.gif");
  309.     PString ExtractSignature(PString & out);
  310.     static PString ExtractSignature(const PString & html,
  311.                                     PString & out,
  312.                                     const char * keyword = "#equival");
  313.     PString CalculateSignature();
  314.     static PString CalculateSignature(const PString & out);
  315.     static PString CalculateSignature(const PString & out, const PTEACypher::Key & sig);
  316.     BOOL CheckSignature();
  317.     static BOOL CheckSignature(const PString & html);
  318.     enum MacroOptions {
  319.       NoOptions           = 0,
  320.       NeedSignature       = 1,
  321.       LoadFromFile        = 2,
  322.       NoURLOverride       = 4,
  323.       NoSignatureForFile  = 8
  324.     };
  325.     static BOOL ProcessMacros(PHTTPRequest & request,
  326.                               PString & text,
  327.                               const PString & filename,
  328.                               unsigned options);
  329. };
  330. ///////////////////////////////////////////////////////////////
  331. class PServiceHTTPString : public PHTTPString
  332. {
  333.   PCLASSINFO(PServiceHTTPString, PHTTPString)
  334.   public:
  335.     PServiceHTTPString(const PURL & url, const PString & string)
  336.       : PHTTPString(url, string) { }
  337.     PServiceHTTPString(const PURL & url, const PString & string, const PHTTPAuthority & auth)
  338.       : PHTTPString(url, string, auth) { }
  339.     PString LoadText(PHTTPRequest &);
  340. };
  341. class PServiceHTTPFile : public PHTTPFile
  342. {
  343.   PCLASSINFO(PServiceHTTPFile, PHTTPFile)
  344.   public:
  345.     PServiceHTTPFile(const PString & filename, BOOL needSig = FALSE)
  346.       : PHTTPFile(filename) { needSignature = needSig; }
  347.     PServiceHTTPFile(const PString & filename, const PFilePath & file, BOOL needSig = FALSE)
  348.       : PHTTPFile(filename, file) { needSignature = needSig; }
  349.     PServiceHTTPFile(const PString & filename, const PHTTPAuthority & auth, BOOL needSig = FALSE)
  350.       : PHTTPFile(filename, auth) { needSignature = needSig; }
  351.     void OnLoadedText(PHTTPRequest &, PString & text);
  352.   protected:
  353.     BOOL needSignature;
  354. };
  355. class PServiceHTTPDirectory : public PHTTPDirectory
  356. {
  357.   PCLASSINFO(PServiceHTTPDirectory, PHTTPDirectory)
  358.   public:
  359.     PServiceHTTPDirectory(const PURL & url, const PDirectory & dirname, BOOL needSig = FALSE)
  360.       : PHTTPDirectory(url, dirname) { needSignature = needSig; }
  361.     PServiceHTTPDirectory(const PURL & url, const PDirectory & dirname, const PHTTPAuthority & auth, BOOL needSig = FALSE)
  362.       : PHTTPDirectory(url, dirname, auth) { needSignature = needSig; }
  363.     void OnLoadedText(PHTTPRequest &, PString & text);
  364.   protected:
  365.     BOOL needSignature;
  366. };
  367. #endif