📄 msgheaderscanner.hxx
字号:
#if !defined(RESIP_MSG_HEADER_SCANNER_HXX)
#define RESIP_MSG_HEADER_SCANNER_HXX
namespace 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 + -