blob: a62929807e586b52458d179385bd2a7120ae737f [file] [log] [blame]
#include <cwmp/types.h>
#include <cwmp/cwmp.h>
#include <cwmp/event.h>
#include <cwmp/log.h>
typedef struct memorystruct {
char *data;
size_t size;
}memorystruct_t;
static inform_event_t inform_event_table[] =
{
{INFORM_BOOTSTRAP, 0, CWMP_INFORM_EVENT_CODE_0 , "inform:event_bootstrap", "inform:command_bootstrap"},
{INFORM_BOOT, 0, CWMP_INFORM_EVENT_CODE_1 , "inform:event_boot", "inform:command_boot"},
{INFORM_PERIODIC, 0, CWMP_INFORM_EVENT_CODE_2 , "inform:event_periodic", "inform:command_periodic"},
{INFORM_SCHEDULED, 0, CWMP_INFORM_EVENT_CODE_3 , "inform:event_scheduled", "inform:command_scheduled"},
{INFORM_VALUECHANGE, 0, CWMP_INFORM_EVENT_CODE_4 , "inform:event_valuechange", "inform:command_valuechange"},
{INFORM_KICKED, 0, CWMP_INFORM_EVENT_CODE_5 , "inform:event_kicked", "inform:command_kicked"},
{INFORM_CONNECTIONREQUEST, 0, CWMP_INFORM_EVENT_CODE_6 , "inform:event_connreq", "inform:command_connreq"},
{INFORM_TRANSFERCOMPLETE, 0, CWMP_INFORM_EVENT_CODE_7 , "inform:event_transcomplt", "inform:command_transcomplt"},
{INFORM_DIAGNOSTICSCOMPLETE, 0, CWMP_INFORM_EVENT_CODE_8 , "inform:event_diagcomplt", "inform:command_diagcomplt"},
{INFORM_REQUESTDOWNLOAD, 0, CWMP_INFORM_EVENT_CODE_9 , "inform:event_reqdl", "inform:command_reqdl"},
{INFORM_AUTONOMOUSTRANSFERCOMPLETE, 0, CWMP_INFORM_EVENT_CODE_10, "inform:event_autotranscomplt", "inform:command_autotranscomplt"},
{INFORM_MREBOOT, 0, CWMP_INFORM_EVENT_CODE_11, "inform:event_mreboot", "inform:command_mreboot"},
{INFORM_MSCHEDULEINFORM, 0, CWMP_INFORM_EVENT_CODE_12, "inform:event_mscheinform", "inform:command_mscheinform"},
{INFORM_MDOWNLOAD, 0, CWMP_INFORM_EVENT_CODE_13, "inform:event_mdownload", "inform:command_mdownload"},
{INFORM_MUPLOAD, 0, CWMP_INFORM_EVENT_CODE_14, "inform:event_mupload", "inform:command_mupload"},
{INFORM_ACCOUNTCHANGE, 0, CWMP_INFORM_EVENT_CODE_15, "inform:event_accountchange", "inform:command_accountchange"},
{INFORM_MVENDORSPECRPC, 0, CWMP_INFORM_EVENT_CODE_16, "inform:event_mvendorspecrpc", "inform:command_mvendorspecrpc"},
{INFORM_XOUIEVENT, 0, CWMP_INFORM_EVENT_CODE_17, "inform:event_xouievent", "inform:command_xouievent"},
{INFORM_MAX, 0, "", "", ""}
};
event_list_t * cwmp_event_list_create(pool_t * pool, int size)
{
//create event list
event_list_t * el;
el = PMALLOC(sizeof(event_list_t));
if (!el)
{
cwmp_log_error("el pmalloc return null");
return NULL;
}
el->events = PMALLOC(sizeof(event_code_t *) * size);
if(!el->events)
{
cwmp_log_error("el->event pmalloc return null");
return NULL;
}
el->count = 0;
el->size = size;
return el;
}
event_code_t * cwmp_event_code_create(pool_t * pool )
{
event_code_t * ev;
ev = PMALLOC(sizeof(event_code_t));
//ev->event = 0;
//ev->code = NULL;
//memset(ev->command_key, 0 , COMMAND_KEY_LEN+1);
//ev->have_key = 0;
//ev->policy = 0;
//ev->ref = 0;
//ev->fault_code = 0;
//ev->start = 0;
//ev->end = 0;
return ev;
}
int cwmp_event_list_init(pool_t * pool, event_list_t * el)
{
//create event list
int i, size;
size = el->size;
for(i=0; i<size; i++)
{
event_code_t * ec = cwmp_event_code_create(pool);
el->events[i] = ec;
}
el->count = 0;
return CWMP_OK;
}
int cwmp_event_global_init(cwmp_t * cwmp)
{
FILE *fp = NULL;
int i = 0;
FUNCTION_TRACE();
if(!cwmp)
{
cwmp_log_error("param cwmp is NULL\n");
return CWMP_ERROR;
}
memset(&cwmp->event_global, 0, sizeof(event_global_t));
//ÅжÏÅäÖÃÎļþÊÇ·ñ´æÔÚ
if(access(cwmp->event_filename, F_OK) == -1)
{
cwmp_log_error("event_file (%s) no exist!\n", cwmp->event_filename);
return CWMP_ERROR;
}
fp = fopen(cwmp->event_filename, "rb");
if(!fp)
{
cwmp_log_error("could not open event file %s\n", cwmp->event_filename);
return CWMP_ERROR;
}
if(fread(&cwmp->event_global, sizeof(event_global_t), 1, fp) != 1)
{
cwmp_log_error("read event global file fail\n");
}
cwmp_log_info("event_flag:%d", cwmp->event_global.event_flag);
#if 0
for(i=0; i<COMMAND_KEY_LEN+1; i++)
{
cwmp_log_info("event_key:%d", cwmp->event_global.event_key[i]);
}
#endif
cwmp_log_info("fault_code:%d", cwmp->event_global.fault_code);
cwmp_log_info("start:%d", cwmp->event_global.start);
cwmp_log_info("end:%d", cwmp->event_global.end);
fclose(fp);
return CWMP_OK;
}
//°ÑʼþÐÅϢдÈëÎļþÖÐ
int cwmp_event_file_save(cwmp_t * cwmp)
{
FILE *fp = NULL;
int ret = CWMP_OK;
int i = 0;
FUNCTION_TRACE();
if(!cwmp)
{
return CWMP_ERROR;
}
if((fp = fopen(cwmp->event_filename, "wb+")) == NULL)
{
cwmp_log_error("can't open file: %s.\n", cwmp->event_filename);
return CWMP_ERROR;
}
if(fwrite(&cwmp->event_global, sizeof(event_global_t), 1, fp) != 1)
{
cwmp_log_error("can't write event global to %s\n", cwmp->event_filename);
ret = CWMP_ERROR;
}
cwmp_log_info("event_flag:%d", cwmp->event_global.event_flag);
for(i=0; i<COMMAND_KEY_LEN+1; i++)
{
cwmp_log_info("event_key:%d", cwmp->event_global.event_key[i]);
}
cwmp_log_info("fault_code:%d", cwmp->event_global.fault_code);
cwmp_log_info("start:%d", cwmp->event_global.start);
cwmp_log_info("end:%d", cwmp->event_global.end);
fclose(fp);
return ret;
}
//É豸Æô¶¯ÒÔºó£¬Ò»Ð©Ê¼þÐèÒªÉϱ¨
int cwmp_event_init(cwmp_t *cwmp)
{
int bootstrap_flag = 0;
int upgrade_flag = 0;
char val[64] = {0};
FUNCTION_TRACE();
if(!cwmp)
{
cwmp_log_error("param cwmp is NULL\n");
return CWMP_ERROR;
}
pthread_mutex_init(&cwmp->event_mutex, NULL);
cwmp->el = cwmp_event_list_create(cwmp->pool, INFORM_MAX);
if(!cwmp->el)
{
cwmp_log_error("cwmp->el is null");
return CWMP_ERROR;
}
cwmp_event_list_init(cwmp->pool, cwmp->el);
cwmp_event_global_init(cwmp);
if(cwmp->event_global.event_flag == EVENT_REBOOT_NONE_FLAG || cwmp->event_global.event_flag & EVENT_REBOOT_BOOTSTRAP_FLAG)
{
cwmp_log_info("1.flag=%d, key=%s\n", cwmp->event_global.event_flag, cwmp->event_global.event_key);
cwmp->event_global.event_flag = EVENT_REBOOT_BOOTSTRAP_FLAG;
cwmp_event_set_value(cwmp, INFORM_BOOTSTRAP, 1, NULL, 0, 0, 0);
cwmp->boot_flag = 1;
}
else //reboot
{
cwmp_log_info("2.flag=%d, key=%s\n", cwmp->event_global.event_flag, cwmp->event_global.event_key);
cwmp_event_set_value(cwmp, INFORM_BOOT, 1, NULL, 0, 0, 0);
if(cwmp->event_global.event_flag & EVENT_REBOOT_ACS_FLAG)
{
cwmp_event_set_value(cwmp, INFORM_MREBOOT, 1, NULL, 0, 0, 0);
}
}
//upgrade firmware
if(cwmp->event_global.event_flag & EVENT_REBOOT_TRANSFERCOMPLETE_FLAG)
{
cwmp_log_info("4.flag=%d, key=%s\n", cwmp->event_global.event_flag, cwmp->event_global.event_key);
cwmp_event_set_value(cwmp, INFORM_MDOWNLOAD, 1, NULL, 0, 0, 0);
cwmp_event_set_value(cwmp, INFORM_TRANSFERCOMPLETE, 1, cwmp->event_global.event_key, cwmp->event_global.fault_code, cwmp->event_global.start, cwmp->event_global.end);
}
return CWMP_OK;
}
/*
//ÉèÖÃij¸öʼþµÄcommandkey
int cwmp_event_set_commandkey(cwmp_t *cwmp, const int event, const char *cmd_key, time_t start)
{
cwmp_log_debug( "cwmp_event_set_commandkey begin, event=%d\n", event);
if(event < 0 || event >= INFORM_MAX)
{
cwmp_log_error( "event=%d, max=%d\n", event, INFORM_MAX);
return CWMP_ERROR;
}
pthread_mutex_lock(&cwmp->event_mutex);
int max = cwmp->el->size;
int i;
for(i=0; i<max; i++)
{
event_code_t * ec = cwmp->el->events[i];
if(ec->event == event)
{
strcpy(ec->command_key, cmd_key);
ec->start = start;
break;
}
}
pthread_mutex_unlock(&cwmp->event_mutex);
cwmp_log_debug( "cwmp_event_set_commandkey end\n");
return CWMP_OK;
}
*/
int cwmp_event_set_value(cwmp_t *cwmp, int event, int value, const char * cmd_key, int fault_code, time_t start, time_t end)
{
cwmp_log_debug( "cwmp_event_set_value begin, event=%d, value=%d\n", event, value);
if(event < 0 || event >= INFORM_MAX)
{
cwmp_log_error( "event=%d, max=%d\n", event, INFORM_MAX);
return CWMP_ERROR;
}
int count = cwmp->el->count;
int max = cwmp->el->size;
if(count >= cwmp->el->size)
{
return CWMP_ERROR;
}
pthread_mutex_lock(&cwmp->event_mutex);
int i;
int k=count;
for(i=0; i<count; i++)
{
event_code_t * ec = cwmp->el->events[i];
if(ec->event == event)
{
k = i;
break;
}
}
event_code_t * ec = cwmp->el->events[k];
memset(ec, 0, sizeof(event_code_t));
ec->event = event;
ec->ref = value;
ec->code = inform_event_table[event].code;
if(cmd_key != NULL)
{
TRstrncpy(ec->command_key, cmd_key,COMMAND_KEY_LEN);
cwmp_log_info("command key:%s", ec->command_key);
}
ec->fault_code = fault_code;
ec->start = start;
ec->end = end;
cwmp->el->count ++;
pthread_mutex_unlock(&cwmp->event_mutex);
return CWMP_OK;
}
/*
//ÉèÖÃij¸öʼþµÄÖµ
int cwmp_event_set_value1(cwmp_t *cwmp, int event, int value)
{
cwmp_log_debug( "cwmp_event_set_value begin, event=%d, value=%d\n", event, value);
if(event < 0 || event >= INFORM_MAX)
{
cwmp_log_error( "event=%d, max=%d\n", event, INFORM_MAX);
return CWMP_ERROR;
}
pthread_mutex_lock(&cwmp->event_mutex);
if(cwmp->el->count < cwmp->el->size-1)
{
int count = cwmp->el->count;
event_code_t * ec = cwmp->el->events[count];
ec->event = event;
ec->ref = value;
ec->code = inform_event_table[event].code;
cwmp->el->count ++;
}
pthread_mutex_unlock(&cwmp->event_mutex);
cwmp_log_debug( "cwmp_event_set_value end\n");
return CWMP_OK;
}
int cwmp_event_inc_set_value(cwmp_t *cwmp, int event, int step)
{
cwmp_log_debug( "cwmp_event_inc_set_value begin, event=%d, step=%d\n", event, step);
if(event < 0 || event >= INFORM_MAX)
{
cwmp_log_error( "event=%d, max=%d\n", event, INFORM_MAX);
return CWMP_ERROR;
}
pthread_mutex_lock(&cwmp->event_mutex);
// cwmp->event_info[index].ref += step;
int max = cwmp->el->size;
int i;
for(i=0; i<max-1; i++)
{
event_code_t * ec = cwmp->el->events[i];
if(ec->event == event)
{
ec->ref += step;
break;
}
}
if(i == max)
{
event_code_t * newec = cwmp->el->events[cwmp->el->count];
newec->event = event;
newec->ref += 1;
newec->code = inform_event_table[event].code;
}
pthread_mutex_unlock(&cwmp->event_mutex);
cwmp_log_debug( "cwmp_event_inc_set_value end\n");
return CWMP_OK;
}
int cwmp_event_dec_set_value(cwmp_t *cwmp, const int event, const unsigned int step)
{
cwmp_log_debug( "cwmp_event_dec_set_value begin, event=%d, step=%d\n", event, step);
if(event < 0 || event >= INFORM_MAX)
{
cwmp_log_error( "event=%d, max=%d\n", event, INFORM_MAX);
return CWMP_ERROR;
}
pthread_mutex_lock(&cwmp->event_mutex);
int max = cwmp->el->size;
int i;
for(i=0; i<max-1; i++)
{
event_code_t * ec = cwmp->el->events[i];
if(ec->event == event)
{
ec->ref -= step;
if(ec->ref < 0)
{
ec->ref = 0;
}
break;
}
}
pthread_mutex_unlock(&cwmp->event_mutex);
cwmp_log_debug( "cwmp_event_dec_set_value end\n");
return CWMP_OK;
}
*/
int cwmp_event_get_index(cwmp_t *cwmp,const char *name)
{
int index = -1;
int i;
int size = 0;
if(!name)
{
goto finish;
}
size = cwmp->el->size;
for(i=0; i<INFORM_MAX; i++)
{
if(TRstrcmp(cwmp->el->events[i]->code, name) == 0)
{
index = i;
break;
}
}
finish:
return index;
}
#if 0
size_t cwmp_write_callback(void *ptr, size_t size, size_t nmemb, void *data)
{
size_t realsize = size * nmemb;
memorystruct_t *mem = (memorystruct_t*)data;
if(!mem || !ptr)
{
cwmp_log_error( "ptr or data is NULL\n");
return 0;
}
mem->data = (char *)realloc(mem->data, mem->size + realsize + 1);
if (mem->data)
{
memcpy(&(mem->data[mem->size]), ptr, realsize);
mem->size += realsize;
mem->data[mem->size] = 0;
}
return realsize;
}
#endif
//Çå³ýµôÏà¹ØµÄÐÅÏ¢
int cwmp_event_clear_active(cwmp_t *cwmp)
{
int i;
int j;
int notify_flag = 0;
assert(cwmp != NULL);
FUNCTION_TRACE();
pthread_mutex_lock(&cwmp->event_mutex);
event_code_t ** pec = cwmp->el->events;
int evsize = cwmp->el->count;
for(i=0; i<evsize; i++)
{
if(pec[i]->ref <= 0)
{
continue;
}
switch(pec[i]->event)
{
case INFORM_BOOTSTRAP:
{
cwmp->event_global.event_flag |= EVENT_REBOOT_ACS_FLAG;
cwmp_event_file_save(cwmp);
}
break;
case INFORM_MREBOOT:
cwmp->event_global.event_flag |= EVENT_REBOOT_ACS_FLAG;
cwmp_event_file_save(cwmp);
break;
case INFORM_VALUECHANGE:
notify_flag = 1;
break;
case INFORM_TRANSFERCOMPLETE:
{
cwmp->event_global.event_flag |= EVENT_REBOOT_TRANSFERCOMPLETE_FLAG;
memset(cwmp->event_global.event_key, 0, COMMAND_KEY_LEN+1);
strncpy(cwmp->event_global.event_key, pec[i]->command_key, COMMAND_KEY_LEN);
cwmp->event_global.fault_code = pec[i]->fault_code;
cwmp->event_global.start = pec[i]->start;
cwmp->event_global.end = pec[i]->end;
cwmp_event_file_save(cwmp);
}
break;
}
pec[i]->ref = 0; //clear
}
cwmp->el->count = 0;
pthread_mutex_unlock(&cwmp->event_mutex);
//Çå³ýValue Change
/*
if(notify_flag == 1)
{
hash_index_t *hi = NULL;
val_change_t *tmp = NULL;
char *key = NULL;
for (hi = hash_first(cwmp->ht_val_change); hi; hi = hash_next(hi))
{
hash_this(hi, (const void**)(&key), NULL, (void**)&tmp);
if(!key || !tmp)
{
continue;
}
//´Óvalue change hashÈ¥³ý
hash_set(cwmp->ht_val_change, (void*)tmp->name, strlen(tmp->name), NULL);
//ÊÍ·ÅÄÚ´æ
if(tmp->value)
{
free_check(tmp->value);
}
free_check(tmp);
}
}
*/
return CWMP_OK;
}
//È¡µÃactive eventÒÔ¼°count
/*
static int get_active_event_list(cwmp_t *cwmp, event_list_t **pevent_list, int *pevt_count)
{
int i;
event_list_t *evlist = NULL;
int count = 0;
int ret = CWMP_OK;
if(!cwmp || !pevent_list || !pevt_count)
{
cwmp_log_error( "param is NULL\n");
return CWMP_ERROR;
}
pthread_mutex_lock(&cwmp->event_mutex);
int max = cwmp->event_list->count;
for(i=0; max; i++)
{
if(cwmp->event_info[i].ref > 0)
{
evlist = realloc(evlist, sizeof(event_t)*(count+1));
if(!evlist)
{
ret = CWMP_ERROR;
cwmp_log_error( "realloc fail\n");
break;
}
memcpy(&evlist[count], &cwmp->event_info[i], sizeof(event_list_t));
count++;
}
}
pthread_mutex_unlock(&cwmp->event_mutex);
if(ret == CWMP_OK)
{
*pevent_list = evlist;
*pevt_count = count;
}
else
{
free(evlist);
}
return ret;
}
*/