Logo Search packages:      
Sourcecode: sofia-sip version File versions  Download package

msg_mclass.h

Go to the documentation of this file.
/*
 * This file is part of the Sofia-SIP package
 *
 * Copyright (C) 2005 Nokia Corporation.
 *
 * Contact: Pekka Pessi <pekka.pessi@nokia.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

#ifndef MSG_MCLASS_H
/** Defined when <sofia-sip/msg_mclass.h> has been included. */
#define MSG_MCLASS_H
/**@ingroup msg_parser
 * @file sofia-sip/msg_mclass.h
 *
 * @brief Parser table and message factory object.
 *
 * @author Pekka Pessi <Pekka.Pessi@nokia.com>
 *
 * @date Created: Mon Aug 27 15:44:27 2001 ppessi
 */

#ifndef MSG_HEADER_H
#include <sofia-sip/msg_header.h>
#endif

SOFIA_BEGIN_DECLS

enum { 
  /** Default size of hash table */
00046   MC_HASH_SIZE = 127, 
  /** Size of short form table */
00048   MC_SHORT_SIZE = 'Z' - 'A' + 1 
};

/**Header reference.
 *
 * A header reference object contains a pointer to a 
 * @ref msg_hclass_s "header class" 
 * and a offset to the header objects within the @ref msg_pub_t "public
 * message structure".
 * 
 * The @a hr_flags field is used to provide classification of headers. For
 * instance, the msg_extract_errors() returns bitwise or of all hr_flags
 * belonging to headers with parsing errors.
 */
00062 struct msg_href_s
{
00064   msg_hclass_t  *hr_class;    /**< Header class */
00065   unsigned short hr_offset;   /**< Offset within public message struct. */
00066   unsigned short hr_flags;    /**< Header flags */
};

/**Factory object for protocol messages.
 *
 * The message class is a kind of a factory object used to create new
 * message objects for the protocol it represents (see msg_create()).
 *
 * The message class object contains all the information needed to parse a
 * message. It used when headers are added or removed from the message. When
 * a message is sent, the message class is used to order message components
 * and print (encode) the message in text format.
 *
 * The message class contains reference objects to headers and other components
 * within the message. Each reference contains a pointer to a @ref
 * msg_hclass_s "header class" and a offset to the header objects within
 * public message structure. The parser engine uses these references when it
 * adds a newly parsed header object to the message structure. The function
 * msg_find_hclass() searches for the reference of the named header.

 * The application can make a copy of existing message class object using
 * the function msg_mclass_clone(). New headers can be added to the message
 * class with the msg_mclass_insert_header() and msg_mclass_insert()
 * functions. The message class of an existing message object can be found
 * out with the function msg_mclass().
 *
 * @sa sip_default_mclass(), http_default_mclass(), msg_create(),
 * msg_mclass(), msg_mclass_clone(), msg_mclass_insert_header(),
 * msg_mclass_insert_with_mask(), msg_mclass_insert().
 */
00096 struct msg_mclass_s
{
00098   struct msg_hclass_s
                mc_hclass[1]; /**< Recursive header class */
00100   char const   *mc_name;      /**< Protocol name, e.g., "SIP/2.0" */
00101   void         *mc_tag;       /**< Protocol-specific tag */
00102   unsigned      mc_flags;     /**< Default flags */
00103   unsigned      mc_msize;     /**< Size of public message structure */
  /** Function extracting the message contents. */
  issize_t    (*mc_extract_body)(msg_t *msg, msg_pub_t *pub, 
                         char b[], isize_t bsiz, int eos);

00108   msg_href_t    mc_request[1];      /**< Request line reference */
00109   msg_href_t    mc_status[1]; /**< Status line reference */
00110   msg_href_t    mc_separator[1];/**< Separator line reference */
00111   msg_href_t    mc_payload[1];      /**< Message body reference */
00112   msg_href_t    mc_unknown[1];      /**< Reference for unknown headers */
00113   msg_href_t    mc_error[1];  /**< Reference for erroneous header */
00114   msg_href_t    mc_multipart[1];/**< Multipart body reference */
  msg_href_t const *
00116                 mc_short;     /**< Short forms (or NULL) */
00117   short         mc_hash_size; /**< Size of parsing table  */
00118   short         mc_hash_used; /**< Number of headers in parsing table */
  /** Hash table for parsing containing reference for each header. */
00120   msg_href_t    mc_hash[MC_HASH_SIZE]; 
};

enum { msg_mclass_copy = 0, msg_mclass_empty = 1 };

SOFIAPUBFUN msg_mclass_t *msg_mclass_clone(msg_mclass_t const *old,
                                 int newsize, int empty);

SOFIAPUBFUN int msg_mclass_insert(msg_mclass_t *mc, msg_href_t const *hr);

SOFIAPUBFUN
int msg_mclass_insert_header(msg_mclass_t *mc, 
                       msg_hclass_t *hc,
                       unsigned short offset);

SOFIAPUBFUN
int msg_mclass_insert_with_mask(msg_mclass_t *mc, 
                        msg_hclass_t *hc,
                        unsigned short offset,
                        unsigned short mask);

SOFIAPUBFUN
msg_href_t const *msg_find_hclass(msg_mclass_t const *, char const *, isize_t *);

SOFIAPUBFUN msg_mclass_t const *msg_mclass(msg_t const *);

SOFIA_END_DECLS

#endif /* !defined(MSG_MCLASS_H) */

Generated by  Doxygen 1.6.0   Back to index