⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amoimess_mms_encode.c

📁 关于彩信的编解码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
	编码

	 Amoi_MmsEncode(MMS_STRUCTION *messmms);  //编码接口,messmms为当前彩信结构体,
	 
	   由外部定义、申请以及释放空间,该函数返回彩信编码后的数组。其中,这个存储数组空间由内部
	   
		 申请,但用完后需外部进行释放或置NULL。


	zhusj_2007.4(start)
*/
/********************************************************************************************/

#include "amoimess_mms_transfer.h"

MMS_STRUCTION *messmms;
I FirstYear = 1970; 

UC* EncodeContentypeHeaderValue(UC *stream);

UC* EncodeBodyContentypeValue(UC *stream,UL32 iType);



/************************************************
时间Date的编码
*************************************************/
UL32 DateToSecond(UL32 year,UL32 month,UL32 day,UL32 hour,UL32 minute,UL32 second)
{
	UL32 Year = year - FirstYear;

	I countspecialyear,specialmonth ;

	countspecialyear = Year/4;	 //闰年的个数

	if(month == 1 || month == 3|| month == 5 || month == 7 || 
		month == 8 || month == 10 || month == 12 )
	{
		specialmonth = 31;
	}
	else if(month == 4 || month == 6|| month == 8 || month == 9|| month == 11 )
	{
		specialmonth = 30;
	}
	else if(month == 2)
	{
		 if (year%4 == 0)
		{
			specialmonth = 29;
		}
		else
		{
			specialmonth = 28;	
		}
	} 
	
	UL32 allsecond = (Year-countspecialyear)*365*ALLSECONDSINONEDAY + 
						countspecialyear*366*ALLSECONDSINONEDAY+
						specialmonth*ALLSECONDSINONEDAY + day*ALLSECONDSINONEDAY + 
						hour*3600 + minute*60 + second;

	return allsecond;
}

/************************************************
移位函数,将秒数转换为16进制字符,并返回一个字符数组
*************************************************/
UC *SecondsEncode(UL32 allseconds,UL32 length)
{ 
	UL32 i;
	static UC temp[MAXONEBIT]; 
	for(i=0;i<length;i++)
	{
		temp[i] =  (UC)(allseconds << 8*i >> 8* (length-1)) ;	
	}
	return temp;
}

/************************************************
内容中datalen编码函数
*************************************************/
UC* DataLenEncode(UC *pos,UL32 datalen)
{ 
	UL32 i;
	static UC temp[MAXONEBIT];
	static UC tmpstore[MAXONEBIT];
	UL32 lastbit= datalen << 24 >> 24;
	
	if(datalen < 255)  // 只用一位表示时,如0x0F
	{
		pos=strcatC(pos, (UC)datalen);
	}

	else if(datalen < 65535 && datalen > 255)  // 两位表示时,如0xFF0F
	{
		i = 0 ;
		if(lastbit > 0x80)
		{
			temp[i] = (UC)((datalen >> 8 << 1) + 0x81);
			pos=strcatUC(pos,temp); 
			pos=strcatC(pos,(UC)(lastbit-0x80));
		}
		else 
		{
			temp[i] = (UC)((datalen >>8 << 1)+0x80);
			pos=strcatUC(pos,temp);
			pos=strcatC(pos,(UC)lastbit);
		}
	}

	else if(datalen < 16777215 && datalen > 65535) // 三位表示时,如0xFFFF0F
	{
		for(i = 0; i < 2;i++)
		{
			tmpstore[i] = (UC)((datalen << 8*(i+1) >> 24 << 1) + 0x80);
		}

		if(tmpstore[1] > 0x80)
		{
			temp[0] = (UC)((datalen << 8 >> 24 << 1) + 0x81);
		}
		else
		{
			temp[0] = (UC)((datalen << 8 >> 24 << 1) + 0x80);
		}

		if(lastbit > 0x80)
		{
			temp[1] = (UC)((datalen << 16 >> 24 << 1) + 0x81);
			pos=strcatUC(pos,temp); 
			pos=strcatC(pos,(UC)(lastbit-0x80));
		}
		else
		{
			temp[1] = (UC)((datalen << 16 >> 24 << 1) + 0x80);
			pos=strcatUC(pos,temp);
			pos=strcatC(pos,(UC)lastbit);
		}
	}

	else if(datalen < 4294967295 && datalen > 16777215)  // 四位表示时,如0xFFFFFF0F
	{
		for(i=0;i<3;i++)
		{
			tmpstore[i] = (UC)((datalen << 8*i >> 24 << 1) + 0x80);
		}

		if(tmpstore[2] > 0x80)
		{
			temp[1] = (UC)((datalen << 8 >> 24 << 1) + 0x81);
		}
		else
		{
			temp[1] = (UC)((datalen << 8 >> 24 << 1) + 0x80);
		}

		if(tmpstore[1] > 0x80)
		{
			temp[0] = (UC)((datalen >> 24 << 1) + 0x81);
		}
		else
		{
			temp[0] = (UC)((datalen >> 24 << 1) + 0x80);
		}

		if(lastbit > 0x80)
		{
			temp[2] = (UC)((datalen << 16 >> 24 << 1) + 0x81);
			pos=strcatUC(pos,temp); 
			pos=strcatC(pos,(UC)(lastbit-0x80));
		}
		else
		{
			temp[2] = (UC)((datalen << 16 >> 24 << 1) + 0x80);
			pos=strcatUC(pos,temp);
			pos=strcatC(pos,(UC)lastbit);
		}
	}
	return pos;
}

/************************************************
临时函数,用于获取结构体成员的内容(以0x00结尾)
*************************************************/
UC *StoringToArray(UC s[],UC *temp,UL32 istart,UL32 size) 
{	
	UC *p = s;
	UL32 i;

	for(i=0;i < size;i++)
	{
		temp[i] = p[istart++];
	}

	return temp;
}

/************************************************
接收状态error处理函数
*************************************************/
UC* RetrieveStateDealer(CommonError s,UC *pos)
{
	switch(s)
	{
	case Ok:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0x80);
			break;
		}
		
	case Error_transient_failure:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xC0);
			break;
		}
		
	case Error_transient_message_not_found:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xC1);
			break;
		}
		
	case Error_transient_network_problem:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xC2);
			break;
		}
		
	case Error_permanent_failure:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xE0);
			break;
		}
	case Error_permanent_service_denied:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xE1);
			break;
		}
	case Error_permanent_message_not_found:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xE2);
			break;
		}
	case Error_permanent_content_unsupported:
		{
			pos=strcatC(pos,Mms_Retrieve_Status);
			pos=strcatC(pos,0xE3);
			break;
		}
	case UNUSED:
		{
			break;
		}
	}
	return pos;
}

/************************************************
回应状态error处理函数
*************************************************/
UC* ResponseStateDealer(CommonError s,UC *pos)
{
	switch(s)
	{
	case Ok:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x80);
			break;
		}
		
	case Error_unspecified:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x81);
			break;
		}
		
	case Error_service_denied:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x82);
			break;
		}
		
	case Error_message_format_corrupt:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x83);
			break;
		}
		
	case Error_sending_address_unresolved:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x84);
			break;
		}
	case Error_message_not_found:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x85);
			break;
		}
	case Error_network_problem:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x86);
			break;
		}
	case Error_content_not_accepted:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x87);
			break;
		}
	case Error_unsupported_message:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0x88);
			break;
		}
	case Error_transient_failure:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xC0);
			break;
		}
	case Error_transient_sending_address_unresolved:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xC1);
			break;
		}
	case Error_transient_message_not_found:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xC2);
			break;
		}
	case Error_transient_network_problem:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xC3);
			break;
		}
	case Error_transient_partial_success:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xC4);
			break;
		}
	case Error_permanent_failure:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE0);
			break;
		}
	case Error_permanent_service_denied:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE1);
			break;
		}
	case Error_permanent_message_format_corrupt:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE2);
			break;
		}
	case Error_permanent_sending_address_unresolved:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE3);
			break;
		}
	case Error_permanent_message_not_found:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE4);
			break;
		}
	case Error_permanent_content_not_accepted:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE5);
			break;
		}
	case Error_permanent_reply_UCging_limitations_not_met:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE6);
			break;
		}
	case Error_permanent_reply_UCging_request_not_accepted:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE7);
			break;
		}
	case Error_permanent_reply_UCging_forwarding_denied:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE8);
			break;
		}
	case Error_permanent_reply_UCging_not_supported:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xE9);
			break;
		}
	case Error_permanent_address_hiding_not_supported:
		{
			pos=strcatC(pos,Mms_Response_Status);
			pos=strcatC(pos,0xEA);
			break;
		}
	case UNUSED:
		{
			break;
		}
	}
	return pos;
}

/************************************************
存储状态error处理函数
*************************************************/
UC* StoreStateDealer(CommonError s,UC *pos)
{
	switch(s)
	{
	case Success:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0x80);
			break;
		}
	case Error_transient_failure:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0xC0);
			break;
		}
	case Error_transient_network_problem:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0x80);
			break;
		}
	case Error_permanent_failure:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0xE0);
			break;
		}
	case Error_permanent_service_denied:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0xE1);
			break;
		}
	case Error_permanent_message_format_corrupt:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0xE2);
			break;
		}
	case Error_permanent_message_not_found:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0xE3);
			break;
		}
	case Error_permanent_mmbox_full:
		{
			pos=strcatC(pos,Mms_Store_Status);
			pos=strcatC(pos,0xE4);
			break;
		}
	case UNUSED:
		{
			break;
		}
	}
	return pos;
}

/************************************************
编码内容中content_type值域的函数
*************************************************/
UC* EncodeBodyContentypeValue(UC *stream,UL32 iType)
{
	UL32 allseconds;
	UC *datetmp;
	if(messmms->body[iType].Contentype.accept)
	{
		strcatC(stream,Accept);
		strcatUC(stream,messmms->body[iType].Contentype.accept);
	}

	if(messmms->body[iType].Contentype.characterset)
	{
		strcatC(stream,Accept_Charset);
		strcatC(stream,(UC)(messmms->body[iType].Contentype.characterset));
	}
	if(messmms->body[iType].Contentype.charactersetext)
	{
		strcatC(stream,Accept_Charset);
		strcatUC(stream,messmms->body[iType].Contentype.charactersetext);
	}

	if(messmms->body[iType].Contentype.acceptencoding)
	{
		strcatC(stream,Accept_Encoding);
		strcatUC(stream,messmms->body[iType].Contentype.acceptencoding);
	}

	if(messmms->body[iType].Contentype.acceptlanguage)
	{
		strcatC(stream,Accept_Language);
		strcatC(stream,(UC)(messmms->body[iType].Contentype.acceptlanguage));
	}
	if(messmms->body[iType].Contentype.acceptlanguagetext)
	{
		strcatC(stream,Accept_Language);
		strcatUC(stream,messmms->body[iType].Contentype.acceptlanguagetext);
	}

	if(messmms->body[iType].Contentype.acceptranges)
	{
		strcatC(stream,Accept_Ranges);
		strcatC(stream,messmms->body[iType].Contentype.acceptranges);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -