diff options
author | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-09 16:08:33 +0000 |
---|---|---|
committer | mogorman <mogorman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-06-09 16:08:33 +0000 |
commit | c68fb35ad4106c7c370a9fa673b34ee3aecbf5a4 (patch) | |
tree | 2bb21d4ad0edf1e21155ead9abc7b43f317643d1 /res/res_jabber.c | |
parent | 1de8f4126fd98a03abbca040e68ffea38b4eb00b (diff) |
convert one of my linked lists to ast_linklist
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@33263 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_jabber.c')
-rw-r--r-- | res/res_jabber.c | 82 |
1 files changed, 36 insertions, 46 deletions
diff --git a/res/res_jabber.c b/res/res_jabber.c index 5be26ea66..6fff2317c 100644 --- a/res/res_jabber.c +++ b/res/res_jabber.c @@ -158,13 +158,17 @@ static void aji_client_destroy(struct aji_client *obj) struct aji_message *tmp; ASTOBJ_CONTAINER_DESTROYALL(&obj->buddies, aji_buddy_destroy); ASTOBJ_CONTAINER_DESTROY(&obj->buddies); - - while ((tmp = obj->messages)) { - obj->messages = obj->messages->next; - if(tmp->from) free(tmp->from); - if(tmp->message) free(tmp->message); - free(tmp); + iks_filter_delete(obj->f); + iks_parser_delete(obj->p); + iks_stack_delete(obj->stack); + AST_LIST_LOCK(&client->messages); + while(tmp = AST_LIST_REMOVE_HEAD(&client->messages, list)) { + if (tmp->from) + free(tmp->from); + if (tmp->message) + free(tmp->message); } + AST_LIST_HEAD_DESTROY(&client->messages); free(obj); } @@ -1025,44 +1029,33 @@ static void aji_handle_iq(struct aji_client *client, iks *node) */ static void aji_handle_message(struct aji_client *client, ikspak *pak) { - struct aji_message *insert, *tmp, *delete, *last; + struct aji_message *insert, *tmp; int flag = 0; - insert = ast_malloc(sizeof(struct aji_message)); - memset(insert, 0, sizeof(struct aji_message)); - insert->arrived = time(NULL); - insert->next = NULL; + insert = ast_calloc(1,sizeof(struct aji_message)); + time(&insert->arrived); insert->message = ast_strdup(iks_find_cdata(pak->x, "body")); ast_copy_string(insert->id, pak->id, sizeof(insert->message)); insert->from = ast_strdup(pak->from->full); - ast_mutex_lock(&(client)->message_lock); - insert->next = client->messages; - client->messages = insert; - insert = NULL; - tmp = client->messages; - last = tmp; - while(tmp) { - if(flag) { /*timestamp exceeded delete rest */ - delete = tmp; - tmp = tmp->next; - if(delete->message) free(delete->message); - if(delete->from) free(delete->from); - free(delete); - delete = NULL; - } else if(difftime(time(NULL), tmp->arrived) >= client->message_timeout) { + AST_LIST_LOCK(&client->messages); + AST_LIST_TRAVERSE_SAFE_BEGIN(&client->messages, tmp, list) { + if(flag) { + AST_LIST_REMOVE_CURRENT(&client->messages,list); + if (tmp->from) + free(tmp->from); + if (tmp->message) + free(tmp->message); + } else if (difftime(time(NULL), tmp->arrived) >= client->message_timeout) { flag = 1; - last->next = NULL; - delete = tmp; - tmp = tmp->next; - if(delete->message) free(delete->message); - if(delete->from) free(delete->from); - free(delete); - delete = NULL; - } else { - last = tmp; - tmp = tmp->next; + AST_LIST_REMOVE_CURRENT(&client->messages,list); + if (tmp->from) + free(tmp->from); + if (tmp->message) + free(tmp->message); } } - ast_mutex_unlock(&(client)->message_lock); + AST_LIST_TRAVERSE_SAFE_END; + AST_LIST_INSERT_HEAD(&client->messages,insert,list); + AST_LIST_UNLOCK(&client->messages); } static void aji_handle_presence(struct aji_client *client, ikspak *pak) { @@ -1939,20 +1932,16 @@ static int aji_test(int fd, int argc, char *argv[]) } ast_verbose(" Priority: %d\n", resource->priority); ast_verbose(" Status: %d\n", resource->status); - ast_verbose(" Message: %s\n", resource->description); + ast_verbose(" Message: %s\n", S_OR(resource->description,"")); } ASTOBJ_UNLOCK(iterator); }); - tmp = client->messages; - ast_mutex_lock(&(client)->message_lock); ast_verbose("\nOooh a working message stack!\n"); - while(tmp) { - ast_verbose(" Message from: %s with id %s @ %s %s\n",tmp->from, tmp->id, ctime(&tmp->arrived), tmp->message); - tmp = tmp->next; + AST_LIST_LOCK(&client->messages); + AST_LIST_TRAVERSE(&client->messages, tmp, list) { + ast_verbose(" Message from: %s with id %s @ %s %s\n",tmp->from, tmp->id, ctime(&tmp->arrived), tmp->message); } - ast_mutex_unlock(&(client)->message_lock); - - + AST_LIST_UNLOCK(&client->messages); ASTOBJ_UNREF(client, aji_client_destroy); return RESULT_SUCCESS; @@ -1998,6 +1987,7 @@ static int aji_create_client(char *label, struct ast_variable *var, int debug) client->keepalive = 1; client->timeout = 20; client->message_timeout = 100; + AST_LIST_HEAD_INIT(&client->messages); client->component = AJI_CLIENT; ast_copy_string(client->statusmessage, "Online and Available", sizeof(client->statusmessage)); |