summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsua-lib/pjsua_reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjsip/src/pjsua-lib/pjsua_reg.c')
-rw-r--r--pjsip/src/pjsua-lib/pjsua_reg.c167
1 files changed, 167 insertions, 0 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_reg.c b/pjsip/src/pjsua-lib/pjsua_reg.c
new file mode 100644
index 00000000..e18f7cc8
--- /dev/null
+++ b/pjsip/src/pjsua-lib/pjsua_reg.c
@@ -0,0 +1,167 @@
+/* $Id$ */
+/*
+ * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+#include <pjsua-lib/pjsua.h>
+
+
+/*
+ * pjsua_reg.c
+ *
+ * Client registration handler.
+ */
+
+#define THIS_FILE "pjsua_reg.c"
+
+
+/*
+ * This callback is called by pjsip_regc when outgoing register
+ * request has completed.
+ */
+static void regc_cb(struct pjsip_regc_cbparam *param)
+{
+
+ pjsua_acc *acc = param->token;
+
+ /*
+ * Print registration status.
+ */
+ if (param->status!=PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "SIP registration error",
+ param->status);
+ pjsip_regc_destroy(acc->regc);
+ acc->regc = NULL;
+
+ } else if (param->code < 0 || param->code >= 300) {
+ PJ_LOG(2, (THIS_FILE, "SIP registration failed, status=%d (%s)",
+ param->code,
+ pjsip_get_status_text(param->code)->ptr));
+ pjsip_regc_destroy(acc->regc);
+ acc->regc = NULL;
+
+ } else if (PJSIP_IS_STATUS_IN_CLASS(param->code, 200)) {
+
+ if (param->expiration < 1) {
+ pjsip_regc_destroy(acc->regc);
+ acc->regc = NULL;
+ PJ_LOG(3,(THIS_FILE, "%s: unregistration success",
+ acc->local_uri.ptr));
+ } else {
+ PJ_LOG(3, (THIS_FILE,
+ "%s: registration success, status=%d (%s), "
+ "will re-register in %d seconds",
+ acc->local_uri.ptr,
+ param->code,
+ pjsip_get_status_text(param->code)->ptr,
+ param->expiration));
+ }
+
+ } else {
+ PJ_LOG(4, (THIS_FILE, "SIP registration updated status=%d", param->code));
+ }
+
+ acc->reg_last_err = param->status;
+ acc->reg_last_code = param->code;
+
+ pjsua_ui_regc_on_state_changed(acc->index);
+}
+
+
+/*
+ * Update registration. If renew is false, then unregistration will be performed.
+ */
+void pjsua_regc_update(int acc_index, pj_bool_t renew)
+{
+ pj_status_t status;
+ pjsip_tx_data *tdata;
+
+ if (renew) {
+ if (pjsua.acc[acc_index].regc == NULL) {
+ status = pjsua_regc_init(acc_index);
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Unable to create registration",
+ status);
+ return;
+ }
+ }
+ status = pjsip_regc_register(pjsua.acc[acc_index].regc, 1, &tdata);
+ } else {
+ if (pjsua.acc[acc_index].regc == NULL) {
+ PJ_LOG(3,(THIS_FILE, "Currently not registered"));
+ return;
+ }
+ status = pjsip_regc_unregister(pjsua.acc[acc_index].regc, &tdata);
+ }
+
+ if (status == PJ_SUCCESS)
+ status = pjsip_regc_send( pjsua.acc[acc_index].regc, tdata );
+
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Unable to create/send REGISTER",
+ status);
+ } else {
+ PJ_LOG(3,(THIS_FILE, "%s sent",
+ (renew? "Registration" : "Unregistration")));
+ }
+}
+
+/*
+ * Initialize client registration.
+ */
+pj_status_t pjsua_regc_init(int acc_index)
+{
+ pj_status_t status;
+
+ /* initialize SIP registration if registrar is configured */
+ if (pjsua.acc[acc_index].reg_uri.slen) {
+
+ status = pjsip_regc_create( pjsua.endpt,
+ &pjsua.acc[acc_index],
+ &regc_cb,
+ &pjsua.acc[acc_index].regc);
+
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE, "Unable to create client registration",
+ status);
+ return status;
+ }
+
+
+ status = pjsip_regc_init( pjsua.acc[acc_index].regc,
+ &pjsua.acc[acc_index].reg_uri,
+ &pjsua.acc[acc_index].local_uri,
+ &pjsua.acc[acc_index].local_uri,
+ 1, &pjsua.acc[acc_index].contact_uri,
+ pjsua.acc[acc_index].reg_timeout);
+ if (status != PJ_SUCCESS) {
+ pjsua_perror(THIS_FILE,
+ "Client registration initialization error",
+ status);
+ return status;
+ }
+
+ pjsip_regc_set_credentials( pjsua.acc[acc_index].regc,
+ pjsua.cred_count,
+ pjsua.cred_info );
+
+ pjsip_regc_set_route_set( pjsua.acc[acc_index].regc,
+ &pjsua.acc[acc_index].route_set );
+ }
+
+ return PJ_SUCCESS;
+}
+