| /* $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_on_reg_state(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 = 0; |
| pjsip_tx_data *tdata = 0; |
| |
| 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; |
| } |
| } |
| if (!pjsua.acc[acc_index].regc) |
| 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; |
| |
| if (pjsua.acc[acc_index].reg_uri.slen == 0) { |
| PJ_LOG(3,(THIS_FILE, "Registrar URI is not specified")); |
| return PJ_SUCCESS; |
| } |
| |
| /* initialize SIP registration if registrar is configured */ |
| |
| status = pjsip_regc_create( pjsua.endpt, |
| &pjsua.acc[acc_index], |
| ®c_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; |
| } |
| |