nta 1.12.10
|
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 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 * 1) Types 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 * 2) Constants 00099 */ 00100 00102 #define NTA_VERSION "2.0" 00103 00105 SOFIAPUBVAR char const nta_version[]; 00106 00107 enum { 00108 /* Stack parameters */ 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 * 3) Agent-level prototypes 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 * 4) Message-level prototypes 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_msg_is_internal(msg_t const *msg); 00174 SOFIAPUBFUN int nta_sip_is_internal(sip_t const *sip); 00175 00176 /* ---------------------------------------------------------------------- 00177 * 5) Leg-level prototypes 00178 */ 00179 typedef int nta_request_f(nta_leg_magic_t *lmagic, 00180 nta_leg_t *leg, 00181 nta_incoming_t *irq, 00182 sip_t const *sip); 00183 00184 SOFIAPUBFUN 00185 nta_leg_t *nta_leg_tcreate(nta_agent_t *agent, 00186 nta_request_f *req_callback, 00187 nta_leg_magic_t *magic, 00188 tag_type_t tag, tag_value_t value, ...); 00189 00190 SOFIAPUBFUN void nta_leg_destroy(nta_leg_t *leg); 00191 00192 SOFIAPUBFUN nta_leg_t *nta_default_leg(nta_agent_t const *agent); 00193 00194 SOFIAPUBFUN nta_leg_magic_t *nta_leg_magic(nta_leg_t const *leg, 00195 nta_request_f *callback); 00196 00197 SOFIAPUBFUN void nta_leg_bind(nta_leg_t *leg, 00198 nta_request_f *callback, 00199 nta_leg_magic_t *); 00200 00202 SOFIAPUBFUN char const *nta_leg_tag(nta_leg_t *leg, char const *tag); 00203 00205 SOFIAPUBFUN char const *nta_leg_get_tag(nta_leg_t const *leg); 00206 00208 SOFIAPUBFUN char const *nta_leg_rtag(nta_leg_t *leg, char const *tag); 00209 00211 SOFIAPUBFUN char const *nta_leg_get_rtag(nta_leg_t const *leg); 00212 00214 SOFIAPUBFUN uint32_t nta_leg_get_seq(nta_leg_t const *leg); 00215 00217 SOFIAPUBFUN uint32_t nta_leg_get_rseq(nta_leg_t const *leg); 00218 00220 SOFIAPUBFUN int nta_leg_client_route(nta_leg_t *leg, 00221 sip_record_route_t const *route, 00222 sip_contact_t const *contact); 00223 00225 SOFIAPUBFUN int nta_leg_server_route(nta_leg_t *leg, 00226 sip_record_route_t const *route, 00227 sip_contact_t const *contact); 00228 00230 SOFIAPUBFUN int nta_leg_get_route(nta_leg_t *leg, 00231 sip_route_t const **return_route, 00232 sip_contact_t const **return_target); 00233 00235 SOFIAPUBFUN nta_leg_t *nta_leg_by_uri(nta_agent_t const *, 00236 url_string_t const *); 00237 00239 SOFIAPUBFUN 00240 nta_leg_t *nta_leg_by_dialog(nta_agent_t const *agent, 00241 url_t const *request_uri, 00242 sip_call_id_t const *call_id, 00243 char const *from_tag, 00244 url_t const *from_url, 00245 char const *to_tag, 00246 url_t const *to_url); 00247 00249 SOFIAPUBFUN sip_replaces_t *nta_leg_make_replaces(nta_leg_t *leg, 00250 su_home_t *home, 00251 int early_only); 00253 SOFIAPUBFUN 00254 nta_leg_t *nta_leg_by_replaces(nta_agent_t *, sip_replaces_t const *); 00255 00257 SOFIAPUBFUN 00258 nta_leg_t *nta_leg_by_call_id(nta_agent_t *sa, const char *call_id); 00259 00260 /* ---------------------------------------------------------------------- 00261 * 6) Prototypes for incoming transactions 00262 */ 00263 00264 SOFIAPUBFUN 00265 nta_incoming_t *nta_incoming_create(nta_agent_t *agent, 00266 nta_leg_t *leg, 00267 msg_t *msg, 00268 sip_t *sip, 00269 tag_type_t tag, tag_value_t value, ...); 00270 00271 SOFIAPUBFUN nta_incoming_t *nta_incoming_default(nta_agent_t *agent); 00272 00273 typedef int nta_ack_cancel_f(nta_incoming_magic_t *imagic, 00274 nta_incoming_t *irq, 00275 sip_t const *sip); 00276 00277 SOFIAPUBFUN void nta_incoming_bind(nta_incoming_t *irq, 00278 nta_ack_cancel_f *callback, 00279 nta_incoming_magic_t *imagic); 00280 00281 SOFIAPUBFUN 00282 nta_incoming_magic_t *nta_incoming_magic(nta_incoming_t *irq, 00283 nta_ack_cancel_f *callback); 00284 00285 SOFIAPUBFUN 00286 nta_incoming_t *nta_incoming_find(nta_agent_t const *agent, 00287 sip_t const *sip, 00288 sip_via_t const *v); 00289 00290 SOFIAPUBFUN char const *nta_incoming_tag(nta_incoming_t *irq, char const *tag); 00291 SOFIAPUBFUN char const *nta_incoming_gettag(nta_incoming_t const *irq); 00292 00293 SOFIAPUBFUN int nta_incoming_status(nta_incoming_t const *irq); 00294 SOFIAPUBFUN sip_method_t nta_incoming_method(nta_incoming_t const *irq); 00295 SOFIAPUBFUN char const *nta_incoming_method_name(nta_incoming_t const *irq); 00296 SOFIAPUBFUN url_t const *nta_incoming_url(nta_incoming_t const *irq); 00297 SOFIAPUBFUN uint32_t nta_incoming_cseq(nta_incoming_t const *irq); 00298 SOFIAPUBFUN sip_time_t nta_incoming_received(nta_incoming_t *irq, su_nanotime_t *nano); 00299 00300 SOFIAPUBFUN int nta_incoming_set_params(nta_incoming_t *irq, 00301 tag_type_t tag, tag_value_t value, ...); 00302 00303 SOFIAPUBFUN msg_t *nta_incoming_getrequest(nta_incoming_t *irq); 00304 SOFIAPUBFUN msg_t *nta_incoming_getrequest_ackcancel(nta_incoming_t *irq); 00305 SOFIAPUBFUN msg_t *nta_incoming_getresponse(nta_incoming_t *irq); 00306 00307 SOFIAPUBFUN 00308 int nta_incoming_complete_response(nta_incoming_t *irq, 00309 msg_t *msg, 00310 int status, 00311 char const *phrase, 00312 tag_type_t tag, tag_value_t value, ...); 00313 00314 SOFIAPUBFUN 00315 msg_t *nta_incoming_create_response(nta_incoming_t *irq, int status, char const *phrase); 00316 00317 SOFIAPUBFUN 00318 int nta_incoming_treply(nta_incoming_t *ireq, 00319 int status, char const *phrase, 00320 tag_type_t tag, tag_value_t value, ...); 00321 00322 SOFIAPUBFUN int nta_incoming_mreply(nta_incoming_t *irq, msg_t *msg); 00323 00324 SOFIAPUBFUN void nta_incoming_destroy(nta_incoming_t *irq); 00325 00326 /* Functions for feature, method, mime, session-timer negotation */ 00327 00328 SOFIAPUBFUN 00329 int nta_check_required(nta_incoming_t *irq, 00330 sip_t const *sip, 00331 sip_supported_t const *supported, 00332 tag_type_t tag, tag_value_t value, ...); 00333 SOFIAPUBFUN 00334 int nta_check_supported(nta_incoming_t *irq, 00335 sip_t const *sip, 00336 sip_require_t *require, 00337 tag_type_t tag, tag_value_t value, ...); 00338 SOFIAPUBFUN 00339 int nta_check_method(nta_incoming_t *irq, 00340 sip_t const *sip, 00341 sip_allow_t const *allow, 00342 tag_type_t tag, tag_value_t value, ...); 00343 SOFIAPUBFUN 00344 int nta_check_session_content(nta_incoming_t *irq, sip_t const *sip, 00345 sip_accept_t const *session_accepts, 00346 tag_type_t tag, tag_value_t value, ...); 00347 SOFIAPUBFUN 00348 int nta_check_accept(nta_incoming_t *irq, 00349 sip_t const *sip, 00350 sip_accept_t const *acceptable, 00351 sip_accept_t const **return_acceptable, 00352 tag_type_t tag, tag_value_t value, ...); 00353 00354 SOFIAPUBFUN 00355 int nta_check_session_expires(nta_incoming_t *irq, 00356 sip_t const *sip, 00357 sip_time_t my_min_se, 00358 tag_type_t tag, tag_value_t value, ...); 00359 00360 /* ---------------------------------------------------------------------- 00361 * 7) Prototypes for outgoing transactions 00362 */ 00363 typedef int nta_response_f(nta_outgoing_magic_t *magic, 00364 nta_outgoing_t *request, 00365 sip_t const *sip); 00366 00367 SOFIAPUBFUN 00368 nta_outgoing_t *nta_outgoing_tcreate(nta_leg_t *leg, 00369 nta_response_f *callback, 00370 nta_outgoing_magic_t *magic, 00371 url_string_t const *route_url, 00372 sip_method_t method, 00373 char const *method_name, 00374 url_string_t const *request_uri, 00375 tag_type_t tag, tag_value_t value, ...); 00376 00377 SOFIAPUBFUN 00378 nta_outgoing_t *nta_outgoing_mcreate(nta_agent_t *agent, 00379 nta_response_f *callback, 00380 nta_outgoing_magic_t *magic, 00381 url_string_t const *route_url, 00382 msg_t *msg, 00383 tag_type_t tag, tag_value_t value, ...); 00384 00385 SOFIAPUBFUN 00386 nta_outgoing_t *nta_outgoing_default(nta_agent_t *agent, 00387 nta_response_f *callback, 00388 nta_outgoing_magic_t *magic); 00389 00390 SOFIAPUBFUN int nta_outgoing_bind(nta_outgoing_t *orq, 00391 nta_response_f *callback, 00392 nta_outgoing_magic_t *magic); 00393 SOFIAPUBFUN int nta_outgoing_status(nta_outgoing_t const *orq); 00394 SOFIAPUBFUN sip_method_t nta_outgoing_method(nta_outgoing_t const *orq); 00395 SOFIAPUBFUN char const *nta_outgoing_method_name(nta_outgoing_t const *orq); 00396 SOFIAPUBFUN uint32_t nta_outgoing_cseq(nta_outgoing_t const *orq); 00397 SOFIAPUBFUN char const *nta_outgoing_branch(nta_outgoing_t const *orq); 00398 00399 SOFIAPUBFUN unsigned nta_outgoing_delay(nta_outgoing_t const *orq); 00400 00401 SOFIAPUBFUN url_t const *nta_outgoing_request_uri(nta_outgoing_t const *orq); 00402 SOFIAPUBFUN url_t const *nta_outgoing_route_uri(nta_outgoing_t const *orq); 00403 00404 SOFIAPUBFUN msg_t *nta_outgoing_getresponse(nta_outgoing_t *orq); 00405 SOFIAPUBFUN msg_t *nta_outgoing_getrequest(nta_outgoing_t *orq); 00406 00407 SOFIAPUBFUN 00408 nta_outgoing_t *nta_outgoing_tagged(nta_outgoing_t *orq, 00409 nta_response_f *callback, 00410 nta_outgoing_magic_t *magic, 00411 char const *to_tag, 00412 sip_rseq_t const *rseq); 00413 00414 SOFIAPUBFUN int nta_outgoing_cancel(nta_outgoing_t *); 00415 00416 SOFIAPUBFUN 00417 nta_outgoing_t *nta_outgoing_tcancel(nta_outgoing_t *orq, 00418 nta_response_f *callback, 00419 nta_outgoing_magic_t *magic, 00420 tag_type_t, tag_value_t, ...); 00421 00422 SOFIAPUBFUN void nta_outgoing_destroy(nta_outgoing_t *); 00423 00424 SOFIAPUBFUN 00425 nta_outgoing_t *nta_outgoing_find(nta_agent_t const *sa, 00426 msg_t const *msg, 00427 sip_t const *sip, 00428 sip_via_t const *v); 00429 00430 SOFIAPUBFUN int nta_tport_keepalive(nta_outgoing_t *orq); 00431 00432 /* ---------------------------------------------------------------------- 00433 * 8) Reliable provisional responses (100rel) 00434 */ 00435 00436 /* UAC side */ 00437 00438 SOFIAPUBFUN 00439 nta_outgoing_t *nta_outgoing_prack(nta_leg_t *leg, 00440 nta_outgoing_t *oorq, 00441 nta_response_f *callback, 00442 nta_outgoing_magic_t *magic, 00443 url_string_t const *route_url, 00444 sip_t const *response_to_prack, 00445 tag_type_t, tag_value_t, ...); 00446 00447 SOFIAPUBFUN uint32_t nta_outgoing_rseq(nta_outgoing_t const *orq); 00448 SOFIAPUBFUN int nta_outgoing_setrseq(nta_outgoing_t *orq, uint32_t rseq); 00449 00450 /* UAS side */ 00451 00453 typedef struct nta_reliable_s nta_reliable_t; 00454 00455 #ifndef NTA_RELIABLE_MAGIC_T 00456 00459 #define NTA_RELIABLE_MAGIC_T struct nta_reliable_magic_s 00460 #endif 00461 00463 typedef NTA_RELIABLE_MAGIC_T nta_reliable_magic_t; 00464 00465 typedef int nta_prack_f(nta_reliable_magic_t *rmagic, 00466 nta_reliable_t *rel, 00467 nta_incoming_t *prack, 00468 sip_t const *sip); 00469 00470 SOFIAPUBFUN 00471 nta_reliable_t *nta_reliable_treply(nta_incoming_t *ireq, 00472 nta_prack_f *callback, 00473 nta_reliable_magic_t *rmagic, 00474 int status, char const *phrase, 00475 tag_type_t tag, 00476 tag_value_t value, ...); 00477 00478 SOFIAPUBFUN 00479 nta_reliable_t *nta_reliable_mreply(nta_incoming_t *irq, 00480 nta_prack_f *callback, 00481 nta_reliable_magic_t *rmagic, 00482 msg_t *msg); 00483 00484 SOFIAPUBFUN void nta_reliable_destroy(nta_reliable_t *); 00485 00486 /* ---------------------------------------------------------------------- 00487 * Backward-compatibility stuff - going away soon 00488 */ 00489 00490 #define nta_outgoing_tmcreate nta_outgoing_mcreate 00491 #define nta_msg_response_complete(msg, irq, status, phrase) \ 00492 nta_incoming_complete_response((irq), (msg), (status), (phrase), TAG_END()) 00493 00494 SOFIAPUBFUN void nta_msg_discard(nta_agent_t *agent, msg_t *msg); 00495 00496 SOFIAPUBFUN int nta_is_internal_msg(msg_t const *msg); 00497 00498 SOFIA_END_DECLS 00499 00500 #endif