GPLization banner introduced to *.[hc] files
[sip-router] / data_lump.h
1 /*
2  * $Id$
3  *
4  * adding/removing headers or any other data chunk from a message
5  *
6  * Copyright (C) 2001-2003 Fhg Fokus
7  *
8  * This file is part of ser, a free SIP server.
9  *
10  * ser is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version
14  *
15  * For a license to use the ser software under conditions
16  * other than those described here, or to purchase support for this
17  * software, please contact iptel.org by e-mail at the following addresses:
18  *    info@iptel.org
19  *
20  * ser is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License 
26  * along with this program; if not, write to the Free Software 
27  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
28  */
29
30
31 #ifndef data_lump_h
32 #define data_lump_h
33
34
35 enum { LUMP_NOP=0, LUMP_DEL, LUMP_ADD };
36
37 struct lump{
38         int type; /* VIA, OTHER, UNSPEC(=0), ... */
39         int op;   /* DEL, ADD, NOP, UNSPEC(=0) */
40         
41         union{
42                 int offset; /* used for DEL, MODIFY */
43                 char * value; /* used for ADD */
44         }u;
45         int len; /* length of this header field */
46         
47         
48         struct lump* before; /* list of headers to be inserted in front of the
49                                                                 current one */
50         struct lump* after; /* list of headers to be inserted immediately after
51                                                           the current one */
52         
53         struct lump* next;
54 };
55
56 /*
57  * hdrs must be kept sorted after their offset (DEL, NOP, UNSPEC)
58  * and/or their position (ADD). E.g.:
59  *  - to delete header Z insert it in to the list according to its offset 
60  *   and with op=DELETE
61  * - if you want to add a new header X after a  header Y, insert Y in the list
62  *   with op NOP and after it X (op ADD).
63  * - if you want X before Y, insert X in Y's before list.
64  * - if you want X to be the first header just put it first in hdr_lst.
65  *  -if you want to replace Y with X, insert Y with op=DELETE and then X with
66  *  op=ADD.
67  * before and after must contain only ADD ops!
68  * 
69  * Difference between "after" & "next" when ADDing:
70  * "after" forces the new header immediately after the current one while
71  * "next" means another header can be inserted between them.
72  * 
73  */
74
75
76
77 /* adds a header to the end */
78 struct lump* append_new_lump(struct lump** list, char* new_hdr,
79                                                          int len, int type);
80 /* inserts a header to the beginning */
81 struct lump* insert_new_lump(struct lump** list, char* new_hdr,
82                                                           int len, int type);
83 struct lump* insert_new_lump_after(struct lump* after,
84                                                                         char* new_hdr, int len, int type);
85 struct lump* insert_new_lump_before(struct lump* before, char* new_hdr,
86                                                                         int len,int type);
87
88
89 /* removes an already existing header */
90 struct lump* del_lump(struct lump** list, int offset, int len, int type);
91 /* set an anchor */
92 struct lump* anchor_lump(struct lump** list, int offset, int len, int type);
93
94
95 /* frees the content of a lump struct */
96 void free_lump(struct lump* l);
97 /*frees an entire lump list, recursively */
98 void free_lump_list(struct lump* lump_list);
99
100 #endif