Changeset 197 for pjproject/trunk/pjsip/src/pjsip-simple/evsub_msg.c
- Timestamp:
- Feb 19, 2006 1:38:06 AM (18 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip-simple/evsub_msg.c
- Property svn:keywords set to id
r187 r197 17 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 18 */ 19 #include <pjsip _simple/event_notify_msg.h>20 #include <pjsip/print .h>19 #include <pjsip-simple/evsub_msg.h> 20 #include <pjsip/print_util.h> 21 21 #include <pjsip/sip_parser.h> 22 22 #include <pj/pool.h> … … 24 24 #include <pj/except.h> 25 25 26 /* 27 * Event header. 28 */ 26 29 static int pjsip_event_hdr_print( pjsip_event_hdr *hdr, 27 30 char *buf, pj_size_t size); … … 41 44 PJ_DEF(pjsip_event_hdr*) pjsip_event_hdr_create(pj_pool_t *pool) 42 45 { 43 pj_str_t event = { "Event", 5 }; 44 pjsip_event_hdr *hdr = pj_pool_calloc(pool, 1, sizeof(*hdr)); 46 pjsip_event_hdr *hdr = pj_pool_zalloc(pool, sizeof(*hdr)); 45 47 hdr->type = PJSIP_H_OTHER; 46 hdr->name = hdr->sname = event; 48 hdr->name.ptr = "Event"; 49 hdr->name.slen = 5; 50 hdr->sname.ptr = "o"; 51 hdr->sname.slen = 1; 47 52 hdr->vptr = &event_hdr_vptr; 48 53 pj_list_init(hdr); 54 pj_list_init(&hdr->other_param); 49 55 return hdr; 50 56 } … … 63 69 copy_advance(p, hdr->event_type); 64 70 copy_advance_pair(p, ";id=", 4, hdr->id_param); 65 if (hdr->other_param.slen) 66 copy_advance(p, hdr->other_param); 71 72 printed = pjsip_param_print_on(&hdr->other_param, p, endbuf-p, 73 &pjsip_PARAM_CHAR_SPEC, 74 &pjsip_PARAM_CHAR_SPEC, ';'); 75 if (printed < 0) 76 return printed; 77 78 p += printed; 67 79 return p - buf; 68 80 } … … 74 86 pj_strdup(pool, &hdr->event_type, &rhs->event_type); 75 87 pj_strdup(pool, &hdr->id_param, &rhs->id_param); 76 pj_strdup(pool, &hdr->other_param, &rhs->other_param); 77 return hdr; 78 } 79 80 static pjsip_event_hdr* pjsip_event_hdr_shallow_clone( pj_pool_t *pool, 81 const pjsip_event_hdr *rhs ) 88 pjsip_param_clone(pool, &hdr->other_param, &rhs->other_param); 89 return hdr; 90 } 91 92 static pjsip_event_hdr* 93 pjsip_event_hdr_shallow_clone( pj_pool_t *pool, 94 const pjsip_event_hdr *rhs ) 82 95 { 83 96 pjsip_event_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr)); 84 97 pj_memcpy(hdr, rhs, sizeof(*hdr)); 85 return hdr; 86 } 87 88 89 static int pjsip_allow_events_hdr_print(pjsip_allow_events_hdr *hdr, 90 char *buf, pj_size_t size); 91 static pjsip_allow_events_hdr* 92 pjsip_allow_events_hdr_clone(pj_pool_t *pool, 93 const pjsip_allow_events_hdr *hdr); 94 static pjsip_allow_events_hdr* 95 pjsip_allow_events_hdr_shallow_clone(pj_pool_t *pool, 96 const pjsip_allow_events_hdr*); 97 98 static pjsip_hdr_vptr allow_event_hdr_vptr = 99 { 100 (pjsip_hdr_clone_fptr) &pjsip_allow_events_hdr_clone, 101 (pjsip_hdr_clone_fptr) &pjsip_allow_events_hdr_shallow_clone, 102 (pjsip_hdr_print_fptr) &pjsip_allow_events_hdr_print, 103 }; 104 105 98 pjsip_param_shallow_clone(pool, &hdr->other_param, &rhs->other_param); 99 return hdr; 100 } 101 102 103 /* 104 * Allow-Events header. 105 */ 106 106 PJ_DEF(pjsip_allow_events_hdr*) pjsip_allow_events_hdr_create(pj_pool_t *pool) 107 107 { 108 pj_str_t allow_events = { "Allow-Events", 12 }; 109 pjsip_allow_events_hdr *hdr = pj_pool_calloc(pool, 1, sizeof(*hdr)); 110 hdr->type = PJSIP_H_OTHER; 111 hdr->name = hdr->sname = allow_events; 112 hdr->vptr = &allow_event_hdr_vptr; 113 pj_list_init(hdr); 114 return hdr; 115 } 116 117 static int pjsip_allow_events_hdr_print(pjsip_allow_events_hdr *hdr, 118 char *buf, pj_size_t size) 119 { 120 char *p = buf; 121 char *endbuf = buf+size; 122 int printed; 123 124 copy_advance(p, hdr->name); 125 *p++ = ':'; 126 *p++ = ' '; 127 128 if (hdr->event_cnt > 0) { 129 int i; 130 copy_advance(p, hdr->events[0]); 131 for (i=1; i<hdr->event_cnt; ++i) { 132 copy_advance_pair(p, ",", 1, hdr->events[i]); 133 } 134 } 135 136 return p - buf; 137 } 138 139 static pjsip_allow_events_hdr* 140 pjsip_allow_events_hdr_clone(pj_pool_t *pool, 141 const pjsip_allow_events_hdr *rhs) 142 { 143 int i; 144 145 pjsip_allow_events_hdr *hdr = pjsip_allow_events_hdr_create(pool); 146 hdr->event_cnt = rhs->event_cnt; 147 for (i=0; i<rhs->event_cnt; ++i) { 148 pj_strdup(pool, &hdr->events[i], &rhs->events[i]); 149 } 150 return hdr; 151 } 152 153 static pjsip_allow_events_hdr* 154 pjsip_allow_events_hdr_shallow_clone(pj_pool_t *pool, 155 const pjsip_allow_events_hdr *rhs) 156 { 157 pjsip_allow_events_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr)); 158 pj_memcpy(hdr, rhs, sizeof(*hdr)); 159 return hdr; 160 } 161 162 108 const pj_str_t STR_ALLOW_EVENTS = { "Allow-Events", 12}; 109 pjsip_allow_events_hdr *hdr; 110 111 hdr = pjsip_generic_array_hdr_create(pool, &STR_ALLOW_EVENTS); 112 113 if (hdr) { 114 hdr->sname.ptr = "u"; 115 hdr->sname.slen = 1; 116 } 117 118 return hdr; 119 } 120 121 122 /* 123 * Subscription-State header. 124 */ 163 125 static int pjsip_sub_state_hdr_print(pjsip_sub_state_hdr *hdr, 164 126 char *buf, pj_size_t size); … … 181 143 { 182 144 pj_str_t sub_state = { "Subscription-State", 18 }; 183 pjsip_sub_state_hdr *hdr = pj_pool_ calloc(pool, 1, sizeof(*hdr));145 pjsip_sub_state_hdr *hdr = pj_pool_zalloc(pool, sizeof(*hdr)); 184 146 hdr->type = PJSIP_H_OTHER; 185 147 hdr->name = hdr->sname = sub_state; … … 188 150 hdr->retry_after = -1; 189 151 pj_list_init(hdr); 152 pj_list_init(&hdr->other_param); 190 153 return hdr; 191 154 } … … 216 179 p += printed; 217 180 } 218 if (hdr->other_param.slen) 219 copy_advance(p, hdr->other_param); 181 182 printed = pjsip_param_print_on( &hdr->other_param, p, endbuf-p, 183 &pjsip_PARAM_CHAR_SPEC, 184 &pjsip_PARAM_CHAR_SPEC, 185 ';'); 186 if (printed < 0) 187 return printed; 188 189 p += printed; 220 190 221 191 return p - buf; … … 231 201 hdr->retry_after = rhs->retry_after; 232 202 hdr->expires_param = rhs->expires_param; 233 pj _strdup(pool, &hdr->other_param, &rhs->other_param);203 pjsip_param_clone(pool, &hdr->other_param, &rhs->other_param); 234 204 return hdr; 235 205 } … … 241 211 pjsip_sub_state_hdr *hdr = pj_pool_alloc(pool, sizeof(*hdr)); 242 212 pj_memcpy(hdr, rhs, sizeof(*hdr)); 243 return hdr; 244 } 245 246 static pjsip_event_hdr *parse_hdr_event(pj_scanner *scanner, 247 pj_pool_t *pool) 248 { 249 pjsip_event_hdr *hdr = pjsip_event_hdr_create(pool); 213 pjsip_param_shallow_clone(pool, &hdr->other_param, &rhs->other_param); 214 return hdr; 215 } 216 217 218 /* 219 * Parse Event header. 220 */ 221 static pjsip_hdr *parse_hdr_event(pjsip_parse_ctx *ctx) 222 { 223 pjsip_event_hdr *hdr = pjsip_event_hdr_create(ctx->pool); 250 224 const pj_str_t id_param = { "id", 2 }; 251 225 252 pj_scan_get( scanner,pjsip_TOKEN_SPEC, &hdr->event_type);253 254 while (* scanner->current== ';') {226 pj_scan_get(ctx->scanner, &pjsip_TOKEN_SPEC, &hdr->event_type); 227 228 while (*ctx->scanner->curptr == ';') { 255 229 pj_str_t pname, pvalue; 256 pj_scan_get_char(scanner); 257 pjsip_parse_param_imp(scanner, &pname, &pvalue, 0); 230 231 pj_scan_get_char(ctx->scanner); 232 pjsip_parse_param_imp(ctx->scanner, ctx->pool, &pname, &pvalue, 0); 233 258 234 if (pj_stricmp(&pname, &id_param)==0) { 259 235 hdr->id_param = pvalue; 260 236 } else { 261 pjsip_concat_param_imp(&hdr->other_param, pool, &pname, &pvalue, ';'); 237 pjsip_param *param = pj_pool_alloc(ctx->pool, sizeof(pjsip_param)); 238 param->name = pname; 239 param->value = pvalue; 240 pj_list_push_back(&hdr->other_param, param); 262 241 } 263 242 } 264 pjsip_parse_end_hdr_imp( scanner ); 265 return hdr; 266 } 267 268 static pjsip_allow_events_hdr *parse_hdr_allow_events(pj_scanner *scanner, 269 pj_pool_t *pool) 270 { 271 pjsip_allow_events_hdr *hdr = pjsip_allow_events_hdr_create(pool); 272 273 pj_scan_get(scanner, pjsip_TOKEN_SPEC, &hdr->events[0]); 274 hdr->event_cnt = 1; 275 276 while (*scanner->current == ',') { 277 pj_scan_get_char(scanner); 278 pj_scan_get(scanner, pjsip_TOKEN_SPEC, &hdr->events[hdr->event_cnt++]); 279 if (hdr->event_cnt == PJSIP_MAX_ALLOW_EVENTS) { 280 PJ_THROW(PJSIP_SYN_ERR_EXCEPTION); 281 } 282 } 283 284 pjsip_parse_end_hdr_imp( scanner ); 285 return hdr; 286 } 287 288 static pjsip_sub_state_hdr *parse_hdr_sub_state(pj_scanner *scanner, 289 pj_pool_t *pool) 290 { 291 pjsip_sub_state_hdr *hdr = pjsip_sub_state_hdr_create(pool); 243 pjsip_parse_end_hdr_imp( ctx->scanner ); 244 return (pjsip_hdr*)hdr; 245 } 246 247 /* 248 * Parse Subscription-State header. 249 */ 250 static pjsip_hdr* parse_hdr_sub_state( pjsip_parse_ctx *ctx ) 251 { 252 pjsip_sub_state_hdr *hdr = pjsip_sub_state_hdr_create(ctx->pool); 292 253 const pj_str_t reason = { "reason", 6 }, 293 254 expires = { "expires", 7 }, 294 255 retry_after = { "retry-after", 11 }; 295 pj_scan_get( scanner,pjsip_TOKEN_SPEC, &hdr->sub_state);296 297 while (* scanner->current== ';') {256 pj_scan_get(ctx->scanner, &pjsip_TOKEN_SPEC, &hdr->sub_state); 257 258 while (*ctx->scanner->curptr == ';') { 298 259 pj_str_t pname, pvalue; 299 260 300 pj_scan_get_char(scanner); 301 pjsip_parse_param_imp(scanner, &pname, &pvalue, 0); 261 pj_scan_get_char(ctx->scanner); 262 pjsip_parse_param_imp(ctx->scanner, ctx->pool, &pname, &pvalue, 0); 263 302 264 if (pj_stricmp(&pname, &reason) == 0) { 303 265 hdr->reason_param = pvalue; 266 304 267 } else if (pj_stricmp(&pname, &expires) == 0) { 305 268 hdr->expires_param = pj_strtoul(&pvalue); 269 306 270 } else if (pj_stricmp(&pname, &retry_after) == 0) { 307 271 hdr->retry_after = pj_strtoul(&pvalue); 272 308 273 } else { 309 pjsip_concat_param_imp(&hdr->other_param, pool, &pname, &pvalue, ';'); 274 pjsip_param *param = pj_pool_alloc(ctx->pool, sizeof(pjsip_param)); 275 param->name = pname; 276 param->value = pvalue; 277 pj_list_push_back(&hdr->other_param, param); 310 278 } 311 279 } 312 280 313 pjsip_parse_end_hdr_imp( scanner ); 314 return hdr; 315 } 316 317 PJ_DEF(void) pjsip_event_notify_init_parser(void) 318 { 319 pjsip_register_hdr_parser( "Event", NULL, (pjsip_parse_hdr_func*) &parse_hdr_event); 320 pjsip_register_hdr_parser( "Allow-Events", NULL, (pjsip_parse_hdr_func*) &parse_hdr_allow_events); 321 pjsip_register_hdr_parser( "Subscription-State", NULL, (pjsip_parse_hdr_func*) &parse_hdr_sub_state); 322 } 281 pjsip_parse_end_hdr_imp( ctx->scanner ); 282 return (pjsip_hdr*)hdr; 283 } 284 285 /* 286 * Register header parsers. 287 */ 288 PJ_DEF(void) pjsip_evsub_init_parser(void) 289 { 290 pjsip_register_hdr_parser( "Event", NULL, 291 &parse_hdr_event); 292 293 pjsip_register_hdr_parser( "Subscription-State", NULL, 294 &parse_hdr_sub_state); 295 } 296
Note: See TracChangeset
for help on using the changeset viewer.