📄 amoimess_mms_encode.c
字号:
/*
编码
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 + -