forked from Mirrors/sngrep
Call list can be cleared by pressing F5
This commit is contained in:
parent
24f2cebb36
commit
d585086b75
78
src/sip.c
78
src/sip.c
|
@ -127,6 +127,29 @@ sip_msg_create(const char *header, const char *payload)
|
|||
return msg;
|
||||
}
|
||||
|
||||
void
|
||||
sip_msg_destroy(sip_msg_t *msg)
|
||||
{
|
||||
sip_msg_t *prev = NULL;
|
||||
|
||||
if (!msg) return;
|
||||
|
||||
// If the message belongs to a call, remove it from
|
||||
// its message list
|
||||
if (msg->call) {
|
||||
if ((prev = call_get_prev_msg(msg->call, msg))) {
|
||||
prev->next = msg->next;
|
||||
} else {
|
||||
msg->call->msgs = msg->next;
|
||||
}
|
||||
}
|
||||
|
||||
// Free all memory
|
||||
free(msg->headerptr);
|
||||
free(msg->payload);
|
||||
free(msg);
|
||||
}
|
||||
|
||||
sip_call_t *
|
||||
sip_call_create(char *callid)
|
||||
{
|
||||
|
@ -162,6 +185,24 @@ sip_call_create(char *callid)
|
|||
return call;
|
||||
}
|
||||
|
||||
void
|
||||
sip_call_destroy(sip_call_t *call)
|
||||
{
|
||||
sip_call_t *prev = NULL;
|
||||
sip_msg_t *msg = NULL;
|
||||
|
||||
// No call to destroy
|
||||
if (!call) return;
|
||||
|
||||
// Get previous message
|
||||
//for (msg = call->msgs; msg; msg = msg->next)
|
||||
// sip_msg_destroy(msg);
|
||||
|
||||
// Free it!
|
||||
free(call);
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
sip_get_callid(const char* payload)
|
||||
{
|
||||
|
@ -216,14 +257,16 @@ sip_load_message(const char *header, const char *payload)
|
|||
&& strncasecmp(method, "REGISTER", 8) && strncasecmp(method, "SUBSCRIBE", 9)
|
||||
&& strncasecmp(method, "OPTIONS", 7) && strncasecmp(method, "PUBLISH", 7)
|
||||
&& strncasecmp(method, "MESSAGE", 7) && strncasecmp(method, "NOTIFY", 6)){
|
||||
//@todo sip_msg_destroy();
|
||||
// Deallocate message memory
|
||||
sip_msg_destroy(msg);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Create the call if not found
|
||||
if (!(call = sip_call_create(callid))) {
|
||||
//@todo sip_msg_destroy();
|
||||
// Deallocate message memory
|
||||
sip_msg_destroy(msg);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
@ -242,11 +285,13 @@ int
|
|||
sip_calls_count()
|
||||
{
|
||||
int callcnt = 0;
|
||||
pthread_mutex_lock(&calls_lock);
|
||||
sip_call_t *call = calls;
|
||||
while (call) {
|
||||
if (!sip_check_call_ignore(call)) callcnt++;
|
||||
call = call->next;
|
||||
}
|
||||
pthread_mutex_unlock(&calls_lock);
|
||||
return callcnt;
|
||||
}
|
||||
|
||||
|
@ -256,6 +301,7 @@ sip_check_call_ignore(sip_call_t *call)
|
|||
int i;
|
||||
char filter_option[80];
|
||||
const char *filter;
|
||||
|
||||
// Check if an ignore option exists
|
||||
for (i = 0; i < sizeof(attrs) / sizeof(*attrs); i++) {
|
||||
if (is_ignored_value(attrs[i].name, call_get_attribute(call, attrs[i].id))) {
|
||||
|
@ -312,7 +358,6 @@ const char *
|
|||
sip_attr_get_description(enum sip_attr_id id)
|
||||
{
|
||||
sip_attr_hdr_t *header;
|
||||
|
||||
if ((header = sip_attr_get_header(id))) {
|
||||
return header->desc;
|
||||
}
|
||||
|
@ -323,7 +368,6 @@ const char *
|
|||
sip_attr_get_name(enum sip_attr_id id)
|
||||
{
|
||||
sip_attr_hdr_t *header;
|
||||
|
||||
if ((header = sip_attr_get_header(id))) {
|
||||
return header->name;
|
||||
}
|
||||
|
@ -383,6 +427,7 @@ call_add_message(sip_call_t *call, sip_msg_t *msg)
|
|||
pthread_mutex_lock(&call->lock);
|
||||
// Set the message owner
|
||||
msg->call = call;
|
||||
|
||||
// XXX Put this msg at the end of the msg list
|
||||
// Order is important!!!
|
||||
if (!call->msgs) {
|
||||
|
@ -399,16 +444,18 @@ sip_call_t *
|
|||
call_find_by_callid(const char *callid)
|
||||
{
|
||||
const char *cur_callid;
|
||||
pthread_mutex_lock(&calls_lock);
|
||||
sip_call_t *cur = calls;
|
||||
// XXX LOCKING
|
||||
|
||||
while (cur) {
|
||||
cur_callid = call_get_attribute(cur, SIP_ATTR_CALLID);
|
||||
if (cur_callid && !strcmp(cur_callid, callid)) {
|
||||
pthread_mutex_unlock(&calls_lock);
|
||||
return cur;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
pthread_mutex_unlock(&calls_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -416,15 +463,19 @@ sip_call_t *
|
|||
call_find_by_xcallid(const char *xcallid)
|
||||
{
|
||||
const char *cur_xcallid;
|
||||
|
||||
pthread_mutex_lock(&calls_lock);
|
||||
sip_call_t *cur = calls;
|
||||
|
||||
while (cur) {
|
||||
cur_xcallid = call_get_attribute(cur, SIP_ATTR_XCALLID);
|
||||
if (cur_xcallid && !strcmp(cur_xcallid, xcallid)) {
|
||||
pthread_mutex_unlock(&calls_lock);
|
||||
return cur;
|
||||
}
|
||||
cur = cur->next;
|
||||
}
|
||||
pthread_mutex_unlock(&calls_lock);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -609,7 +660,6 @@ msg_parse_payload(sip_msg_t *msg, const char *payload)
|
|||
char * pch;
|
||||
char value[256];
|
||||
char rest[256];
|
||||
int irest;
|
||||
|
||||
// Sanity check
|
||||
if (!msg || !payload) return 1;
|
||||
|
@ -704,3 +754,19 @@ msg_is_retrans(sip_msg_t *msg) {
|
|||
// All check passed, this package is equal to its previous
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
sip_calls_clear()
|
||||
{
|
||||
sip_call_t *call = NULL;
|
||||
pthread_mutex_lock(&calls_lock);
|
||||
|
||||
// Remove first call until no first call exists
|
||||
for (call = calls; call; call = call->next)
|
||||
sip_call_destroy(call);
|
||||
|
||||
// Initialize calls list header
|
||||
calls = NULL;
|
||||
|
||||
pthread_mutex_unlock(&calls_lock);
|
||||
}
|
||||
|
|
34
src/sip.h
34
src/sip.h
|
@ -189,6 +189,18 @@ struct sip_call
|
|||
extern sip_msg_t *
|
||||
sip_msg_create(const char *header, const char *payload);
|
||||
|
||||
/**
|
||||
* @brief Destroy a SIP message and free its memory
|
||||
*
|
||||
* Deallocate memory of an existing SIP Message.
|
||||
* This function will remove the message from the call and the
|
||||
* passed pointer will be NULL.
|
||||
*
|
||||
* @param msg SIP message to be deleted
|
||||
*/
|
||||
extern void
|
||||
sip_msg_destroy(sip_msg_t *msg);
|
||||
|
||||
/**
|
||||
* @brief Create a new call with the given callid (Minimum required data)
|
||||
*
|
||||
|
@ -201,6 +213,18 @@ sip_msg_create(const char *header, const char *payload);
|
|||
extern sip_call_t *
|
||||
sip_call_create(char *callid);
|
||||
|
||||
/**
|
||||
* @brief Free all related memory from a call and remove from call list
|
||||
*
|
||||
* Deallocate memory of an existing SIP Call.
|
||||
* This will also remove all messages, calling sip_msg_destroy for each
|
||||
* one.
|
||||
*
|
||||
* @param call Call to be destroyed
|
||||
*/
|
||||
extern void
|
||||
sip_call_destroy(sip_call_t *call);
|
||||
|
||||
/**
|
||||
* @brief Parses Call-ID header of a SIP message payload
|
||||
*
|
||||
|
@ -529,4 +553,14 @@ msg_get_attribute(sip_msg_t *msg, enum sip_attr_id id);
|
|||
extern int
|
||||
msg_is_retrans(sip_msg_t *msg);
|
||||
|
||||
/**
|
||||
* @brief Remove al calls
|
||||
*
|
||||
* This funtion will clear the call list invoking the destroy
|
||||
* function for each one.
|
||||
*/
|
||||
void
|
||||
sip_calls_clear();
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -327,7 +327,8 @@ call_flow_draw_message(PANEL *panel, sip_msg_t *msg, int cline)
|
|||
if ((prev = call_get_prev_msg(msg->call, msg))) {
|
||||
if (strcmp(msg_get_attribute(msg, SIP_ATTR_CSEQ),
|
||||
msg_get_attribute(prev, SIP_ATTR_CSEQ))) {
|
||||
info->group->color = msg->call->color = (info->group->color++ % 7) + 1;
|
||||
int color = info->group->color + 1;
|
||||
info->group->color = msg->call->color = (color % 7) + 1;
|
||||
}
|
||||
}
|
||||
msg->color = msg->call->color;
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#ifndef __UI_CALL_FLOW_EX_H
|
||||
#define __UI_CALL_FLOW_EX_H
|
||||
#include "ui_manager.h"
|
||||
#include "group.h"
|
||||
|
||||
//! Sorter declaration of struct call_flow_info
|
||||
typedef struct call_flow_info call_flow_info_t;
|
||||
|
|
|
@ -335,6 +335,12 @@ call_list_handle_key(PANEL *panel, int key)
|
|||
wait_for_input(next_panel);
|
||||
}
|
||||
break;
|
||||
case KEY_F(5):
|
||||
// Remove all stored calls
|
||||
sip_calls_clear();
|
||||
// Clear List
|
||||
call_list_clear(panel);
|
||||
break;
|
||||
case ' ':
|
||||
if (!info->cur_call) return -1;
|
||||
if (call_group_exists(info->group, info->cur_call)) {
|
||||
|
@ -469,7 +475,7 @@ call_list_exit_confirm(PANEL *panel)
|
|||
case KEY_LEFT:
|
||||
exit = 1;
|
||||
break;
|
||||
case 9:
|
||||
case 9:
|
||||
exit = (exit)?0:1;
|
||||
break;
|
||||
case 10:
|
||||
|
@ -502,8 +508,26 @@ call_list_filter_update(PANEL *panel)
|
|||
{
|
||||
|
||||
WINDOW *win = panel_window(panel);
|
||||
int height, width, i, startline = 8;
|
||||
|
||||
// Clear list
|
||||
call_list_clear(panel);
|
||||
|
||||
// Get Window dimensions
|
||||
int height, width;
|
||||
getmaxyx(win, height, width);
|
||||
|
||||
// Print filter info
|
||||
mvwprintw(win, 4, 2, "%*s", width - 4, "");
|
||||
if (is_option_enabled("filter.enable"))
|
||||
mvwprintw(win, 4, 2, "%s", "Display filter: TODO");
|
||||
}
|
||||
|
||||
void
|
||||
call_list_clear(PANEL *panel)
|
||||
{
|
||||
WINDOW *win = panel_window(panel);
|
||||
|
||||
int height, width, i, startline = 8;
|
||||
// Get panel info
|
||||
call_list_info_t *info = (call_list_info_t*) panel_userptr(panel);
|
||||
if (!info) return;
|
||||
|
@ -520,9 +544,5 @@ call_list_filter_update(PANEL *panel)
|
|||
for (i=0; i < info->linescnt; i++) {
|
||||
mvwprintw(win, startline++, 5, "%*s", width - 6, "");
|
||||
}
|
||||
|
||||
// Print filter info
|
||||
mvwprintw(win, 4, 2, "%*s", width - 4, "");
|
||||
if (is_option_enabled("filter.enable"))
|
||||
mvwprintw(win, 4, 2, "%s", "Display filter: TODO");
|
||||
}
|
||||
|
||||
|
|
|
@ -196,4 +196,14 @@ call_list_add_column(PANEL *panel, enum sip_attr_id id, const char* attr, const
|
|||
extern void
|
||||
call_list_filter_update(PANEL *panel);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Remove all calls from the list and calls storage
|
||||
*
|
||||
* This funtion will clear all call lines in the list
|
||||
* @param panel Call list panel pointer
|
||||
*/
|
||||
extern void
|
||||
call_list_clear(PANEL *panel);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -40,9 +40,7 @@ PANEL *
|
|||
call_raw_create()
|
||||
{
|
||||
PANEL *panel;
|
||||
WINDOW *win;
|
||||
call_raw_info_t *info;
|
||||
int height, width;
|
||||
|
||||
// Create a new panel to fill all the screen
|
||||
panel = new_panel(newwin(LINES, COLS, 0, 0));
|
||||
|
@ -137,7 +135,8 @@ call_raw_print_msg(PANEL *panel, sip_msg_t *msg)
|
|||
if ((prev = call_get_prev_msg(msg->call, msg))) {
|
||||
if (strcmp(msg_get_attribute(msg, SIP_ATTR_CSEQ),
|
||||
msg_get_attribute(prev, SIP_ATTR_CSEQ))) {
|
||||
info->group->color = msg->call->color = (info->group->color++ % 7) + 1;
|
||||
int color = info->group->color + 1;
|
||||
info->group->color = msg->call->color = (color % 7) + 1;
|
||||
}
|
||||
}
|
||||
msg->color = msg->call->color;
|
||||
|
@ -177,7 +176,6 @@ call_raw_print_msg(PANEL *panel, sip_msg_t *msg)
|
|||
int
|
||||
call_raw_handle_key(PANEL *panel, int key)
|
||||
{
|
||||
int i, rnpag_steps = 10;
|
||||
call_raw_info_t *info = (call_raw_info_t*) panel_userptr(panel);
|
||||
ui_t *next_panel;
|
||||
|
||||
|
|
Loading…
Reference in New Issue