Code comment and cleanup

This commit is contained in:
Kaian 2013-06-27 18:21:22 +02:00
parent bbca28e06e
commit 80aff89a91
4 changed files with 159 additions and 67 deletions

View File

@ -217,14 +217,13 @@ sip_calls_count()
int
sip_check_call_ignore(sip_call_t *call)
{
int ret = 0;
// ret |= is_ignored_value("sipfrom", call_get_attribute(call, SIP_ATTRIBUTE));
// ret |= is_ignored_value("sipto", call_get_attribute(call, "sipto"));
// ret |= is_ignored_value("msgcnt", call_get_attribute(call, "msgcnt"));
// ret |= is_ignored_value("msgcnt", call_get_attribute(call, "src"));
// ret |= is_ignored_value("dst", call_get_attribute(call, "dst"));
// ret |= is_ignored_value("starting", call_get_attribute(call, "starting"));
return ret;
int i;
for (i = 0; i < sizeof(attrs) / sizeof(*attrs); i++) {
if (is_ignored_value(attrs[i].name, call_get_attribute(call, attrs[i].id))) {
return 1;
}
}
return 0;
}
sip_attr_hdr_t *
@ -244,24 +243,26 @@ sip_attr_get_description(enum sip_attr_id id)
{
sip_attr_hdr_t *header;
if ((header = sip_attr_get_header(id))){
if ((header = sip_attr_get_header(id))) {
return header->desc;
}
return NULL;
}
const char *
sip_attr_get_name(enum sip_attr_id id){
sip_attr_get_name(enum sip_attr_id id)
{
sip_attr_hdr_t *header;
if ((header = sip_attr_get_header(id))){
if ((header = sip_attr_get_header(id))) {
return header->name;
}
return NULL;
}
enum sip_attr_id
sip_attr_from_name(const char *name){
sip_attr_from_name(const char *name)
{
int i;
for (i = 0; i < sizeof(attrs) / sizeof(*attrs); i++) {
if (!strcasecmp(name, attrs[i].name)) {
@ -466,6 +467,27 @@ call_get_prev(sip_call_t *cur)
return prev;
}
void
call_set_attribute(sip_call_t *call, enum sip_attr_id id, const char *value)
{
sip_attr_set(&call->attrs, id, value);
}
const char *
call_get_attribute(sip_call_t *call, enum sip_attr_id id)
{
char value[80];
if (id == SIP_ATTR_MSGCNT) {
// FIXME REALLY
sprintf(value, "%d", call_msg_count(call));
return strdup(value);
}
if (id == SIP_ATTR_STARTING) {
return msg_get_attribute(call_get_next_msg(call, NULL), SIP_ATTR_METHOD);
}
return msg_get_attribute(call_get_next_msg(call, NULL), id);
}
sip_msg_t *
msg_parse(sip_msg_t *msg)
{
@ -556,7 +578,9 @@ msg_parse_payload(sip_msg_t *msg, const char *payload)
continue;
}
if (sscanf(pch, "SIP/2.0 %[^\n]", value)) {
msg_set_attribute(msg, SIP_ATTR_METHOD, value);
if (!msg_get_attribute(msg, SIP_ATTR_METHOD)) {
msg_set_attribute(msg, SIP_ATTR_METHOD, value);
}
continue;
}
if (sscanf(pch, "CSeq: %d %[^\t\n\r]", &irest, value)) {
@ -582,27 +606,6 @@ msg_parse_payload(sip_msg_t *msg, const char *payload)
return 0;
}
void
call_set_attribute(sip_call_t *call, enum sip_attr_id id, const char *value)
{
sip_attr_set(&call->attrs, id, value);
}
const char *
call_get_attribute(sip_call_t *call, enum sip_attr_id id)
{
//char value[80];
// if (!strcasecmp(name, "msgcnt")) {
// // FIXME REALLY
// sprintf(value, "%d", call_msg_count(call));
// return strdup(value);
// }
// if (!strcasecmp(name, "starting")) {
// return msg_get_attribute(call_get_next_msg(call, NULL), "method");
// }
return msg_get_attribute(call_get_next_msg(call, NULL), id);
}
void
msg_set_attribute(sip_msg_t *msg, enum sip_attr_id id, const char *value)
{

146
src/sip.h
View File

@ -52,15 +52,25 @@ typedef struct sip_attr sip_attr_t;
*/
enum sip_attr_id
{
//! SIP Message From: header
SIP_ATTR_SIPFROM = 1,
//! SIP Message To: header
SIP_ATTR_SIPTO,
//! Package IP source address and port
SIP_ATTR_SRC,
//! Package IP destiny address and port
SIP_ATTR_DST,
//! SIP Message Call-ID header
SIP_ATTR_CALLID,
//! SIP Message X-Call-ID or X-CID header
SIP_ATTR_XCALLID,
//! SIP Message timestamp
SIP_ATTR_TIME,
//! SIP Message Method or Response code
SIP_ATTR_METHOD,
//! SIP Call first message method
SIP_ATTR_STARTING,
//! SIP Call message counter
SIP_ATTR_MSGCNT,
};
@ -169,6 +179,9 @@ sip_msg_create(const char *header, const char *payload);
/**
* @brief Create a new call with the given callid (Minimum required data)
*
* Allocated required memory for a new SIP Call. The call acts as
* header structure to all the messages with the same callid.
*
* @param callid Call-ID Header value
* @return pointer to the sip_call created
*/
@ -181,7 +194,7 @@ sip_call_create(char *callid);
* Mainly used to check if a payload contains a callid.
*
* @param payload SIP message payload
* @returns callid parsed from Call-ID header
* @return callid parsed from Call-ID header
*/
extern char *
sip_get_callid(const char* payload);
@ -199,27 +212,10 @@ sip_get_callid(const char* payload);
extern sip_msg_t *
sip_load_message(const char *header, const char *payload);
/**
* @brief Parse header and payload into a new message
*
* This function parses ngrep header and SIP message payload to
* fill a sip_message structure.
*
* If no call is found with the given Call-ID, a new one will be
* created and added to calls list.
*
* @param header ngrep header generated by -qpt arguments
* @param payload SIP message payload
* @returns the message structure @sip_msg or NULL if parsed failed
*
*/
extern sip_msg_t *
sip_parse_message(const char *header, const char *payload);
/**
* @brief Getter for calls linked list size
*
* @returns how many calls are linked in the list
* @return how many calls are linked in the list
*/
extern int
sip_calls_count();
@ -242,22 +238,66 @@ sip_check_call_ignore(sip_call_t *call);
* Retrieve header data from attribute list
*
* @param id Attribute id
* @return Attribute header data structure pointer
*/
extern sip_attr_hdr_t *
sip_attr_get_header(enum sip_attr_id id);
/**
* @brief Get Attribute description
*
* Retrieve description of given attribute from its
* header structure.
*
* @param id Attribut id
* @return Attribute description from its header
*/
extern const char *
sip_attr_get_description(enum sip_attr_id id);
/**
* @brief Get Attribute name
*
* Retrieve name of given attribute from its
* header structure.
*
* @param id Attribut id
* @return Attribute name from its header
*/
extern const char *
sip_attr_get_name(enum sip_attr_id id);
/**
* @brief Get Attribute id from its name
*
* Retrieve attribute id of the given attribute name.
*
* @param name Attribut name
* @return Attribute id or 0 if not found
*/
extern enum sip_attr_id
sip_attr_from_name(const char *name);
/**
* @brief Sets the given attribute value to an attribute
*
* Primitive for setting an attribute value of a given attribute list.
* This can be used for calls and message attributes.
*
* @param list Pointer to the attribute list
* @param id Attribute id
* @param value Attribute value
*/
extern void
sip_attr_set(sip_attr_t **list, enum sip_attr_id id, const char *value);
/**
* @brief Gets the given attribute value to an attribute
*
* Primitive for getting an attribute value of a given attribute list.
* This can be used for calls and message attributes.
*
*/
extern const char *
sip_attr_get(sip_attr_t *list, enum sip_attr_id id);
@ -276,8 +316,10 @@ call_add_message(sip_call_t *call, sip_msg_t *msg);
/**
* @brief Find a call structure in calls linked list given an callid
*
*
*
* @param callid Call-ID Header value
* @returns pointer to the sip_call structure found or NULL
* @return pointer to the sip_call structure found or NULL
*/
extern sip_call_t *
call_find_by_callid(const char *callid);
@ -285,8 +327,11 @@ call_find_by_callid(const char *callid);
/**
* @brief Find a call structure in calls linked list given an xcallid
*
* Find the call that have the xcallid attribute equal tot he given
* value.
*
* @param xcallid X-Call-ID or X-CID Header value
* @returns pointer to the sip_call structure found or NULL
* @return pointer to the sip_call structure found or NULL
*/
extern sip_call_t *
call_find_by_xcallid(const char *xcallid);
@ -294,7 +339,11 @@ call_find_by_xcallid(const char *xcallid);
/**
* @brief Getter for call messages linked list size
*
* @returns how many messages are in the call
* Return the number of messages stored in this call. All messages
* share the same Call-ID
*
* @param call SIP call structure
* @return how many messages are in the call
*/
extern int
call_msg_count(sip_call_t *call);
@ -307,7 +356,7 @@ call_msg_count(sip_call_t *call);
* matching the given call's Call-ID will be find or returned.
*
* @param call SIP call structure
* @returns The other call structure or NULL if none found
* @return The other call structure or NULL if none found
*/
extern sip_call_t *
call_get_xcall(sip_call_t *call);
@ -318,8 +367,9 @@ call_get_xcall(sip_call_t *call);
* If the passed msg is NULL it returns the first message
* in the call
*
* @param call SIP call structure
* @param msg Actual SIP msg from the call (can be NULL)
* @returns Next chronological message in the call
* @return Next chronological message in the call
*/
extern sip_msg_t *
call_get_next_msg(sip_call_t *call, sip_msg_t *msg);
@ -332,7 +382,7 @@ call_get_next_msg(sip_call_t *call, sip_msg_t *msg);
*
* @param call SIP call structure
* @param msg Actual SIP msg from the call (can be NULL)
* @returns Next chronological message in the conversation
* @return Next chronological message in the conversation
*
*/
extern sip_msg_t *
@ -362,18 +412,27 @@ call_get_next(sip_call_t *cur);
extern sip_call_t *
call_get_prev(sip_call_t *cur);
/**
* @brief Sets the attribute value for a given call
*
* This function acts as wrapper of sip call attributes
*
* @param call SIP call structure
* @param id Attribute id
* @param value Attribute value
*/
extern void
call_set_attribute(sip_call_t *call, enum sip_attr_id id, const char *value);
/**
* @brief Return a call value
* @brief Return a call attribute value
*
* This function will be used to avoid accessing call structure
* fields directly.
* @todo Code a proper way to store this information
*
* @param call SIP call structure
* @param attr Attribute id
* @param id Attribute id
* @return Attribute value or NULL if not found
*/
extern const char *
@ -382,9 +441,16 @@ call_get_attribute(sip_call_t *call, enum sip_attr_id id);
/**
* @brief Parse ngrep header line to get timestamps and ip addresses
*
* This function will convert the ngrep header line in format:
* U DD/MM/YY hh:mm:ss.uuuuuu fff.fff.fff.fff:pppp -> fff.fff.fff.fff:pppp
*
* to some attributes.
*
* @todo This MUST disappear someday.
*
* @param msg SIP message structure
* @param header ngrep header generated by -qpt arguments
* @returns 0 on success, 1 on malformed header
* @return 0 on success, 1 on malformed header
*/
extern int
msg_parse_header(sip_msg_t *msg, const char *header);
@ -392,9 +458,11 @@ msg_parse_header(sip_msg_t *msg, const char *header);
/**
* @brief Parse SIP Message payload to fill sip_msg structe
*
* Parse the payload content to set message attributes.
*
* @param msg SIP message structure
* @param payload SIP message payload
* @returns 0 in all cases
* @return 0 in all cases
*/
extern int
msg_parse_payload(sip_msg_t *msg, const char *payload);
@ -412,9 +480,29 @@ msg_parse_payload(sip_msg_t *msg, const char *payload);
extern sip_msg_t *
msg_parse(sip_msg_t *msg);
/**
* @brief Sets the attribute value for a given message
*
* This function acts as wrapper of sip message attributes
*
* @param msg SIP message structure
* @param id Attribute id
* @param value Attribute value
*/
extern void
msg_set_attribute(sip_msg_t *msg, enum sip_attr_id id, const char *value);
/**
* @brief Return a message attribute value
*
* This function will be used to avoid accessing call structure
* fields directly.
*
* @param msg SIP message structure
* @param id Attribute id
* @return Attribute value or NULL if not found
*/
extern const char *
msg_get_attribute(sip_msg_t *msg, enum sip_attr_id id);

View File

@ -158,8 +158,9 @@ call_list_help(PANEL *panel);
* @todo Columns are not configurable yet.
*
* @param panel Ncurses panel pointer
* @param id SIP call attribute id
* @param attr SIP call attribute name
* @param title Column Title
* @param title SIP call attribute description
* @param width Column Width
* @return 0 if column has been successufly added to the list, -1 otherwise
*/

View File

@ -124,7 +124,6 @@ enum panel_types
* This functions will initialize ncurses mode and show a
* Call List panel.
*
* @param ui_config UI configuration structure
* @returns 0 on ncurses initialization success, 1 otherwise
*/
extern int
@ -238,10 +237,11 @@ toggle_color(int on);
/**
* @brief Wait for user input.
*
* This function manages all user input in all panel types and
* redraws the panel using its own draw function
*
* @param panel the topmost panel ui structure
* @param ui the topmost panel ui structure
*/
extern int
wait_for_input(ui_t *ui);
@ -267,7 +267,7 @@ title_foot_box(WINDOW *win);
* callid. If the UI is displaying this call or it's
* extended one, the topmost panel will be redraw again
*
* @param callid Call-ID from the last received message
* @param msg Last readed message in Online mode
*/
extern void
ui_new_msg_refresh(sip_msg_t *msg);