int timer_pdomain(pdomain_t* _d) { struct presentity* presentity, *t; lock_pdomain(_d); presentity = _d->first; if (0) LOG(L_ERR, "timer_pdomain: _d=%s d->first=%p\n", _d->name->s, presentity); while(presentity) { if (timer_presentity(presentity) < 0) { LOG(L_ERR, "timer_pdomain(): Error in timer_pdomain\n"); unlock_pdomain(_d); return -1; } /* Remove the entire record * if it is empty */ if (presentity->watchers == 0 && presentity->winfo_watchers==0) { t = presentity; presentity = presentity->next; remove_presentity(_d, t); free_presentity(t); } else { presentity = presentity->next; } } unlock_pdomain(_d); return 0; }
/* * Create a new presentity */ int new_presentity(struct pdomain *pdomain, str* _uri, str *uid, xcap_query_params_t *params, presentity_t** _p) { int res = 0; res = new_presentity_no_wb(pdomain, _uri, uid, params, NULL, _p); if (res != 0) return res; if (use_db) { if (db_add_presentity(*_p) != 0) { paerrno = PA_INTERNAL_ERROR; free_presentity(*_p); *_p = NULL; return -1; } } return res; }
/* * Create a new presentity and corresponding watcher list */ int create_presentity(struct sip_msg* _m, struct pdomain* _d, str* _puri, struct presentity** _p, struct watcher** _w) { time_t e; dlg_t* dialog; str watch_uri; str watch_dn; event_t *event = NULL; int et = 0; if (_m->event) { event = (event_t*)(_m->event->parsed); et = event->parsed; } else { et = EVENT_PRESENCE; } if (_m->expires) { e = ((exp_body_t*)_m->expires->parsed)->val; } else { e = default_expires; } if (e == 0) { *_p = 0; *_w = 0; DBG("create_presentity(): expires = 0\n"); return 0; } /* Convert to absolute time */ e += act_time; if (get_watch_uri(_m, &watch_uri, &watch_dn) < 0) { LOG(L_ERR, "create_presentity(): Error while extracting watcher URI\n"); return -1; } if (new_presentity(_d, _puri, _p) < 0) { LOG(L_ERR, "create_presentity(): Error while creating presentity\n"); return -2; } if (tmb.new_dlg_uas(_m, 200, &dialog) < 0) { paerrno = PA_DIALOG_ERR; LOG(L_ERR, "create_presentity(): Error while creating dialog state\n"); free_presentity(*_p); return -3; } if (et != EVENT_PRESENCE_WINFO) { if (add_watcher(*_p, &watch_uri, e, et, acc, dialog, &watch_dn, _w) < 0) { LOG(L_ERR, "create_presentity(): Error while adding a watcher\n"); tmb.free_dlg(dialog); free_presentity(*_p); return -4; } } else if (et == EVENT_PRESENCE_WINFO) { if (add_winfo_watcher(*_p, &watch_uri, e, et, acc, dialog, &watch_dn, _w) < 0) { LOG(L_ERR, "create_presentity(): Error while adding a winfo watcher\n"); tmb.free_dlg(dialog); free_presentity(*_p); return -5; } } add_presentity(_d, *_p); _d->reg(&watch_uri, _puri, (void*)callback, *_p); return 0; }