int im_start_heartbeat_cloud(void *arg) { int ret = 0; im_cloud_heartbeat(CLOUD_URL); if(!s_im_keepacc.im_is_keepacc) { cnt_time++; if (cnt_time == 24) { char notify_msg[512] = {0}; sprintf(notify_msg, "%s%dkbps", EncodeToUTF8(brocast_notify[NOTIFY_ACC_WILLSTOP]), s_im_startacc_resp.im_cur_bandwidth); im_brocast_to_terminal(NOTIFY_ACC_WILLSTOP, notify_msg); } else if (cnt_time > 24) // 120 分钟 { cnt_time = 0; im_stop_heartbeat_cloud(); im_stop_flow_count(); return 0; } } }
int FSE_HandleCreateObject(void *fseObj, struct MSA_CdsCreateObj *createObjArg, struct DLNAProtocolInfo* protocolInfo, struct CdsObject *newCdsObject) { struct FSE_State* fse = (struct FSE_State*)fseObj; char* id = NULL; char* parentId = NULL; char* title = NULL; int size; int retVal = 0; int parentIdLen = 0; if(newCdsObject != NULL) { parentId = DecodeFromUTF8(newCdsObject->ParentID); parentIdLen = (int) strlen(parentId); if((newCdsObject->MediaClass & CDS_CLASS_MASK_OBJECT_TYPE) == CDS_CLASS_MASK_CONTAINER) { /* this is a container, so the file system will create a new folder */ char* rootPath = NULL; int i, len = 0; char* folder = NULL; if(newCdsObject->Title != NULL) { rootPath = fse->RootPath; title = DecodeFromUTF8(newCdsObject->Title); len = (int)strlen(title) + (int)strlen(rootPath) + parentIdLen; folder = malloc(len + 1); strcpy(folder, rootPath); if(ILibString_StartsWith(parentId, parentIdLen, "0\\", 2)!=0 && parentIdLen>2) { strcat(folder, parentId + 2); // skip directory 0 } else if(strnicmp(parentId, CDS_STRING_DLNA_ANYCONTAINER, CDS_STRING_DLNA_ANYCONTAINER_LEN)==0) { // ToDo: how to handle AnyContainer uploads // for now it reset to the root directory of the CDS. free(parentId); parentId = ILibString_Copy("0\\", -1); } strcat(folder, title); for(i = 0; i < len; i++) { if(folder[i] == '/') { folder[i] = '\\'; } } retVal = ILibFileDir_CreateDir(folder); free(folder); } } else { /* this is an item, the file system will map the item to a local file, and return the corresponding object ID */ char* rootPath = NULL; char* fileExtension = NULL; char* extension = NULL; int i, len = 0; char* file = NULL; char* tmp = NULL; rootPath = fse->RootPath; if(newCdsObject->Title != NULL) { title = DecodeFromUTF8(newCdsObject->Title); } else { int num = rand() % 1000000000; title = (char*) malloc(15); sprintf(title, "file%d", num); } /* we cannot rely on the title of the Cds Item to determine its media type, but rather its DLNA Profile */ switch(newCdsObject->MediaClass & CDS_CLASS_MASK_MAJOR) { case CDS_CLASS_MASK_MAJOR_AUDIOITEM: if(strcmp(protocolInfo->Profile, DLNAPROFILE_LPCM)==0) { extension = EXTENSION_AUDIO_LPCM; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_MP3)==0) { extension = EXTENSION_AUDIO_MPEG; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_AMR_3GPP)==0) { extension = EXTENSION_AUDIO_3GPP; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_AAC_ISO_320)==0) { extension = EXTENSION_AUDIO_AAC; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_WMABASE)==0) { extension = EXTENSION_AUDIO_WMA; } else { /* not supported */ } break; case CDS_CLASS_MASK_MAJOR_IMAGEITEM: if(strcmp(protocolInfo->Profile, DLNAPROFILE_JPEG_SM)==0) { extension = EXTENSION_IMAGE_JPG; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_JPEG_MED)==0) { extension = EXTENSION_IMAGE_JPG; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_JPEG_LRG)==0) { extension = EXTENSION_IMAGE_JPG; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_PNG_LRG)==0) { extension = EXTENSION_IMAGE_PNG; } else { /* not supported */ } break; case CDS_CLASS_MASK_MAJOR_VIDEOITEM: if(strcmp(protocolInfo->Profile, DLNAPROFILE_MPEG_PS_NTSC)==0) { extension = EXTENSION_VIDEO_MPEG2; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_AVC_MP4_BL_CIF15_AAC_520)==0) { extension = EXTENSION_VIDEO_AAC; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_MPEG_PS_NTSC)==0) { extension = EXTENSION_VIDEO_MPEG2; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_MPEG4_P2_ASF_SP_G726)==0) { extension = EXTENSION_VIDEO_ASF; } else if(strcmp(protocolInfo->Profile, DLNAPROFILE_WMVMED_BASE)==0) { extension = EXTENSION_VIDEO_WMV; } else { /* not supported */ } break; } if(extension == NULL) { /* no valid extension found, not a valid media item */ return -1; } /* replace file extension with the valid extension found */ fileExtension = FilePathToFileExtension(title, 0); if(fileExtension != NULL) { tmp = title; /* replace old title with new title with correct extension */ title = ILibString_Replace( title, (int) strlen(title), fileExtension, (int) strlen(fileExtension), extension, (int) strlen(extension)); free(fileExtension); free(tmp); } else { tmp = (char*) malloc((int) strlen(title) + (int) strlen(extension) + 1); strcpy(tmp, title); strcat(tmp, extension); free(title); title = tmp; } /* replace old title with UTF-8 encoded title */ if (newCdsObject->DeallocateThese & CDS_ALLOC_Title) { free(newCdsObject->Title); } newCdsObject->Title = EncodeToUTF8(title); len = (int)strlen(title) + (int)strlen(rootPath) + parentIdLen; file = malloc(len + 1); strcpy(file, rootPath); if(ILibString_StartsWith(parentId, parentIdLen, "0\\", 2)!=0 && parentIdLen>2) { strcat(file, parentId + 2); // skip directory 0 } else if(strnicmp(parentId, CDS_STRING_DLNA_ANYCONTAINER, CDS_STRING_DLNA_ANYCONTAINER_LEN)==0) { // ToDo: how to handle AnyContainer uploads // for now it reset to the root directory of the CDS. free(parentId); parentId = ILibString_Copy("0\\", -1); } strcat(file, title); for(i = 0; i < len; i++) { if(file[i] == '/') { file[i] = '\\'; } } /* Finds out if there's already a uploaded object */ tmp = (char*) malloc(strlen(file) + EXTENSION_UPLOAD_TEMP_LEN + 1); strcpy(tmp, file); strcat(tmp, EXTENSION_UPLOAD_TEMP); if(ILibFileDir_GetType(tmp) == FSE_OT_NoExist) { /* temp file does not exists, no file is currently being uploaded */ retVal = 0; /* overwriting the file, remove the old file in order to avoid duplicates in CDS*/ ILibFileDir_DeleteFile(file); newCdsObject->Source = ILibString_Copy(tmp,-1); } else { retVal = -1; } free(file); free(tmp); } } // replace requested object ID with the correct object ID; if ((newCdsObject->ParentID != NULL) && (newCdsObject->DeallocateThese & CDS_ALLOC_ParentID)) { // free previous parentId free(newCdsObject->ParentID); } newCdsObject->ParentID = EncodeToUTF8(parentId); if((newCdsObject->ID != NULL) && (newCdsObject->DeallocateThese & CDS_ALLOC_ID)) { free(newCdsObject->ID); } size = parentIdLen + (int) strlen(title) + 2; id = (char*) malloc (size); strcpy(id, parentId); if(ILibString_EndsWith(parentId, parentIdLen, "\\", 1)!=0) { strcat(id, "\\"); } strcat(id, title); newCdsObject->ID = EncodeToUTF8(id); newCdsObject->DeallocateThese |= CDS_ALLOC_ParentID; newCdsObject->DeallocateThese |= CDS_ALLOC_ID; if(id!=NULL) free(id); if(parentId!=NULL) free(parentId); if(title!=NULL) free(title); return retVal; }
void *im_rollquery_thread (void *arg) { int ret = MSG_CODE_SUCESS; S_IM_MSG_HEADER s_im_cmd_header; char notify_msg[512] = {0}; char notify_msg1[512] = {0}; char notify_msg2[512] = {0}; int roll_time = 0; IM_DEBUG("START ROLL"); while(1) { ret = im_cloud_gettaskresult(CLOUD_URL, &s_im_cmd_header); IM_DEBUG("ret =%d,im_code=%d\n",ret,s_im_cmd_header.im_code); if((ret == MSG_CODE_SUCESS)&&(MSG_CODE_SUCESS == s_im_cmd_header.im_code)) { if(s_im_speedupinfo_resp.im_acc_state == STATE_ACC_OPENING) { sprintf(notify_msg, "%s%s%dkbps", s_im_speedup.im_dev_name, EncodeToUTF8(brocast_notify[NOTIFY_ACC_SUCCESS]), s_im_startacc_resp.im_acc_bandwidth); im_brocast_to_terminal(NOTIFY_ACC_SUCCESS, notify_msg); timer_hearbeat = snmp_alarm_register(TIMER_5MIN,SA_REPEAT, im_start_heartbeat_cloud, NULL); sleep(1); timer_flowcount = snmp_alarm_register(TIMER_5MIN,SA_REPEAT,im_start_flow_count, NULL); im_count_flow_peakflow(s_im_startacc_resp.im_cur_bandwidth); s_im_speedupinfo_resp.im_acc_state = STATE_ACC_OPENED; } else if(s_im_speedupinfo_resp.im_acc_state == STATE_ACC_QUERYING) { config_write_im_acc(); s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; } else { IM_DEBUG("error state:%d\n", s_im_speedupinfo_resp.im_acc_state); } return; } else if(MSG_CODE_IVALIDEDEVID == s_im_cmd_header.im_code) { ret = im_cloud_login(CLOUD_URL); } else //20s 轮询一次 { if(roll_time >= 9){ //如果180s还没有data,表示开启加速或者查询信息失败 s_im_cmd_header.im_code = MSG_CODE_UNKNOWN; s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; return; } else{ sleep(20); roll_time ++; } } } }
/********************************************* function: 处理终端发过来的命令 params: return: MSG_CODE_SUCESS, MSG_CODE_FORMAT_ERR ***********************************************/ int im_handle_cmd_terminal(char *p_msg, int acc_socket) { S_IM_MSG_HEADER s_im_cloud_header; //云端返回的头结构 int ret = MSG_CODE_SUCESS; json_object *json_data = NULL; int errcode = MSG_CODE_SUCESS; //返回消息头的CODE的值 char notify_msg[512] = {0}; json_object *DataObj; json_data = json_object_new_array(); DataObj = json_object_new_object(); switch(s_im_cmd_header.im_cmd) { case TERM_CMD_GETFLOW: _GETFLOW_RETRY: ret = im_cloud_getflow(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_getflow fail"); errcode = MSG_CODE_UNKNOWN; break; } if (s_im_cloud_header.im_code == MSG_CODE_SUCESS) { im_json_make_termres_getflow(json_data); } else if(MSG_CODE_INVALIDSES == s_im_cloud_header.im_code) { ret = im_cloud_login(CLOUD_URL); if (ret == MSG_CODE_SUCESS) { sleep(1); goto _GETFLOW_RETRY; } else { errcode = MSG_CODE_UNKNOWN; } } else { errcode = s_im_cloud_header.im_code; } break; case TERM_CMD_KEEPACC: break; case TERM_CMD_START_ACC: _START_ACC_RETRY: IM_DEBUG("coming ----im_acc_state=%d\n",s_im_speedupinfo_resp.im_acc_state); if (s_im_speedupinfo_resp.im_acc_state != STATE_ACC_CLOSED) { errcode = MSG_CODE_UNKNOWN; break; } s_im_speedupinfo_resp.im_acc_state = STATE_ACC_OPENING; ret = im_cloud_startaac(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_startaac fail"); errcode = MSG_CODE_UNKNOWN; s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; break; } errcode = s_im_cloud_header.im_code; //构造返回的DATA if (s_im_cloud_header.im_code == MSG_CODE_MSGDELAY) { errcode = MSG_CODE_MSGDELAY_TERM; im_start_rollquery_result_cloud(); } else if (s_im_cloud_header.im_code == MSG_CODE_SUCESS) { //初始化加速信息情况 s_im_speedupinfo_resp.im_acc_state = STATE_ACC_OPENED; s_im_speedupinfo_resp.im_isp = s_im_startacc_resp.im_isp; s_im_speedupinfo_resp.im_cur_bandwidth = s_im_startacc_resp.im_cur_bandwidth; s_im_speedupinfo_resp.im_max_bandwidth = s_im_startacc_resp.im_max_bandwidth; s_im_speedupinfo_resp.im_acc_remaintime = s_im_startacc_resp.im_remaintime; s_im_speedupinfo_resp.im_acc_bandwidth = s_im_startacc_resp.im_acc_bandwidth; im_json_make_termres_startacc(json_data,DataObj); sprintf(notify_msg, "%s%s%dkbps", s_im_speedup.im_dev_name, EncodeToUTF8(brocast_notify[NOTIFY_ACC_SUCCESS]), s_im_startacc_resp.im_acc_bandwidth); im_brocast_to_terminal(NOTIFY_ACC_SUCCESS, notify_msg); timer_hearbeat = snmp_alarm_register(TIMER_5MIN,SA_REPEAT, im_start_heartbeat_cloud, NULL); timer_flowcount = snmp_alarm_register(TIMER_5MIN, SA_REPEAT,im_start_flow_count, NULL); im_count_flow_peakflow(s_im_startacc_resp.im_cur_bandwidth); } else if(MSG_CODE_INVALIDSES == s_im_cloud_header.im_code) { ret = im_cloud_login(CLOUD_URL); if (ret == MSG_CODE_SUCESS) { sleep(1); s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; goto _START_ACC_RETRY; } else { errcode = MSG_CODE_UNKNOWN; } s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; } else { errcode = s_im_cloud_header.im_code; } break; case TERM_CMD_STOP_ACC: ret = im_cloud_stopaac(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_startaac fail"); errcode = MSG_CODE_UNKNOWN; break; } s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; im_stop_heartbeat_cloud(); im_stop_flow_count(); sprintf(notify_msg, "%s", EncodeToUTF8(brocast_notify[NOTIFY_ACC_STOP])); im_brocast_to_terminal(NOTIFY_ACC_STOP, notify_msg); break; case TERM_CMD_ACC_STATE_INFO: if((s_im_speedupinfo_resp.im_acc_state == STATE_ACC_QUERYING) || (s_im_speedupinfo_resp.im_acc_state == STATE_ACC_OPENING)) { errcode = MSG_CODE_MSGDELAY_TERM; break; } ret = im_check_isnet_change(); if(ret != MSG_CODE_SUCESS) //网络未改变不需要查询 { im_json_make_termres_speedupinfo(json_data,DataObj); } else { IM_DEBUG("state=%d\n",s_im_speedupinfo_resp.im_acc_state); if(s_im_speedupinfo_resp.im_acc_state != STATE_ACC_CLOSED) { errcode = MSG_CODE_UNKNOWN; break; } _IS_ACC_RETRY: s_im_speedupinfo_resp.im_acc_state = STATE_ACC_QUERYING; ret = im_cloud_isaac(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_startaac fail"); errcode = MSG_CODE_UNKNOWN; s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; break; } //构造返回的DATA if (s_im_cloud_header.im_code == MSG_CODE_MSGDELAY) { errcode = MSG_CODE_MSGDELAY_TERM; im_start_rollquery_result_cloud(); } else if (s_im_cloud_header.im_code == MSG_CODE_SUCESS) { im_json_make_termres_speedupinfo(json_data,DataObj); im_count_flow_peakflow(s_im_speedupinfo_resp.im_cur_bandwidth); } else if(MSG_CODE_INVALIDSES == s_im_cloud_header.im_code) { ret = im_cloud_login(CLOUD_URL); if (ret == MSG_CODE_SUCESS) { sleep(1); s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; goto _IS_ACC_RETRY; } else { errcode = MSG_CODE_UNKNOWN; } s_im_speedupinfo_resp.im_acc_state = STATE_ACC_CLOSED; } else { errcode = s_im_cloud_header.im_code; } } break; case TERM_CMD_GETFLOW_INFO: _GETFLOW_INFO_RETRY: ret = im_cloud_getflow_info(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_getflow_info fail"); errcode = MSG_CODE_UNKNOWN; break; } if (s_im_cloud_header.im_code == MSG_CODE_SUCESS) { im_json_make_termres_flowinfo(json_data,DataObj); } else if(MSG_CODE_INVALIDSES == s_im_cloud_header.im_code) { ret = im_cloud_login(CLOUD_URL); if (ret == MSG_CODE_SUCESS) { sleep(1); goto _GETFLOW_INFO_RETRY; } else { errcode = MSG_CODE_UNKNOWN; } } else { errcode = s_im_cloud_header.im_code; } break; case TERM_CMD_UNGETTEDFLOW: _UNGETTEDFLOW_RETRY: ret = im_cloud_ungetflow(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_ungetflow fail"); errcode = MSG_CODE_UNKNOWN; break; } if (s_im_cloud_header.im_code == MSG_CODE_SUCESS) { im_json_make_termres_ungetflow(json_data,DataObj); } else if(MSG_CODE_INVALIDSES == s_im_cloud_header.im_code) { ret = im_cloud_login(CLOUD_URL); if (ret == MSG_CODE_SUCESS) { sleep(1); goto _UNGETTEDFLOW_RETRY; } else { errcode = MSG_CODE_UNKNOWN; } } else { errcode = s_im_cloud_header.im_code; } break; case TERM_CMD_PEAKFLOW: im_json_make_termres_peakflow(json_data,DataObj); break; case TERM_CMD_GET_ACCLIST: _GET_ACCLIST_RETRY: ret = im_cloud_getacclist(CLOUD_URL, &s_im_cloud_header); if (ret != MSG_CODE_SUCESS) { IM_DEBUG("im_cloud_startaac fail"); errcode = MSG_CODE_UNKNOWN; break; } if (s_im_cloud_header.im_code == MSG_CODE_SUCESS) { im_json_make_termres_acclist(json_data,DataObj); } else if(MSG_CODE_INVALIDSES == s_im_cloud_header.im_code) { ret = im_cloud_login(CLOUD_URL); if (ret == MSG_CODE_SUCESS) { sleep(1); goto _GET_ACCLIST_RETRY; } else { errcode = MSG_CODE_UNKNOWN; } } else { errcode = s_im_cloud_header.im_code; } break; case TERM_CMD_IOSINFO: IM_DEBUG("TERM_CMD_IOSINFO"); break; default: IM_DEBUG("unkonow cmd"); errcode = MSG_CODE_FORMAT_ERR_TERM; ret = MSG_CODE_FORMAT_ERR; break; } ret = im_json_make_respone_send(p_msg, errcode, json_data, acc_socket); if (ret != MSG_CODE_SUCESS) //解析失败 { IM_DEBUG("im_json_make_respone_send fail"); } json_object_put(DataObj); json_object_put(json_data); return ret; }