00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef NTA_H
00026
00027 #define NTA_H
00028
00036 #ifndef SU_WAIT_H
00037 #include <sofia-sip/su_wait.h>
00038 #endif
00039
00040 #ifndef SIP_H
00041 #include <sofia-sip/sip.h>
00042 #endif
00043
00044 #ifndef NTA_TAG_H
00045 #include <sofia-sip/nta_tag.h>
00046 #endif
00047
00048 SOFIA_BEGIN_DECLS
00049
00050
00051
00052
00053
00055 typedef struct nta_agent_s nta_agent_t;
00057 typedef struct nta_leg_s nta_leg_t;
00059 typedef struct nta_outgoing_s nta_outgoing_t;
00061 typedef struct nta_incoming_s nta_incoming_t;
00062
00063 #ifndef NTA_AGENT_MAGIC_T
00064
00067 #define NTA_AGENT_MAGIC_T struct nta_agent_magic_s
00068 #endif
00069 #ifndef NTA_LEG_MAGIC_T
00070
00073 #define NTA_LEG_MAGIC_T struct nta_leg_magic_s
00074 #endif
00075 #ifndef NTA_OUTGOING_MAGIC_T
00076
00079 #define NTA_OUTGOING_MAGIC_T struct nta_outgoing_magic_s
00080 #endif
00081 #ifndef NTA_INCOMING_MAGIC_T
00082
00085 #define NTA_INCOMING_MAGIC_T struct nta_incoming_magic_s
00086 #endif
00087
00089 typedef NTA_AGENT_MAGIC_T nta_agent_magic_t;
00091 typedef NTA_LEG_MAGIC_T nta_leg_magic_t;
00093 typedef NTA_OUTGOING_MAGIC_T nta_outgoing_magic_t;
00095 typedef NTA_INCOMING_MAGIC_T nta_incoming_magic_t;
00096
00097
00098
00099
00100
00102 #define NTA_VERSION "2.0"
00103
00105 SOFIAPUBVAR char const nta_version[];
00106
00107 enum {
00108
00109 NTA_SIP_T1 = 500,
00110 NTA_SIP_T2 = 4000,
00111 NTA_SIP_T4 = 5000,
00112 NTA_TIME_MAX = 15 * 24 * 3600 * 1000
00114 };
00115
00116
00117
00118
00119
00120 typedef int nta_message_f(nta_agent_magic_t *context,
00121 nta_agent_t *agent,
00122 msg_t *msg,
00123 sip_t *sip);
00124
00125 SOFIAPUBFUN
00126 nta_agent_t *nta_agent_create(su_root_t *root,
00127 url_string_t const *name,
00128 nta_message_f *callback,
00129 nta_agent_magic_t *magic,
00130 tag_type_t tag, tag_value_t value, ...);
00131
00132 SOFIAPUBFUN void nta_agent_destroy(nta_agent_t *agent);
00133
00134 SOFIAPUBFUN char const *nta_agent_version(nta_agent_t const *a);
00135 SOFIAPUBFUN nta_agent_magic_t *nta_agent_magic(nta_agent_t const *a);
00136
00137 SOFIAPUBFUN
00138 int nta_agent_add_tport(nta_agent_t *agent,
00139 url_string_t const *url,
00140 tag_type_t tag, tag_value_t value, ...);
00141
00142 SOFIAPUBFUN int nta_agent_close_tports(nta_agent_t *agent);
00143
00144 SOFIAPUBFUN sip_contact_t *nta_agent_contact(nta_agent_t const *a);
00145 SOFIAPUBFUN sip_via_t *nta_agent_via(nta_agent_t const *a);
00146 SOFIAPUBFUN sip_via_t *nta_agent_public_via(nta_agent_t const *a);
00147
00148 SOFIAPUBFUN char const *nta_agent_newtag(su_home_t *,
00149 char const *fmt, nta_agent_t *);
00150
00151 SOFIAPUBFUN int nta_agent_set_params(nta_agent_t *agent,
00152 tag_type_t tag, tag_value_t value, ...);
00153 SOFIAPUBFUN int nta_agent_get_params(nta_agent_t *agent,
00154 tag_type_t tag, tag_value_t value, ...);
00155
00156 SOFIAPUBFUN int nta_agent_get_stats(nta_agent_t *agent,
00157 tag_type_t tag, tag_value_t value, ...);
00158
00159
00160
00161
00162
00163 SOFIAPUBFUN msg_t *nta_msg_create(nta_agent_t *self, int flags);
00164
00165 SOFIAPUBFUN int nta_msg_complete(msg_t *msg);
00166
00167 SOFIAPUBFUN int nta_msg_request_complete(msg_t *msg,
00168 nta_leg_t *leg,
00169 sip_method_t method,
00170 char const *method_name,
00171 url_string_t const *req_url);
00172
00173 SOFIAPUBFUN int nta_is_internal_msg(msg_t const *msg);
00174
00175
00176
00177
00178 typedef int nta_request_f(nta_leg_magic_t *lmagic,
00179 nta_leg_t *leg,
00180 nta_incoming_t *irq,
00181 sip_t const *sip);
00182
00183 SOFIAPUBFUN
00184 nta_leg_t *nta_leg_tcreate(nta_agent_t *agent,
00185 nta_request_f *req_callback,
00186 nta_leg_magic_t *magic,
00187 tag_type_t tag, tag_value_t value, ...);
00188
00189 SOFIAPUBFUN void nta_leg_destroy(nta_leg_t *leg);
00190
00191 SOFIAPUBFUN nta_leg_t *nta_default_leg(nta_agent_t const *agent);
00192
00193 SOFIAPUBFUN nta_leg_magic_t *nta_leg_magic(nta_leg_t const *leg,
00194 nta_request_f *callback);
00195
00196 SOFIAPUBFUN void nta_leg_bind(nta_leg_t *leg,
00197 nta_request_f *callback,
00198 nta_leg_magic_t *);
00199
00201 SOFIAPUBFUN char const *nta_leg_tag(nta_leg_t *leg, char const *tag);
00202
00204 SOFIAPUBFUN char const *nta_leg_get_tag(nta_leg_t const *leg);
00205
00207 SOFIAPUBFUN char const *nta_leg_rtag(nta_leg_t *leg, char const *tag);
00208
00210 SOFIAPUBFUN char const *nta_leg_get_rtag(nta_leg_t const *leg);
00211
00213 SOFIAPUBFUN int nta_leg_client_route(nta_leg_t *leg,
00214 sip_record_route_t const *route,
00215 sip_contact_t const *contact);
00216
00218 SOFIAPUBFUN int nta_leg_server_route(nta_leg_t *leg,
00219 sip_record_route_t const *route,
00220 sip_contact_t const *contact);
00221
00223 SOFIAPUBFUN int nta_leg_get_route(nta_leg_t *leg,
00224 sip_route_t const **return_route,
00225 sip_contact_t const **return_target);
00226
00228 SOFIAPUBFUN nta_leg_t *nta_leg_by_uri(nta_agent_t const *,
00229 url_string_t const *);
00230
00232 SOFIAPUBFUN
00233 nta_leg_t *nta_leg_by_dialog(nta_agent_t const *agent,
00234 url_t const *request_uri,
00235 sip_call_id_t const *call_id,
00236 char const *from_tag,
00237 url_t const *from_url,
00238 char const *to_tag,
00239 url_t const *to_url);
00240
00242 SOFIAPUBFUN sip_replaces_t *nta_leg_make_replaces(nta_leg_t *leg,
00243 su_home_t *home,
00244 int early_only);
00246 SOFIAPUBFUN
00247 nta_leg_t *nta_leg_by_replaces(nta_agent_t *, sip_replaces_t const *);
00248
00249
00250
00251
00252
00253 SOFIAPUBFUN
00254 nta_incoming_t *nta_incoming_create(nta_agent_t *agent,
00255 nta_leg_t *leg,
00256 msg_t *msg,
00257 sip_t *sip,
00258 tag_type_t tag, tag_value_t value, ...);
00259
00260 SOFIAPUBFUN nta_incoming_t *nta_incoming_default(nta_agent_t *agent);
00261
00262 typedef int nta_ack_cancel_f(nta_incoming_magic_t *imagic,
00263 nta_incoming_t *irq,
00264 sip_t const *sip);
00265
00266 SOFIAPUBFUN void nta_incoming_bind(nta_incoming_t *irq,
00267 nta_ack_cancel_f *callback,
00268 nta_incoming_magic_t *imagic);
00269
00270 SOFIAPUBFUN
00271 nta_incoming_magic_t *nta_incoming_magic(nta_incoming_t *irq,
00272 nta_ack_cancel_f *callback);
00273
00274 SOFIAPUBFUN
00275 nta_incoming_t *nta_incoming_find(nta_agent_t const *agent,
00276 sip_t const *sip,
00277 sip_via_t const *v);
00278
00279 SOFIAPUBFUN char const *nta_incoming_tag(nta_incoming_t *irq, char const *tag);
00280 SOFIAPUBFUN char const *nta_incoming_gettag(nta_incoming_t const *irq);
00281
00282 SOFIAPUBFUN int nta_incoming_status(nta_incoming_t const *irq);
00283 SOFIAPUBFUN sip_method_t nta_incoming_method(nta_incoming_t const *irq);
00284 SOFIAPUBFUN char const *nta_incoming_method_name(nta_incoming_t const *irq);
00285 SOFIAPUBFUN url_t const *nta_incoming_url(nta_incoming_t const *irq);
00286 SOFIAPUBFUN uint32_t nta_incoming_cseq(nta_incoming_t const *irq);
00287
00288 SOFIAPUBFUN int nta_incoming_set_params(nta_incoming_t *irq,
00289 tag_type_t tag, tag_value_t value, ...);
00290
00291 SOFIAPUBFUN msg_t *nta_incoming_getrequest(nta_incoming_t *irq);
00292 SOFIAPUBFUN msg_t *nta_incoming_getrequest_ackcancel(nta_incoming_t *irq);
00293 SOFIAPUBFUN msg_t *nta_incoming_getresponse(nta_incoming_t *irq);
00294
00295 SOFIAPUBFUN
00296 int nta_incoming_complete_response(nta_incoming_t *irq,
00297 msg_t *msg,
00298 int status,
00299 char const *phrase,
00300 tag_type_t tag, tag_value_t value, ...);
00301
00302 SOFIAPUBFUN
00303 msg_t *nta_incoming_create_response(nta_incoming_t *irq, int status, char const *phrase);
00304
00305 SOFIAPUBFUN
00306 int nta_incoming_treply(nta_incoming_t *ireq,
00307 int status, char const *phrase,
00308 tag_type_t tag, tag_value_t value, ...);
00309
00310 SOFIAPUBFUN int nta_incoming_mreply(nta_incoming_t *irq, msg_t *msg);
00311
00312 SOFIAPUBFUN void nta_incoming_destroy(nta_incoming_t *irq);
00313
00314
00315
00316 SOFIAPUBFUN
00317 int nta_check_required(nta_incoming_t *irq,
00318 sip_t const *sip,
00319 sip_supported_t const *supported,
00320 tag_type_t tag, tag_value_t value, ...);
00321 SOFIAPUBFUN
00322 int nta_check_supported(nta_incoming_t *irq,
00323 sip_t const *sip,
00324 sip_require_t *require,
00325 tag_type_t tag, tag_value_t value, ...);
00326 SOFIAPUBFUN
00327 int nta_check_method(nta_incoming_t *irq,
00328 sip_t const *sip,
00329 sip_allow_t const *allow,
00330 tag_type_t tag, tag_value_t value, ...);
00331 SOFIAPUBFUN
00332 int nta_check_session_content(nta_incoming_t *irq, sip_t const *sip,
00333 sip_accept_t const *session_accepts,
00334 tag_type_t tag, tag_value_t value, ...);
00335 SOFIAPUBFUN
00336 int nta_check_accept(nta_incoming_t *irq,
00337 sip_t const *sip,
00338 sip_accept_t const *acceptable,
00339 sip_accept_t const **return_acceptable,
00340 tag_type_t tag, tag_value_t value, ...);
00341
00342 SOFIAPUBFUN
00343 int nta_check_session_expires(nta_incoming_t *irq,
00344 sip_t const *sip,
00345 sip_time_t my_min_se,
00346 tag_type_t tag, tag_value_t value, ...);
00347
00348
00349
00350
00351 typedef int nta_response_f(nta_outgoing_magic_t *magic,
00352 nta_outgoing_t *request,
00353 sip_t const *sip);
00354
00355 SOFIAPUBFUN
00356 nta_outgoing_t *nta_outgoing_tcreate(nta_leg_t *leg,
00357 nta_response_f *callback,
00358 nta_outgoing_magic_t *magic,
00359 url_string_t const *route_url,
00360 sip_method_t method,
00361 char const *method_name,
00362 url_string_t const *request_uri,
00363 tag_type_t tag, tag_value_t value, ...);
00364
00365 SOFIAPUBFUN
00366 nta_outgoing_t *nta_outgoing_mcreate(nta_agent_t *agent,
00367 nta_response_f *callback,
00368 nta_outgoing_magic_t *magic,
00369 url_string_t const *route_url,
00370 msg_t *msg,
00371 tag_type_t tag, tag_value_t value, ...);
00372
00373 SOFIAPUBFUN
00374 nta_outgoing_t *nta_outgoing_default(nta_agent_t *agent,
00375 nta_response_f *callback,
00376 nta_outgoing_magic_t *magic);
00377
00378 SOFIAPUBFUN int nta_outgoing_status(nta_outgoing_t const *orq);
00379 SOFIAPUBFUN sip_method_t nta_outgoing_method(nta_outgoing_t const *orq);
00380 SOFIAPUBFUN char const *nta_outgoing_method_name(nta_outgoing_t const *orq);
00381 SOFIAPUBFUN uint32_t nta_outgoing_cseq(nta_outgoing_t const *orq);
00382
00383 SOFIAPUBFUN unsigned nta_outgoing_delay(nta_outgoing_t const *orq);
00384
00385 SOFIAPUBFUN url_t const *nta_outgoing_request_uri(nta_outgoing_t const *orq);
00386 SOFIAPUBFUN url_t const *nta_outgoing_route_uri(nta_outgoing_t const *orq);
00387
00388 SOFIAPUBFUN msg_t *nta_outgoing_getresponse(nta_outgoing_t *orq);
00389 SOFIAPUBFUN msg_t *nta_outgoing_getrequest(nta_outgoing_t *orq);
00390
00391 SOFIAPUBFUN
00392 nta_outgoing_t *nta_outgoing_tagged(nta_outgoing_t *orq,
00393 nta_response_f *callback,
00394 nta_outgoing_magic_t *magic,
00395 char const *to_tag,
00396 sip_rseq_t const *rseq);
00397
00398 SOFIAPUBFUN int nta_outgoing_cancel(nta_outgoing_t *);
00399
00400 SOFIAPUBFUN
00401 nta_outgoing_t *nta_outgoing_tcancel(nta_outgoing_t *orq,
00402 nta_response_f *callback,
00403 nta_outgoing_magic_t *magic,
00404 tag_type_t, tag_value_t, ...);
00405
00406 SOFIAPUBFUN void nta_outgoing_destroy(nta_outgoing_t *);
00407
00408 SOFIAPUBFUN
00409 nta_outgoing_t *nta_outgoing_find(nta_agent_t const *sa,
00410 msg_t const *msg,
00411 sip_t const *sip,
00412 sip_via_t const *v);
00413
00414 SOFIAPUBFUN int nta_tport_keepalive(nta_outgoing_t *orq);
00415
00416
00417
00418
00419
00420
00421
00422 SOFIAPUBFUN
00423 nta_outgoing_t *nta_outgoing_prack(nta_leg_t *leg,
00424 nta_outgoing_t *oorq,
00425 nta_response_f *callback,
00426 nta_outgoing_magic_t *magic,
00427 url_string_t const *route_url,
00428 sip_t const *response_to_prack,
00429 tag_type_t, tag_value_t, ...);
00430
00431 SOFIAPUBFUN uint32_t nta_outgoing_rseq(nta_outgoing_t const *orq);
00432 SOFIAPUBFUN int nta_outgoing_setrseq(nta_outgoing_t *orq, uint32_t rseq);
00433
00434
00435
00437 typedef struct nta_reliable_s nta_reliable_t;
00438
00439 #ifndef NTA_RELIABLE_MAGIC_T
00440
00443 #define NTA_RELIABLE_MAGIC_T struct nta_reliable_magic_s
00444 #endif
00445
00447 typedef NTA_RELIABLE_MAGIC_T nta_reliable_magic_t;
00448
00449 typedef int nta_prack_f(nta_reliable_magic_t *rmagic,
00450 nta_reliable_t *rel,
00451 nta_incoming_t *prack,
00452 sip_t const *sip);
00453
00454 SOFIAPUBFUN
00455 nta_reliable_t *nta_reliable_treply(nta_incoming_t *ireq,
00456 nta_prack_f *callback,
00457 nta_reliable_magic_t *rmagic,
00458 int status, char const *phrase,
00459 tag_type_t tag,
00460 tag_value_t value, ...);
00461
00462 SOFIAPUBFUN
00463 nta_reliable_t *nta_reliable_mreply(nta_incoming_t *irq,
00464 nta_prack_f *callback,
00465 nta_reliable_magic_t *rmagic,
00466 msg_t *msg);
00467
00468 SOFIAPUBFUN void nta_reliable_destroy(nta_reliable_t *);
00469
00470
00471
00472
00473
00474 #define nta_outgoing_tmcreate nta_outgoing_mcreate
00475 #define nta_msg_response_complete(msg, irq, status, phrase) \
00476 nta_incoming_complete_response((irq), (msg), (status), (phrase), TAG_END())
00477
00478 SOFIAPUBFUN void nta_msg_discard(nta_agent_t *agent, msg_t *msg);
00479
00480 SOFIA_END_DECLS
00481
00482 #endif