Exemple #1
0
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;
		}
	}
}
Exemple #2
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;
}
Exemple #3
0
 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 ++;
			}
		 }
	 }
 }
Exemple #4
0
/*********************************************
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;
}