nua_common.c 6.91 KB
Newer Older
Pekka Pessi's avatar
Pekka Pessi committed
1 2 3 4 5 6 7
/*
 * This file is part of the Sofia-SIP package
 *
 * Copyright (C) 2005 Nokia Corporation.
 *
 * Contact: Pekka Pessi <pekka.pessi@nokia.com>
 *
8
 * This library is free software; you can redistribute it and/or
Pekka Pessi's avatar
Pekka Pessi committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA
 *
 */

/**
 * @file nua_common.c
 * @brief 
 * 
 * @author Pekka.Pessi@nokia.com
 * 
 * @date Created: Tue Apr 26 13:23:17 2005 ppessi
 * 
 */

#include "config.h"

#include <stddef.h>
#include <stdlib.h>
#include <string.h>

#include <assert.h>

#include <su_tag_class.h>
#include <su_tag_class.h>
#include <su_tagarg.h>

#include <stdio.h>

#include <su_tag_io.h>

#define SU_LOG (nua_log)
#include <su_debug.h>

#define SU_ROOT_MAGIC_T   struct nua_s
#define SU_MSG_ARG_T      struct event_s

#include <su_wait.h>

#include <su_strlst.h>

#include "nua.h"
#include "nua_tag.h"

#include <sip_protos.h>
#include <nta.h>
#include <nea.h>

#include <auth_client.h>
#if HAVE_SMIME 		/* Start NRC Boston */
#include "smimec.h"
#endif                  /* End NRC Boston */

#include <sdp.h>

#include "nua_stack.h"

/** Create an operation handle 
 *
 * Allocates a new operation handle and associated storage.
 *
 * @param nua         Pointer to NUA stack object
 * @param hmagic      Pointer to callback context
 * @param tags        List of tagged parameters
 *
 * @retval non-NULL  Pointer to operation handle
 * @retval NULL    Creation failed
 *
 * @par Related tags:
 *     Creates a copy of provided tags and they will 
 *     be used with every operation.
 *
 * @par Events:
 *     none
 *
 * @note
 * This function is called by both stack and application sides.
 */
nua_handle_t *nh_create_handle(nua_t *nua, nua_hmagic_t *hmagic,
			       tagi_t *tags)
{
  nua_handle_t *nh;

  enter;

  assert(nua->nua_home);

  if ((nh = su_home_clone(nua->nua_home, sizeof(*nh)))) {
    url_string_t const *url = NULL;
    sip_to_t to[1];
    sip_to_t const *p_to = NULL;
    sip_from_t from[1];
    sip_from_t const *p_from = NULL;

    tl_gets(tags,	/* These does not change while nh lives */
	    SIPTAG_FROM_REF(p_from),
	    SIPTAG_TO_REF(p_to),
	    NUTAG_URL_REF(url),
	    TAG_END());

    if (!p_from && nua->nua_from) {
      *from = *nua->nua_from;
      from->a_params = NULL;
Pekka Pessi's avatar
Pekka Pessi committed
123 124
    }
    else {
Pekka Pessi's avatar
Pekka Pessi committed
125 126 127
      p_from = (void *)-1;
    }

128 129
    nh->nh_prefs = nua->nua_dhandle->nh_prefs;

Pekka Pessi's avatar
Pekka Pessi committed
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
    if (!p_to && url) {
      void *tbf = NULL;

      if (url_is_string(url))
	url = tbf = url_hdup(nh->nh_home, url->us_url);

      *sip_to_init(to)->a_url = *url->us_url;

      to->a_url->url_params = NULL;
      to->a_url->url_headers = NULL;

      nh->nh_ds->ds_remote = sip_to_dup(nh->nh_home, to);
      
      if (tbf)
	su_free(nh->nh_home, tbf);
Pekka Pessi's avatar
Pekka Pessi committed
145 146
    }
    else {
Pekka Pessi's avatar
Pekka Pessi committed
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
      p_to = (void *)-1;
    }

#if HAVE_PTHREAD_H
    pthread_rwlock_init(nh->nh_refcount, NULL);
#endif

    nh->nh_valid = nua_handle;
    nh->nh_nua = nua;
    nh->nh_magic = hmagic;
    nh->nh_tags = tl_tlist(nh->nh_home, 
			   TAG_IF(!p_from, SIPTAG_FROM(from)),
			   TAG_IF(!p_to, SIPTAG_TO(to)),
			   TAG_NEXT(tags));

    tl_gets(nh->nh_tags,	/* These does not change while nh lives */
	    SIPTAG_FROM_REF(nh->nh_ds->ds_local),
	    SIPTAG_TO_REF(nh->nh_ds->ds_remote),
	    TAG_END());
  }

  return nh_incref(nh);
}
170 171 172 173 174 175 176

/** Get name for a NUA event. */
char const *nua_event_name(nua_event_t event)
{
  switch (event) {
  case nua_i_error: return "nua_i_error";
  case nua_i_invite: return "nua_i_invite";
177 178 179
  case nua_i_cancel: return "nua_i_cancel";
  case nua_i_ack: return "nua_i_ack";

180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
  case nua_i_fork: return "nua_i_fork";
  case nua_i_active: return "nua_i_active";
  case nua_i_terminated: return "nua_i_terminated";
  case nua_i_state: return "nua_i_state";

  case nua_i_bye: return "nua_i_bye";
  case nua_i_options: return "nua_i_options";
  case nua_i_refer: return "nua_i_refer";
  case nua_i_publish: return "nua_i_publish";
  case nua_i_prack: return "nua_i_prack";
  case nua_i_info: return "nua_i_info";
  case nua_i_update: return "nua_i_update";
  case nua_i_message: return "nua_i_message";
  case nua_i_chat: return "nua_i_chat";
  case nua_i_subscribe: return "nua_i_subscribe";
195
  case nua_i_subscription: return "nua_i_subscription";
196 197 198
  case nua_i_notify: return "nua_i_notify";
  case nua_i_method: return "nua_i_method";

199 200
  case nua_i_subscription: return "nua_i_subscription";

201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
  case nua_i_media_error: return "nua_i_media_error";

  /* Responses */
  case nua_r_get_params: return "nua_r_get_params";
  case nua_r_shutdown: return "nua_r_shutdown";
  case nua_r_notifier: return "nua_r_notifier";
  case nua_r_terminate: return "nua_r_terminate";

  case nua_r_register: return "nua_r_register";
  case nua_r_unregister: return "nua_r_unregister";
  case nua_r_invite: return "nua_r_invite";
  case nua_r_bye: return "nua_r_bye";
  case nua_r_options: return "nua_r_options";
  case nua_r_refer: return "nua_r_refer";
  case nua_r_publish: return "nua_r_publish";
  case nua_r_unpublish: return "nua_r_unpublish";
  case nua_r_info: return "nua_r_info";
  case nua_r_update: return "nua_r_update";
  case nua_r_message: return "nua_r_message";
  case nua_r_chat: return "nua_r_chat";
  case nua_r_subscribe: return "nua_r_subscribe";
  case nua_r_unsubscribe: return "nua_r_unsubscribe";
  case nua_r_notify: return "nua_r_notify";
  case nua_r_method: return "nua_r_method";

  case nua_r_cancel: return "nua_r_cancel";
  case nua_r_authenticate: return "nua_r_authenticate";
228
  case nua_r_authorize: return "nua_r_authorize";
229 230 231 232 233 234 235 236 237
  case nua_r_redirect: return "nua_r_redirect";
  case nua_r_destroy: return "nua_r_destroy";
  case nua_r_respond: return "nua_r_respond";
  case nua_r_nit_respond: return "nua_r_nit_respond";
  case nua_r_set_params: return "nua_r_set_params";
  case nua_r_ack: return "nua_r_ack";
  default: return "NUA_UNKNOWN";
  }
}
Pekka Pessi's avatar
Pekka Pessi committed
238 239 240 241 242 243 244 245

/** Return name of call state */
char const *nua_callstate_name(enum nua_callstate state)
{
  switch (state) {
  case nua_callstate_init: return "init";
  case nua_callstate_calling: return "calling";
  case nua_callstate_proceeding: return "proceeding";
246
  case nua_callstate_completing: return "completing";
Pekka Pessi's avatar
Pekka Pessi committed
247 248
  case nua_callstate_received: return "received";
  case nua_callstate_early: return "early";
249
  case nua_callstate_completed: return "completed";
Pekka Pessi's avatar
Pekka Pessi committed
250 251 252 253 254 255 256
  case nua_callstate_ready: return "ready";
  case nua_callstate_terminating: return "terminating";
  case nua_callstate_terminated: return "terminated";
  default: return "UNKNOWN";
  }
}