#include #include #include #include #include "main.h" #include "list.h" #include "myTimer.h" #include "checkFront.h" #include "idManager.h" #include "server.h" typedef struct struct_checkfront_t { char *msg; my_time_t time; int id; int count; int type; } checkfront_t; static checkfront_t* newCheck(char *s, int type, int id) { checkfront_t *new; assert( s != NULL ); new = malloc( sizeof(checkfront_t) ); memset(new, 0, sizeof(checkfront_t)); new->msg = strdup(s); new->time = getMyTime(); new->id = id; new->type = type; new->count = 0; return new; } static void destroyCheck(checkfront_t *p) { assert( p != NULL ); free(p->msg); free(p); } list_t* newCheckFront() { return newList(); } void addMsgInCheckFront(list_t *list, char *msg, int type, int id) { if (type == CHECK_FRONT_TYPE_CHECK) incID(id); addList(list, newCheck(msg, type, id) ); } void eventMsgInCheckFront(client_t *client) { my_time_t currentTime; int i; currentTime = getMyTime(); for(i = 0; i < client->listSendMsg->count; i++) { checkfront_t *this; this = (checkfront_t *)client->listSendMsg->list[i]; switch (this->type) { case CHECK_FRONT_TYPE_SIMPLE : sendClient(client, this->msg); delListItem(client->listSendMsg, i, destroyCheck); i--; break; case CHECK_FRONT_TYPE_CHECK : if (this->count == 0 || currentTime - this->time > CHECK_FRONT_SEND_TIME_INTERVAL) { sendClient(client, this->msg); this->time = currentTime; this->count++; } if (this->count > CHECK_FRONT_MAX_COUNT_SEND) { delID(this->id); delListItem(client->listSendMsg, i, destroyCheck); i--; } break; default : assert(! _("Bad type of front!")); break; } } } void delMsgInCheckFront(list_t *listCheckFront, int id) { int i; for( i = 0 ; i < listCheckFront->count ; i++ ) { checkfront_t *this; this = (checkfront_t *)listCheckFront->list[i]; if (this->id == id) { delID(this->id); delListItem(listCheckFront, i, destroyCheck); return; } } } void destroyCheckFront(list_t *p) { assert( p != NULL ); destroyListItem(p, destroyCheck); }