msg 1.12.11devel
/tmp/buildd/sofia-sip-1.12.11+20110422/libsofia-sip-ua/msg/sofia-sip/msg_header.h
Go to the documentation of this file.
00001 /*
00002  * This file is part of the Sofia-SIP package
00003  *
00004  * Copyright (C) 2005 Nokia Corporation.
00005  *
00006  * Contact: Pekka Pessi <pekka.pessi@nokia-email.address.hidden>
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public License
00010  * as published by the Free Software Foundation; either version 2.1 of
00011  * the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
00021  * 02110-1301 USA
00022  *
00023  */
00024 
00025 #ifndef MSG_HEADER_H
00026 
00027 #define MSG_HEADER_H
00028 
00039 #include <stdarg.h>
00040 #include <string.h>
00041 
00042 #ifndef SU_TYPES_H
00043 #include <sofia-sip/su_types.h>
00044 #endif
00045 #ifndef SU_ALLOC_H
00046 #include <sofia-sip/su_alloc.h>
00047 #endif
00048 #ifndef MSG_H
00049 #include <sofia-sip/msg.h>
00050 #endif
00051 #ifndef URL_H
00052 #include <sofia-sip/url.h>
00053 #endif
00054 
00055 SOFIA_BEGIN_DECLS
00056 
00057 SOFIAPUBFUN msg_header_t *msg_header_alloc(su_home_t *,
00058                                            msg_hclass_t *hc,
00059                                            isize_t extra)
00060   __attribute__((__malloc__));
00061 
00062 SOFIAPUBFUN isize_t msg_header_size(msg_header_t const *h);
00063 
00064 SOFIAPUBFUN msg_header_t **msg_header_offset(msg_t const *,
00065                                          msg_pub_t const *,
00066                                          msg_header_t const *);
00067 SOFIAPUBFUN msg_header_t **msg_hclass_offset(msg_mclass_t const *,
00068                                              msg_pub_t const *,
00069                                              msg_hclass_t *);
00070 SOFIAPUBFUN msg_header_t *msg_header_access(msg_pub_t const *pub,
00071                                             msg_hclass_t *hc);
00072 
00073 SOFIAPUBFUN msg_header_t *msg_header_copy_as(su_home_t *home,
00074                                              msg_hclass_t *hc,
00075                                              msg_header_t const *o)
00076   __attribute__((__malloc__));
00077 SOFIAPUBFUN msg_header_t *msg_header_copy(su_home_t *home,
00078                                           msg_header_t const *o)
00079   __attribute__((__malloc__));
00080 SOFIAPUBFUN msg_header_t *msg_header_copy_one(su_home_t *home,
00081                                               msg_header_t const *o)
00082   __attribute__((__malloc__));
00083 SOFIAPUBFUN msg_header_t *msg_header_dup_as(su_home_t *home,
00084                                             msg_hclass_t *hc,
00085                                             msg_header_t const *o)
00086   __attribute__((__malloc__));
00087 SOFIAPUBFUN msg_header_t *msg_header_dup(su_home_t *home,
00088                                          msg_header_t const *h)
00089   __attribute__((__malloc__));
00090 SOFIAPUBFUN msg_header_t *msg_header_dup_one(su_home_t *home,
00091                                              msg_header_t const *h)
00092   __attribute__((__malloc__));
00093 
00094 SOFIAPUBFUN msg_header_t *msg_header_d(su_home_t *home,
00095                                        msg_t const *msg,
00096                                        char const *b);
00097 SOFIAPUBFUN issize_t msg_header_e(char b[], isize_t bsiz,
00098                                   msg_header_t const *h,
00099                                   int flags);
00100 SOFIAPUBFUN issize_t msg_object_e(char b[], isize_t size,
00101                                   msg_pub_t const *mo,
00102                                   int flags);
00103 
00104 SOFIAPUBFUN issize_t msg_header_field_e(char b[], isize_t bsiz,
00105                                         msg_header_t const *h,
00106                                         int flags);
00107 
00108 SOFIAPUBFUN int msg_header_remove(msg_t *msg,
00109                                   msg_pub_t *mo,
00110                                   msg_header_t *h);
00111 
00112 SOFIAPUBFUN int msg_header_remove_all(msg_t *msg,
00113                                       msg_pub_t *mo,
00114                                       msg_header_t *h);
00115 
00116 SOFIAPUBFUN int msg_header_insert(msg_t *msg, msg_pub_t *mo,
00117                                   msg_header_t *h);
00118 
00119 SOFIAPUBFUN int msg_header_replace(msg_t *msg, msg_pub_t *mo,
00120                                    msg_header_t *old_header,
00121                                    msg_header_t *new_header);
00122 
00123 SOFIAPUBFUN int msg_header_add_dup(msg_t *msg,
00124                                    msg_pub_t *pub,
00125                                    msg_header_t const *o);
00126 
00127 SOFIAPUBFUN int msg_header_add_str(msg_t *msg,
00128                                    msg_pub_t *pub,
00129                                    char const *str);
00130 
00131 SOFIAPUBFUN int msg_header_parse_str(msg_t *msg,
00132                                      msg_pub_t *pub,
00133                                      char *s);
00134 
00135 SOFIAPUBFUN int msg_header_add_dup_as(msg_t *msg,
00136                                       msg_pub_t *pub,
00137                                       msg_hclass_t *hc,
00138                                       msg_header_t const *o);
00139 
00140 SOFIAPUBFUN int msg_header_add_make(msg_t *msg,
00141                                     msg_pub_t *pub,
00142                                     msg_hclass_t *hc,
00143                                     char const *s);
00144 
00145 SOFIAPUBFUN int msg_header_add_format(msg_t *msg,
00146                                       msg_pub_t *pub,
00147                                       msg_hclass_t *hc,
00148                                       char const *fmt,
00149                                       ...);
00150 
00151 SOFIAPUBFUN int msg_header_prepend(msg_t *msg,
00152                                    msg_pub_t *pub,
00153                                    msg_header_t **hh,
00154                                    msg_header_t *h);
00155 
00156 SOFIAPUBFUN msg_header_t *msg_header_make(su_home_t *home,
00157                                           msg_hclass_t *hc,
00158                                           char const *s)
00159      __attribute__((__malloc__));
00160 
00161 SOFIAPUBFUN msg_header_t *msg_header_format(su_home_t *home,
00162                                             msg_hclass_t *hc,
00163                                             char const *fmt, ...)
00164      __attribute__ ((__malloc__, __format__ (printf, 3, 4)));
00165 
00166 SOFIAPUBFUN msg_header_t *msg_header_vformat(su_home_t *home,
00167                                              msg_hclass_t *hc,
00168                                              char const *fmt,
00169                                              va_list ap)
00170      __attribute__((__malloc__));
00171 
00172 
00173 SOFIAPUBFUN void msg_header_free(su_home_t *home,
00174                                  msg_header_t *h);
00175 
00176 SOFIAPUBFUN void msg_header_free_all(su_home_t *home,
00177                                      msg_header_t *h);
00178 
00179 SOFIAPUBFUN msg_payload_t *msg_payload_create(su_home_t *home,
00180                                               void const *data,
00181                                               usize_t len)
00182      __attribute__((__malloc__));
00183 
00184 SOFIAPUBFUN msg_separator_t *msg_separator_create(su_home_t *home)
00185   __attribute__((__malloc__));
00186 
00187 /* Chunk handling macros */
00188 
00190 #define MSG_CHUNK_BUFFER(pl) \
00191   ((char *)pl->pl_common->h_data + (pl)->pl_common->h_len)
00192 
00193 #define MSG_CHUNK_AVAIL(pl) \
00194   ((pl)->pl_len + ((pl)->pl_data - (char *)pl->pl_common->h_data) - \
00195    (pl)->pl_common->h_len)
00196 
00197 #define MSG_CHUNK_NEXT(pl) \
00198   ((pl)->pl_next)
00199 
00200 SOFIAPUBFUN issize_t msg_headers_prepare(msg_t *,
00201                                          msg_header_t *headers,
00202                                          int flags);
00203 
00204 #ifdef SU_HAVE_INLINE
00205 
00206 su_inline void msg_fragment_clear(msg_common_t *h)
00207 {
00208   h->h_data = NULL, h->h_len = 0;
00209 }
00210 
00212 su_inline
00213 msg_param_t **msg_header_params(msg_common_t const *h)
00214 {
00215   if (h && h->h_class->hc_params) {
00216     return (msg_param_t **)((char *)h + h->h_class->hc_params);
00217   }
00218   return NULL;
00219 }
00220 #else
00221 #define msg_fragment_clear(h) ((h)->h_data = NULL, (h)->h_len = 0)
00222 #define msg_header_params(h) \
00223  (((h) && ((msg_common_t *)h)->h_class->hc_params) ? \
00224   (msg_param_t **)((char *)(h) + ((msg_common_t *)h)->h_class->hc_params) : NULL)
00225 #endif
00226 
00227 SOFIAPUBFUN void msg_fragment_clear_chain(msg_header_t *h);
00228 
00229 SOFIAPUBFUN char const *msg_header_find_param(msg_common_t const *,
00230                                               char const *name);
00231 SOFIAPUBFUN int msg_header_add_param(su_home_t *, msg_common_t *h,
00232                                      char const *param);
00233 SOFIAPUBFUN int msg_header_replace_param(su_home_t *, msg_common_t *h,
00234                                          char const *param);
00235 SOFIAPUBFUN int msg_header_remove_param(msg_common_t *h, char const *name);
00236 
00237 SOFIAPUBFUN char const *msg_header_find_item(msg_common_t const *h,
00238                                              char const *item);
00239 
00240 SOFIAPUBFUN int msg_header_replace_item(su_home_t *, msg_common_t *h,
00241                                         char const *item);
00242 SOFIAPUBFUN int msg_header_remove_item(msg_common_t *h, char const *name);
00243 
00245 SOFIAPUBFUN int msg_list_append_items(su_home_t *home,
00246                                       msg_list_t *k,
00247                                       msg_param_t const items[]);
00248 
00250 SOFIAPUBFUN int msg_list_replace_items(su_home_t *home,
00251                                        msg_list_t *k,
00252                                        msg_param_t const items[]);
00253 
00254 SOFIAPUBFUN int msg_header_join_items(su_home_t *home,
00255                                       msg_common_t *dst,
00256                                       msg_common_t const *src,
00257                                       int duplicate);
00258 
00259 SOFIAPUBFUN issize_t msg_random_token(char token[], isize_t tlen,
00260                                       void const *d, isize_t dlen);
00261 
00262 SOFIAPUBFUN msg_param_t msg_params_find(msg_param_t const pp[],
00263                                         char const *name);
00264 SOFIAPUBFUN msg_param_t *msg_params_find_slot(msg_param_t [],
00265                                               char const *name);
00266 SOFIAPUBFUN int msg_params_add(su_home_t *sh,
00267                                msg_param_t **pp,
00268                                char const *param);
00269 SOFIAPUBFUN int msg_params_cmp(char const * const a[],
00270                                char const * const b[]);
00271 SOFIAPUBFUN int msg_params_replace(su_home_t *,
00272                                    char const * **inout_paramlist,
00273                                    char const *);
00274 SOFIAPUBFUN int msg_params_remove(char const **paramlist,
00275                                   char const *name);
00276 SOFIAPUBFUN size_t msg_params_length(char const * const * params);
00277 
00279 SOFIAPUBFUN char *msg_unquote_dup(su_home_t *home, char const *q)
00280      __attribute__((__malloc__));
00281 
00282 SOFIAPUBFUN char *msg_unquote(char *dst, char const *s);
00283 
00285 SOFIAPUBFUN unsigned long msg_hash_string(char const *id);
00286 
00287 /* Align pointer p for multiple of t (which must be a power of 2) */
00288 #define MSG_ALIGN(p, t) (((uintptr_t)(p) + (t) - 1) & (0 - (uintptr_t)(t)))
00289 #define MSG_STRUCT_SIZE_ALIGN(rv) ((rv) = MSG_ALIGN(rv, sizeof(void *)))
00290 #define MSG_STRUCT_ALIGN(p) ((p) = (void*)MSG_ALIGN(p, sizeof(void *)))
00291 
00292 enum {
00293  msg_n_params = 8       /* allocation size of parameter string list */
00294 #define MSG_N_PARAMS msg_n_params
00295 };
00296 
00298 #define MSG_HEADER_INIT(h, msg_class, size)                     \
00299   ((void)memset((h), 0, (size)),                                \
00300    (void)(((msg_common_t *)(h))->h_class = (msg_class)),        \
00301    (h))
00302 
00304 #define MSG_HEADER_NONE ((msg_header_t *)(intptr_t)-1)
00305 
00306 SOFIA_END_DECLS
00307 
00308 #ifndef MSG_PROTOS_H
00309 #include <sofia-sip/msg_protos.h>
00310 #endif
00311 
00312 #endif 
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines

Sofia-SIP 1.12.11devel - Copyright (C) 2006 Nokia Corporation. All rights reserved. Licensed under the terms of the GNU Lesser General Public License.