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

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * inetprot.h
  3.  *
  4.  * Internet Protocol ancestor channel 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: inetprot.h,v $
  30.  * Revision 1.14  1999/03/09 08:01:46  robertj
  31.  * Changed comments for doc++ support (more to come).
  32.  *
  33.  * Revision 1.13  1999/02/16 08:07:10  robertj
  34.  * MSVC 6.0 compatibility changes.
  35.  *
  36.  * Revision 1.12  1998/09/23 06:19:40  robertj
  37.  * Added open source copyright license.
  38.  *
  39.  * Revision 1.11  1996/09/14 13:09:13  robertj
  40.  * Major upgrade:
  41.  *   rearranged sockets to help support IPX.
  42.  *   added indirect channel class and moved all protocols to descend from it,
  43.  *   separating the protocol from the low level byte transport.
  44.  *
  45.  * Revision 1.10  1996/05/15 10:07:00  robertj
  46.  * Added access function to set intercharacter line read timeout.
  47.  *
  48.  * Revision 1.9  1996/05/09 12:14:02  robertj
  49.  * Rewrote the "unread" buffer usage and then used it to improve ReadLine() performance.
  50.  *
  51.  * Revision 1.8  1996/03/31 08:43:38  robertj
  52.  * Added version of WriteCommand() and ExecteCommand() without argument string.
  53.  *
  54.  * Revision 1.7  1996/03/16 04:35:32  robertj
  55.  * Added PString parameter version of UnRead().
  56.  * Changed lastResponseCode to an integer.
  57.  * Added ParseReponse() for splitting reponse line into code and info.
  58.  *
  59.  * Revision 1.6  1996/02/13 12:57:05  robertj
  60.  * Added access to the last response in an application socket.
  61.  *
  62.  * Revision 1.5  1996/02/03 11:33:16  robertj
  63.  * Changed RadCmd() so can distinguish between I/O error and unknown command.
  64.  *
  65.  * Revision 1.4  1996/01/23 13:08:43  robertj
  66.  * Major rewrite for HTTP support.
  67.  *
  68.  * Revision 1.3  1995/06/17 11:12:15  robertj
  69.  * Documentation update.
  70.  *
  71.  * Revision 1.2  1995/06/17 00:39:53  robertj
  72.  * More implementation.
  73.  *
  74.  * Revision 1.1  1995/06/04 13:17:16  robertj
  75.  * Initial revision
  76.  *
  77.  */
  78. #ifndef _PINTERNETPROTOCOL
  79. #define _PINTERNETPROTOCOL
  80. #ifdef __GNUC__
  81. #pragma interface
  82. #endif
  83. class PSocket;
  84. class PIPSocket;
  85. /** A TCP/IP socket for process/application layer high level protocols. All of
  86.    these protocols execute commands and responses in a standard manner.
  87.    A command consists of a line starting with a short, case insensitive command
  88.    string terminated by a space or the end of the line. This may be followed
  89.    by optional arguments.
  90.    A response to a command is usually a number and/or a short string eg "OK".
  91.    The response may be followed by additional information about the response
  92.    but this is not typically used by the protocol. It is only for user
  93.    information and may be tracked in log files etc.
  94.    All command and reponse lines of the protocol are terminated by a CR/LF
  95.    pair. A command or response line may be followed by additional data as
  96.    determined by the protocol, but this data is "outside" the protocol
  97.    specification as defined by this class.
  98.    The default read timeout is to 10 minutes by the constructor.
  99.  */
  100. class PInternetProtocol : public PIndirectChannel
  101. {
  102.   PCLASSINFO(PInternetProtocol, PIndirectChannel)
  103.   protected:
  104.     PInternetProtocol(
  105.       const char * defaultServiceName, // Service name for the protocol.
  106.       PINDEX cmdCount,                 // Number of command strings.
  107.       char const * const * cmdNames    // Strings for each command.
  108.     );
  109.     // Create an unopened TCP/IP protocol socket channel.
  110.   public:
  111.   // Overrides from class PChannel.
  112.     /** Low level read from the channel.
  113.        This override also supports the mechanism in the <A>UnRead()</A>
  114.        function allowing characters to be be "put back" into the data stream.
  115.        This allows a look-ahead required by the logic of some protocols. This
  116.        is completely independent of the standard iostream mechanisms which do
  117.        not support the level of timeout control required by the protocols.
  118.        @return
  119.        TRUE if at least len bytes were written to the channel.
  120.      */
  121.     virtual BOOL Read(
  122.       void * buf,   // Pointer to a block of memory to receive the read bytes.
  123.       PINDEX len    // Maximum number of bytes to read into the buffer.
  124.     );
  125.     /** Low level write to the channel.
  126.        This override assures that the sequence CR/LF/./CR/LF does not occur by
  127.        byte stuffing an extra '.' character into the data stream, whenever a
  128.        line begins with a '.' character.
  129.        Note that this only occurs if the member variable
  130.        <CODE>stuffingState</CODE> has been set to some value other than
  131.        <CODE>DontStuff</CODE>, usually <CODE>StuffIdle</CODE>. Also, if the
  132.        <CODE>newLineToCRLF</CODE> member variable is TRUE then all occurrences
  133.        of a 'n' character will be translated to a CR/LF pair.
  134.        @return
  135.        TRUE if at least len bytes were written to the channel.
  136.      */
  137.     virtual BOOL Write(
  138.       const void * buf, // Pointer to a block of memory to write.
  139.       PINDEX len        // Number of bytes to write.
  140.     );
  141.      /** Set the maximum timeout between characters within a line. Default
  142.         value is 10 seconds.
  143.       */
  144.      void SetReadLineTimeout(
  145.        const PTimeInterval & t
  146.      );
  147.   // New functions for class.
  148.     /** Connect a socket to a remote host for the internet protocol.
  149.        @return
  150.        TRUE if the channel was successfully connected to the remote host.
  151.      */
  152.     BOOL Connect(
  153.       const PString & address,    // Address of remote machine to connect to.
  154.       WORD port = 0               // Port number to use for the connection.
  155.     );
  156.     BOOL Connect(
  157.       const PString & address,    // Address of remote machine to connect to.
  158.       const PString & service     // Service name to use for the connection.
  159.     );
  160.     /** Accept a server socket to a remote host for the internet protocol.
  161.        @return
  162.        TRUE if the channel was successfully connected to the remote host.
  163.      */
  164.     BOOL Accept(
  165.       PSocket & listener    // Address of remote machine to connect to.
  166.     );
  167.     /** Get the default service name or port number to use in socket
  168.        connections.
  169.        @return
  170.        string for the default service name.
  171.      */
  172.     const PString & GetDefaultService() const;
  173.     /** Get the eventual socket for the series of indirect channels that may
  174.        be between the current protocol and the actual I/O channel.
  175.        This will assert if the I/O channel is not an IP socket.
  176.        @return
  177.        TRUE if the string and CR/LF were completely written.
  178.      */
  179.     PIPSocket * GetSocket() const;
  180.     /** Write a string to the socket channel followed by a CR/LF pair. If there
  181.        are any lone CR or LF characters in the <CODE>line</CODE> parameter
  182.        string, then these are translated into CR/LF pairs.
  183.        @return
  184.        TRUE if the string and CR/LF were completely written.
  185.      */
  186.     BOOL WriteLine(
  187.       const PString & line // String to write as a command line.
  188.     );
  189.     /** Read a string from the socket channel up to a CR/LF pair.
  190.     
  191.        If the <CODE>unstuffLine</CODE> parameter is set then the function will
  192.        remove the '.' character from the start of any line that begins with
  193.        two consecutive '.' characters. A line that has is exclusively a '.'
  194.        character will make the function return FALSE.
  195.        Note this function will block for the time specified by the
  196.        <A>PChannel::SetReadTimeout()</A> function for only the first character
  197.        in the line. The rest of the characters must each arrive within the time
  198.        set by the <CODE>readLineTimeout</CODE> member variable. The timeout is
  199.        set back to the original setting when the function returns.
  200.        @return
  201.        TRUE if a CR/LF pair was received, FALSE if a timeout or error occurred.
  202.      */
  203.     BOOL ReadLine(
  204.       PString & line,             // String to receive a CR/LF terminated line.
  205.       BOOL allowContinuation = FALSE  // Flag to handle continued lines.
  206.     );
  207.     /** Put back the characters into the data stream so that the next
  208.        <A>Read()</A> function call will return them first.
  209.      */
  210.     void UnRead(
  211.       int ch                // Individual character to be returned.
  212.     );
  213.     void UnRead(
  214.       const PString & str   // String to be put back into data stream.
  215.     );
  216.     void UnRead(
  217.       const void * buffer,  // Characters to be put back into data stream.
  218.       PINDEX len            // Number of characters to be returned.
  219.     );
  220.     /** Write a single line for a command. The command name for the command
  221.        number is output, then a space, the the <CODE>param</CODE> string
  222.        followed at the end with a CR/LF pair.
  223.        If the <CODE>cmdNumber</CODE> parameter is outside of the range of
  224.        valid command names, then the function does not send anything and
  225.        returns FALSE.
  226.        This function is typically used by client forms of the socket.
  227.        @return
  228.        TRUE if the command was completely written.
  229.      */
  230.     BOOL WriteCommand(
  231.       PINDEX cmdNumber       // Number of command to write.
  232.     );
  233.     BOOL WriteCommand(
  234.       PINDEX cmdNumber,      // Number of command to write.
  235.       const PString & param  // Extra parameters required by the command.
  236.     );
  237.     /** Read a single line of a command which ends with a CR/LF pair. The
  238.        command number for the command name is parsed from the input, then the
  239.        remaining text on the line is returned in the <CODE>args</CODE>
  240.        parameter.
  241.        If the command does not match any of the command names then the entire
  242.        line is placed in the <CODE>args</CODE> parameter and a value of
  243.        P_MAX_INDEX is returned.
  244.        Note this function will block for the time specified by the
  245.        <A>PChannel::SetReadTimeout()</A> function.
  246.        This function is typically used by server forms of the socket.
  247.        @return
  248.        TRUE if something was read, otherwise an I/O error occurred.
  249.      */
  250.     BOOL ReadCommand(
  251.       PINDEX & num,
  252.        // Number of the command parsed from the command line, or P_MAX_INDEX
  253.        // if no match.
  254.       PString & args  // String to receive the arguments to the command.
  255.     );
  256.     /** Write a response code followed by a text string describing the response
  257.        to a command. The form of the response is to place the code string,
  258.        then the info string.
  259.        
  260.        If the <CODE>info</CODE> parameter has multiple lines then each line
  261.        has the response code at the start. A '-' character separates the code
  262.        from the text on all lines but the last where a ' ' character is used.
  263.        The first form assumes that the response code is a 3 digit numerical
  264.        code. The second form allows for any arbitrary string to be the code.
  265.        This function is typically used by server forms of the socket.
  266.        @return
  267.        TRUE if the response was completely written.
  268.      */
  269.     BOOL WriteResponse(
  270.       unsigned numericCode, // Response code for command response.
  271.       const PString & info  // Extra information available after response code.
  272.     );
  273.     BOOL WriteResponse(
  274.       const PString & code, // Response code for command response.
  275.       const PString & info  // Extra information available after response code.
  276.     );
  277.     /** Read a response code followed by a text string describing the response
  278.        to a command. The form of the response is to have the code string,
  279.        then the info string.
  280.        
  281.        The response may have multiple lines in it. A '-' character separates
  282.        the code from the text on all lines but the last where a ' ' character
  283.        is used. The <CODE>info</CODE> parameter will have placed in it all of
  284.        the response lines separated by a single 'n' character.
  285.        The first form places the response code and info into the protected
  286.        member variables <CODE>lastResponseCode</CODE> and
  287.        <CODE>lastResponseInfo</CODE>.
  288.        This function is typically used by client forms of the socket.
  289.        @return
  290.        TRUE if the response was completely read without a socket error.
  291.      */
  292.     BOOL ReadResponse();
  293.     BOOL ReadResponse(
  294.       int & code,      // Response code for command response.
  295.       PString & info   // Extra information available after response code.
  296.     );
  297.     /** Write a command to the socket, using <CODE>WriteCommand()</CODE> and
  298.        await a response using <CODE>ReadResponse()</CODE>. The first character
  299.        of the response is returned, as well as the entire response being saved
  300.        into the protected member variables <CODE>lastResponseCode</CODE> and
  301.        <CODE>lastResponseInfo</CODE>.
  302.        This function is typically used by client forms of the socket.
  303.        @return
  304.        First character of response string or '' if a socket error occurred.
  305.      */
  306.     int ExecuteCommand(
  307.       PINDEX cmdNumber       // Number of command to write.
  308.     );
  309.     int ExecuteCommand(
  310.       PINDEX cmdNumber,      // Number of command to write.
  311.       const PString & param  // Extra parameters required by the command.
  312.     );
  313.     /** Return the code associated with the last response received by the
  314.        socket.
  315.        @return
  316.        Response code
  317.     */
  318.     int GetLastResponseCode() const;
  319.     /** Return the last response received by the socket.
  320.        @return
  321.        Response as a string
  322.     */
  323.     PString GetLastResponseInfo() const;
  324.   protected:
  325.     /** Parse a response line string into a response code and any extra info
  326.        on the line. Results are placed into the member variables
  327.        <CODE>lastResponseCode</CODE> and <CODE>lastResponseInfo</CODE>.
  328.        The default bahaviour looks for a space or a '-' and splits the code
  329.        and info either side of that character, then returns FALSE.
  330.        @return
  331.        Position of continuation character in response, 0 if no continuation
  332.        lines are possible.
  333.      */
  334.     virtual PINDEX ParseResponse(
  335.       const PString & line // Input response line to be parsed
  336.     );
  337.     PString defaultServiceName;
  338.     // Default Service name to use for the internet protocol socket.
  339.     PStringArray commandNames;
  340.     // Names of each of the command codes.
  341.     PCharArray unReadBuffer;
  342.     // Buffer for characters put back into the data stream.
  343.     PINDEX unReadCount;
  344.     // Buffer count for characters put back into the data stream.
  345.     PTimeInterval readLineTimeout;
  346.     // Time for characters in a line to be received.
  347.     enum StuffState {
  348.       DontStuff, StuffIdle, StuffCR, StuffCRLF, StuffCRLFdot, StuffCRLFdotCR
  349.     } stuffingState;
  350.     // Do byte stuffing of '.' characters in output to the socket channel.
  351.     BOOL newLineToCRLF;
  352.     // Translate n characters to CR/LF pairs.
  353.     int     lastResponseCode;
  354.     PString lastResponseInfo;
  355.     // Responses
  356.   private:
  357.     BOOL AttachSocket(PIPSocket * socket);
  358. };
  359. #endif
  360. // End Of File ///////////////////////////////////////////////////////////////