0
};
+/*! \brief
+ * rpc cmd: presence.presentity_list
+ * \mode - output attributes control
+ * * */
+void rpc_presence_presentity_list(rpc_t *rpc, void *ctx)
+{
+ str omode = {0, 0};
+ int imode = 0;
+ int i = 0;
+ ps_ptable_t *ptb = NULL;
+ ps_presentity_t *ptn = NULL;
+ void* th = NULL;
+ str pempty = str_init("");
+
+ LM_DBG("listing in memory presentity records\n");
+
+ imode = rpc->scan(ctx, "*S", &omode);
+ if(imode < 1) {
+ imode = 0;
+ } else {
+ if(omode.len == 4 && strncmp(omode.s, "full", 4)==0) {
+ imode = 1;
+ } else {
+ imode = 0;
+ }
+ }
+ ptb = ps_ptable_get();
+ if(ptb == NULL) {
+ return;
+ }
+
+ for(i=0; i<ptb->ssize; i++) {
+ lock_get(&ptb->slots[i].lock);
+ ptn = ptb->slots[i].plist;
+ while(ptn!=NULL) {
+ /* add record node */
+ if (rpc->add(ctx, "{", &th) < 0) {
+ rpc->fault(ctx, 500, "Internal error creating rpc");
+ lock_release(&ptb->slots[i].lock);
+ return;
+ }
+ /* add common fields */
+ if(rpc->struct_add(th, "SSSSSd",
+ "user", &ptn->user,
+ "domain", &ptn->domain,
+ "event", &ptn->event,
+ "etag", &ptn->etag,
+ "sender", (ptn->sender.s)?&ptn->sender:&pempty,
+ "expires", ptn->expires)<0) {
+ rpc->fault(ctx, 500, "Internal error adding item");
+ lock_release(&ptb->slots[i].lock);
+ return;
+ }
+ if(imode==1) {
+ /* add extra fields */
+ if(rpc->struct_add(th, "ddSSd",
+ "received_time", ptn->received_time,
+ "priority", ptn->priority,
+ "ruid", (ptn->ruid.s)?&ptn->ruid:&pempty,
+ "body", (ptn->body.s)?&ptn->body:&pempty,
+ "hashid", ptn->hashid)<0) {
+ rpc->fault(ctx, 500, "Internal error adding item");
+ lock_release(&ptb->slots[i].lock);
+ return;
+ }
+ }
+ ptn = ptn->next;
+ }
+ lock_release(&ptb->slots[i].lock);
+ }
+ return;
+}
+
+static const char *rpc_presence_presentity_list_doc[2] = {
+ "Trigger update of watchers",
+ 0
+};
rpc_export_t presence_rpc[] = {
{"presence.cleanup", rpc_presence_cleanup, rpc_presence_cleanup_doc, 0},
rpc_presence_refresh_watchers_doc, 0},
{"presence.updateWatchers", rpc_presence_update_watchers,
rpc_presence_update_watchers_doc, 0},
+ {"presence.presentity_list", rpc_presence_presentity_list,
+ rpc_presence_presentity_list_doc, 0},
{0, 0, 0, 0}
};