/* Create client publish session */ pj_status_t SIPPresence::publish(SIPPresence *pres) { pj_status_t status; const pj_str_t STR_PRESENCE = CONST_PJ_STR("presence"); SIPAccount * acc = pres->getAccount(); pjsip_endpoint *endpt = ((SIPVoIPLink*) acc->getVoIPLink())->getEndpoint(); /* Create and init client publication session */ /* Create client publication */ status = pjsip_publishc_create(endpt, &my_publish_opt, pres, &publish_cb, &pres->publish_sess_); if (status != PJ_SUCCESS) { pres->publish_sess_ = NULL; ERROR("Failed to create a publish seesion."); return status; } /* Initialize client publication */ pj_str_t from = pj_strdup3(pres->pool_, acc->getFromUri().c_str()); status = pjsip_publishc_init(pres->publish_sess_, &STR_PRESENCE, &from, &from, &from, 0xFFFF); if (status != PJ_SUCCESS) { ERROR("Failed to init a publish session"); pres->publish_sess_ = NULL; return status; } /* Add credential for authentication */ if (acc->hasCredentials() and pjsip_publishc_set_credentials(pres->publish_sess_, acc->getCredentialCount(), acc->getCredInfo()) != PJ_SUCCESS) { ERROR("Could not initialize credentials for invite session authentication"); return status; } /* Set route-set */ // FIXME: is this really necessary? pjsip_regc *regc = acc->getRegistrationInfo(); if (regc and acc->hasServiceRoute()) pjsip_regc_set_route_set(regc, sip_utils::createRouteSet(acc->getServiceRoute(), pres->getPool())); /* Send initial PUBLISH request */ status = send_publish(pres); if (status != PJ_SUCCESS) return status; return PJ_SUCCESS; }
/* Create client publish session */ pj_status_t pjsua_pres_init_publish_acc(int acc_id) { const pj_str_t STR_PRESENCE = { "presence", 8 }; pjsua_acc_config *acc_cfg = &pjsua_var.acc[acc_id].cfg; pjsua_acc *acc = &pjsua_var.acc[acc_id]; pj_status_t status; /* Create and init client publication session */ if (acc_cfg->publish_enabled) { /* Create client publication */ status = pjsip_publishc_create(pjsua_var.endpt, 0, acc, &publish_cb, &acc->publish_sess); if (status != PJ_SUCCESS) { acc->publish_sess = NULL; return status; } /* Initialize client publication */ status = pjsip_publishc_init(acc->publish_sess, &STR_PRESENCE, &acc_cfg->id, &acc_cfg->id, &acc_cfg->id, PJSUA_PRES_TIMER); if (status != PJ_SUCCESS) { acc->publish_sess = NULL; return status; } /* Add credential for authentication */ if (acc->cred_cnt) { pjsip_publishc_set_credentials(acc->publish_sess, acc->cred_cnt, acc->cred); } /* Set route-set */ pjsip_publishc_set_route_set(acc->publish_sess, &acc->route_set); /* Send initial PUBLISH request */ if (acc->online_status != 0) { status = send_publish(acc_id, PJ_TRUE); if (status != PJ_SUCCESS) return status; } } else { acc->publish_sess = NULL; } return PJ_SUCCESS; }