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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * svcproc.h
  3.  *
  4.  * Service Process (daemon) class.
  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: svcproc.h,v $
  30.  * Revision 1.18  1999/09/21 08:20:16  robertj
  31.  * Fixed name space problem with PSYSTEMLOG() macro.
  32.  *
  33.  * Revision 1.17  1999/09/13 13:15:06  robertj
  34.  * Changed PTRACE so will output to system log in PServiceProcess applications.
  35.  *
  36.  * Revision 1.16  1999/03/09 02:59:51  robertj
  37.  * Changed comments to doc++ compatible documentation.
  38.  *
  39.  * Revision 1.15  1999/02/16 08:11:17  robertj
  40.  * MSVC 6.0 compatibility changes.
  41.  *
  42.  * Revision 1.14  1998/10/13 14:06:15  robertj
  43.  * Complete rewrite of memory leak detection code.
  44.  *
  45.  * Revision 1.13  1998/09/23 06:21:31  robertj
  46.  * Added open source copyright license.
  47.  *
  48.  * Revision 1.12  1998/04/07 13:33:21  robertj
  49.  * Changed startup code to support PApplication class.
  50.  *
  51.  * Revision 1.11  1998/03/29 06:16:50  robertj
  52.  * Rearranged initialisation sequence so PProcess descendent constructors can do "things".
  53.  *
  54.  * Revision 1.10  1998/02/16 00:13:16  robertj
  55.  * Added tray icon support.
  56.  *
  57.  * Revision 1.9  1998/02/03 06:19:14  robertj
  58.  * Added extra log levels.
  59.  *
  60.  * Revision 1.8  1997/07/08 13:02:32  robertj
  61.  * DLL support.
  62.  *
  63.  * Revision 1.7  1997/02/05 11:51:15  robertj
  64.  * Changed current process function to return reference and validate objects descendancy.
  65.  *
  66.  * Revision 1.6  1996/08/19 13:39:20  robertj
  67.  * Added "Debug" level to system log.
  68.  * Moved PSYSTEMLOG macro to common code.
  69.  * Changed PSYSTEMLOG macro so does not execute << expression if below debug level.
  70.  * Fixed memory leak in PSystemLog stream buffer.
  71.  *
  72.  * Revision 1.5  1996/08/17 10:00:27  robertj
  73.  * Changes for Windows DLL support.
  74.  *
  75.  * Revision 1.4  1996/08/09 11:16:53  robertj
  76.  * Moved log macro to platform dependent header.
  77.  *
  78.  * Revision 1.3  1996/07/30 12:24:13  robertj
  79.  * Added SYSTEMLOG macro for GNU compiler compatibility.
  80.  *
  81.  * Revision 1.2  1996/07/27 04:10:06  robertj
  82.  * Changed SystemLog to be stream based rather than printf based.
  83.  *
  84.  * Revision 1.1  1995/12/23 03:47:25  robertj
  85.  * Initial revision
  86.  *
  87.  * Revision 1.3  1995/12/10 11:50:05  robertj
  88.  * Numerous fixes for WIN32 service processes.
  89.  *
  90.  * Revision 1.2  1995/07/02 01:23:27  robertj
  91.  * Set up service process to be in subthread not main thread.
  92.  *
  93.  * Revision 1.1  1995/06/17 00:50:54  robertj
  94.  * Initial revision
  95.  *
  96.  */
  97. #define _PSERVICEPROCESS
  98. #ifdef __GNUC__
  99. #pragma interface
  100. #endif
  101. /** This class abstracts the operating system dependent error logging facility.
  102. To send messages to the system error log, the PSYSTEMLOG macro should be used. 
  103.   */
  104. class PSystemLog : public PObject, public iostream {
  105.   PCLASSINFO(PSystemLog, PObject);
  106.   public:
  107.   /**@name Construction */
  108.   //@{
  109.     /// define the different error log levels
  110.     enum Level {
  111.       /// Log from standard error stream
  112.       StdError = -1,
  113.       /// Log a fatal error
  114.       Fatal,   
  115.       /// Log a non-fatal error
  116.       Error,    
  117.       /// Log a warning
  118.       Warning,  
  119.       /// Log general information
  120.       Info,     
  121.       /// Log debugging information
  122.       Debug,    
  123.       /// Log more debugging information
  124.       Debug2,   
  125.       /// Log even more debugging information
  126.       Debug3,   
  127.       NumLogLevels
  128.     };
  129.     /// Create a system log stream
  130.     PSystemLog(
  131.      Level level   /// only messages at this level or higher will be logged
  132.     ) { logLevel = level; buffer.log = this; init(&buffer); }
  133.     /// Destroy the string stream, deleting the stream buffer
  134.     ~PSystemLog() { flush(); }
  135.   //@}
  136.   /**@name Output functions */
  137.   //@{
  138.     /** Log an error into the system log.
  139.      */
  140.     static void Output(
  141.       Level level,      /// Log level for this log message.
  142.       const char * msg  /// Message to be logged
  143.     );
  144.   //@}
  145.   /**@name Miscellaneous functions */
  146.   //@{
  147.     /** Set the level at which errors are logged. Only messages higher than or
  148.        equal to the specified level will be logged.
  149.       */
  150.     void SetLevel(
  151.       Level level  /// New log level
  152.     ) { logLevel = level; }
  153.     /** Get the current level for logging.
  154.        @return
  155.        Log level.
  156.      */
  157.     Level GetLevel() const { return logLevel; }
  158.   //@}
  159.   private:
  160.     PSystemLog(const PSystemLog &) { }
  161.     PSystemLog & operator=(const PSystemLog &) { return *this; }
  162.     class Buffer : public streambuf {
  163.       public:
  164.         virtual int overflow(int=EOF);
  165.         virtual int underflow();
  166.         virtual int sync();
  167.         PSystemLog * log;
  168.         PString string;
  169.     } buffer;
  170.     friend class Buffer;
  171.     Level logLevel;
  172. };
  173. /** Log a message to the system log.
  174. The current log level is checked and if allowed, the second argument is evaluated
  175. as a stream output sequence which is them output to the system log.
  176. */
  177. #define PSYSTEMLOG(level, variables) 
  178.   if (PServiceProcess::Current().GetLogLevel() >= PSystemLog::level) { 
  179.     PSystemLog P_systemlog(PSystemLog::level); 
  180.     P_systemlog << variables; 
  181.   } else (void)0
  182. /** A process type that runs as a "background" service.
  183.     This may be a service under the Windows NT operating system, or a "daemon" under Unix, or a hidden application under Windows.
  184.  */
  185. class PServiceProcess : public PProcess
  186. {
  187.   PCLASSINFO(PServiceProcess, PProcess);
  188.   public:
  189.   /**@name Construction */
  190.   //@{
  191.     /** Create a new service process.
  192.      */
  193.     PServiceProcess(
  194.       const char * manuf,   /// Name of manufacturer
  195.       const char * name,    /// Name of product
  196.       WORD majorVersion,    /// Major version number of the product
  197.       WORD minorVersion,    /// Minor version number of the product
  198.       CodeStatus status,    /// Development status of the product
  199.       WORD buildNumber      /// Build number of the product
  200.     );
  201.   //@}
  202.   /**@name Callback functions */
  203.   //@{
  204.     /** Called when the service is started. This typically initialises the
  205.        service and returns TRUE if the service is ready to run. The
  206.        #Main()# function is then executed.
  207.        @return
  208.        TRUE if service may start, FALSE if an initialisation failure occurred.
  209.      */
  210.     virtual BOOL OnStart() = 0;
  211.     /** Called by the system when the service is stopped. One return from this
  212.        function there is no guarentee that any more user code will be executed.
  213.        Any cleaning up or closing of resource must be done in here.
  214.      */
  215.     virtual void OnStop();
  216.     /** Called by the system when the service is to be paused. This will
  217.        suspend any actions that the service may be executing. Usually this is
  218.        less expensive in resource allocation etc than stopping and starting
  219.        the service.
  220.        @return
  221.        TRUE if the service was successfully paused.
  222.      */
  223.     virtual BOOL OnPause();
  224.     /** Resume after the service was paused.
  225.      */
  226.     virtual void OnContinue();
  227.     /** The Control menu option was used in the SysTray menu.
  228.      */
  229.     virtual void OnControl() = 0;
  230.   //@}
  231.   /**@name Miscellaneous functions */
  232.   //@{
  233.     /** Get the current service process object.
  234.        @return
  235.        Pointer to service process.
  236.      */
  237.     static PServiceProcess & Current();
  238.     /** Set the level at which errors are logged. Only messages higher than or
  239.        equal to the specified level will be logged.
  240.     
  241.        The default is #LogError# allowing fatal errors and ordinary
  242.        errors to be logged and warning and information to be ignored.
  243.        If in debug mode then the default is #LogInfo# allowing all
  244.        messages to be displayed.
  245.      */
  246.     void SetLogLevel(
  247.       PSystemLog::Level level  /// New log level
  248.     ) { currentLogLevel = level; }
  249.     /** Get the current level for logging.
  250.        @return
  251.        Log level.
  252.      */
  253.     PSystemLog::Level GetLogLevel() const { return currentLogLevel; }
  254.   //@}
  255.     /* Internal initialisation function called directly from
  256.        #main()#. The user should never call this function.
  257.      */
  258.     virtual int _main(void * arg = NULL);
  259.   protected:
  260.   // Member variables
  261.     /// Flag to indicate service is run in simulation mode.
  262.     BOOL debugMode;
  263.     /// Current log level for #PSYSTEMLOG# calls.
  264.     PSystemLog::Level currentLogLevel;
  265.     friend void PSystemLog::Output(PSystemLog::Level, const char *);
  266. #ifdef DOC_PLUS_PLUS
  267. };
  268. #endif
  269. // Class declaration continued in platform specific header file ///////////////