⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgheaderscanner.hxx

📁 这是国外的resip协议栈
💻 HXX
字号:
#if !defined(RESIP_MSG_HEADER_SCANNER_HXX)#define RESIP_MSG_HEADER_SCANNER_HXXnamespace resip {class SipMessage;///////////////////////////////////////////////////////////////////////////////// This class scans a message header for its status line (the first non-empty// line) and then any number of field name/value pairs, terminated by an empty// line.// The message header text may be divided into arbitrary chunks.// A single instance may be used to scan any number of message headers.//// Its intended usage pattern is as follows:////     MsgHeaderScanner scanner;//     for (;;) {//       SipMessage *msg = ...//       scanner.prepareForMessage(msg);//       MsgHeaderScanner::ScanChunkResult scanChunkResult;//       do {//         (Input the next chunk of the message.)//         scanChunkResult = scanner.scanChunk(...);//       } while (scanChunkResult == MsgHeaderScanner::scrNextChunk);//       ...//     }//for//// Note that during the input of each message header chunk this class// encapsulates the full state of the message header scan, so that input may// be performed in whatever manner desired (eg without blocking).//// In this class, "multi-value" refers to associating multiple values with a// single field name by separating the individual values with commas.//// Some assertions about message headers://     Only space and tab are whitespace characters.//     A carriage return must always be followed by a line feed.//     A line feed must always be preceded by a carriage return.//     A field name always starts at the beginning of a line.//     A value may contain a line break (a carriage return / line feed pair)//         before any whitespace, but not otherwise.  (The scanner allows//         whitespace in a few extra places for simplicity.)//     A ',' within '"' pair or '<'/'>' pair does not separate multi-values.//     A '\\' is used only within a '"' pair, and not to escape a carriage//         return or line feed.//     '<'/'>' pairs do not nest, nor contain '"' pairs.//    '('/')' pair comments cannot be combined with any multi-values.//     A multi-value cannot be empty, except as needed to specify 0 multi-values.class MsgHeaderScanner{         public:      enum { MaxNumCharsChunkOverflow = 5 };      static char* allocateBuffer(int size);            enum TextPropBitMaskEnum       {         tpbmContainsLineBreak  = 1 << 0,     // '\r' or '\n', always paired         tpbmContainsWhitespace = 1 << 1,     // ' ' or '\t'         tpbmContainsBackslash  = 1 << 2,     // '\\'         tpbmContainsPercent    = 1 << 3,     // '%'         tpbmContainsSemicolon  = 1 << 4,     // ';'         tpbmContainsParen      = 1 << 5      // '(' or ')', possibly mismatched      };      typedef unsigned char TextPropBitMask;       private:          // Fields:      SipMessage *                       mMsg;      /*State*/int                       mState;      // Type defined in .cxx file.      int                                mPrevScanChunkNumSavedTextChars;      MsgHeaderScanner::TextPropBitMask  mTextPropBitMask;      const char *                       mFieldName;      unsigned int                       mFieldNameLength;      int                                mFieldKind;      /*        "mState" and "mPrevScanChunkNumSavedTextChars" are meaningful only between        input chunks.        "mTextPropBitMask" is meaningful only between input chunks and only when        scanning a field name or value.        "mFieldName", "mFieldNameLength", and "mFieldKind" are meaningful only        between terminating a field name and finding the termination of its value.      */       public:          MsgHeaderScanner();          // Destructor: defined implicitly      void prepareForMessage(SipMessage *  msg);      // allow proper parsing of message/sipfrag & msg/external      // presence of start line is determined in SipFrag      void prepareForFrag(SipMessage *  msg, bool hasStartLine);             enum ScanChunkResult {         scrEnd,       // Message header scan ended.         scrNextChunk, // Another chunk is needed.         scrError      // The message header is in error.      };          //       The meaning of "*unprocessedCharPtr" depends on the result:      //       scrEnd:       The character that terminates the message header.      //       scrError:     The erroneous character.      //       scrNextChunk: The first character of some incomplete text unit.  The      //       remaining portion of the old chunk must be placed      //       in the beginning of the new chunk.      //       This method writes a sentinel in the chunk's terminal character.      MsgHeaderScanner::ScanChunkResult scanChunk(char * chunk,                                                  unsigned int chunkLength,                                                  char **unprocessedCharPtr);           // !ah! DEBUG only, write to fd.      // !ah! for documentation generation      static int dumpStateMachine(int fd);    private:      // Copy constructor: declared but not defined      MsgHeaderScanner(const MsgHeaderScanner & from);      // Assignment: declared but not defined      MsgHeaderScanner & operator=(const MsgHeaderScanner & from);      // Automatically called when 1st MsgHeaderScanner constructed.      bool initialize();      static bool mInitialized;};///////////////////////////////////////////////////////////////////////////////} // namespace resip#endif/* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -