/*! * \brief Print a dialog context via the MI interface * \param cmd_tree MI command tree * \param param unused * \return mi node with the dialog information, or NULL on failure */ struct mi_root * mi_print_dlgs_ctx(struct mi_root *cmd_tree, void *param ) { struct mi_root* rpl_tree= NULL; struct mi_node* rpl = NULL; struct dlg_cell* dlg = NULL; rpl_tree = process_mi_params( cmd_tree, &dlg); if (rpl_tree) /* param error */ return rpl_tree; rpl_tree = init_mi_tree( 200, MI_SSTR(MI_OK)); if (rpl_tree==0) return 0; rpl = &rpl_tree->node; if (dlg==NULL) { if ( internal_mi_print_dlgs(rpl,1)!=0 ) goto error; } else { if ( internal_mi_print_dlg(rpl,dlg,1)!=0 ) goto error; } return rpl_tree; error: free_mi_tree(rpl_tree); return NULL; }
struct mi_root * mi_print_dlgs_ctx(struct mi_root *cmd_tree, void *param ) { struct mi_root* rpl_tree= NULL; struct mi_node* rpl = NULL; struct dlg_cell* dlg = NULL; unsigned int idx,cnt; rpl_tree = process_mi_params( cmd_tree, &dlg, &idx, &cnt); if (rpl_tree) /* param error */ return rpl_tree; rpl_tree = init_mi_tree( 200, MI_SSTR(MI_OK)); if (rpl_tree==0) goto error; rpl = &rpl_tree->node; if (dlg==NULL) { if ( internal_mi_print_dlgs(rpl_tree, rpl, 1, idx, cnt)!=0 ) goto error; } else { if ( internal_mi_print_dlg(rpl,dlg,1)!=0 ) goto error; /* done with the dialog -> unlock it */ dlg_unlock_dlg(dlg); } return rpl_tree; error: /* if a dialog ref was returned, unlock it now */ if (dlg) dlg_unlock_dlg(dlg); /* trash everything that was built so far */ if (rpl_tree) free_mi_tree(rpl_tree); return NULL; }
static int internal_mi_print_dlgs(struct mi_root *rpl_tree,struct mi_node *rpl, int with_context, unsigned int idx, unsigned int cnt) { struct dlg_cell *dlg; unsigned int i; unsigned int n; unsigned int total; char *p; total = 0; if (cnt) { for(i=0;i<d_table->size ; total+=d_table->entries[i++].cnt ); p = int2str((unsigned long)total, (int*)&n); if (add_mi_node_child(rpl,MI_DUP_VALUE,"dlg_counter",11,p,n)==0) return -1; } LM_DBG("printing %i dialogs, idx=%d, cnt=%d\n", total,idx,cnt); rpl->flags |= MI_NOT_COMPLETED; for( i=0,n=0 ; i<d_table->size ; i++ ) { dlg_lock( d_table, &(d_table->entries[i]) ); for( dlg=d_table->entries[i].first ; dlg ; dlg=dlg->next ) { if (cnt && n<idx) {n++;continue;} if (internal_mi_print_dlg(rpl, dlg, with_context)!=0) goto error; n++; if (cnt && n>=idx+cnt) { dlg_unlock( d_table, &(d_table->entries[i]) ); return 0; } if ( (n % 50) == 0 ) flush_mi_tree(rpl_tree); } dlg_unlock( d_table, &(d_table->entries[i]) ); } return 0; error: dlg_unlock( d_table, &(d_table->entries[i]) ); LM_ERR("failed to print dialog\n"); return -1; }
/*! * \brief Helper function that output all dialogs via the MI interface * \see mi_print_dlgs * \param rpl MI node that should be filled * \param with_context if 1 then the dialog context will be also printed * \return 0 on success, -1 on failure */ static int internal_mi_print_dlgs(struct mi_node *rpl, int with_context) { struct dlg_cell *dlg; unsigned int i; LM_DBG("printing %i dialogs\n", d_table->size); for( i=0 ; i<d_table->size ; i++ ) { dlg_lock( d_table, &(d_table->entries[i]) ); for( dlg=d_table->entries[i].first ; dlg ; dlg=dlg->next ) { if (internal_mi_print_dlg(rpl, dlg, with_context)!=0) goto error; } dlg_unlock( d_table, &(d_table->entries[i]) ); } return 0; error: dlg_unlock( d_table, &(d_table->entries[i]) ); LM_ERR("failed to print dialog\n"); return -1; }
/*! * \brief Output a dialog via the MI interface * \param rpl MI node that should be filled * \param dlg printed dialog * \param with_context if 1 then the dialog context will be also printed * \return 0 on success, -1 on failure */ int mi_print_dlg(struct mi_node *rpl, struct dlg_cell *dlg, int with_context) { return internal_mi_print_dlg( rpl, dlg, with_context); }