随笔 - 298  文章 - 377  trackbacks - 0
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿(34)

随笔分类

随笔档案

文章档案

相册

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

  1#define nWAP_SIN_EX    25  //单包WAP PUSH额外字节长度
  2#define nMMS_SIN_EX    77  //单包彩信额外字节长度
  3
  4int CWapPush::GetMMSEncode(
  5                                          char * pSrcNum,  //源发送号码
  6                              char * pUrl,     //下载连接
  7                                          char * pSubject, //标题
  8                                      int    nMMSSize, //字节大小
  9                                          char * pOut1,    //输出短信二进制
 10                                          int  * nOut1Len,
 11                                          char * pOut2,    //输出短信二进制
 12                                          int  * nOut2Len,
 13                                          int  * nCount)     //几条短信
 14{
 15        * nCount=1;
 16        int  nLeftByte;        
 17        char szEncode1[350*2]={0};          //加码编码1
 18    char szEncode2[350]={0};            //加码编码2 
 19        int  nSrcNumLen = strlen(pSrcNum) ;
 20        int  nUrlLen    = strlen(pUrl);
 21        int  nTransactionID= GetTransactionID();
 22    int  nSubjectLen=strlen(pSubject);  //标题长度
 23        int  nSubject_UTF_8_Len;            //标题***UTF-8的长度
 24        char *pSubject_UTF_8 =(char *) alloca (nSubjectLen* 3 + 1 + 3 ); //new char[nSubjectLen* 3 + 1 ]={0};
 25    GB2312ToUTF_8(pSubject, nSubjectLen,pSubject_UTF_8+2); //标题***UTF-8
 26        nSubject_UTF_8_Len=strlen(pSubject_UTF_8 + 2 );
 27        pSubject_UTF_8[0]=nSubject_UTF_8_Len + 1 + 1 ;            //charset value-length 
 28    pSubject_UTF_8[1]=0xEA;
 29        nSubject_UTF_8_Len=nSubject_UTF_8_Len + 2 ;
 30
 31    if( ( nMMS_SIN_EX + nSrcNumLen + nUrlLen + nSubject_UTF_8_Len  ) > 140 )
 32        {
 33                //第一条短信息
 34                                                    // udh
 35                szEncode1[0]='0';szEncode1[1] ='B';  // "0B" User Data Header Length (11 bytes)
 36                szEncode1[2]='0';szEncode1[3] ='5';  // "05" UDH Item Element id (Port Numbers)
 37                szEncode1[4]='0';szEncode1[5] ='4';  // "04  UDH IE length (4 bytes)
 38                szEncode1[6]='0';szEncode1[7] ='B';  // "0B" 
 39                szEncode1[8]='8';szEncode1[9] ='4';  // "84" destination port number
 40                szEncode1[10]='2';szEncode1[11] ='3';// "23" 
 41                szEncode1[12]='F';szEncode1[13] ='0';// "F0"origin port number
 42                szEncode1[14]='0';szEncode1[15] ='0';// "00"concatenation identifier element
 43                szEncode1[16]='0';szEncode1[17] ='3';// "03"length of params
 44                szEncode1[18]='3';szEncode1[19] ='A';// "3A"concat reference
 45                szEncode1[20]='0';szEncode1[21] ='2';// "02"total parts
 46                szEncode1[22]='0';szEncode1[23] ='1';// "01"sequence number
 47                
 48                                             //pud += "400601AE";
 49                ByteToHexString(nTransactionID,&szEncode1[24]); //transaction id (connectionless WSP)
 50                szEncode1[26]='0';szEncode1[27] ='6';// pdu type (06=push)
 51        szEncode1[28]='2';szEncode1[29] ='2';// Headers len
 52                //application/vnd.wap.mms-message+'0'
 53                memcpy(&szEncode1[30],"6170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500",0x20 * 2 );
 54                // AF84 x-wap-application.ua
 55        szEncode1[94]='A';szEncode1[95] ='F';
 56        szEncode1[96]='8';szEncode1[97] ='4';
 57        // MMS Specific stuff
 58        szEncode1[98]='8';szEncode1[99] ='C';
 59        szEncode1[100]='8';szEncode1[101] ='2';  //8C 82 message type (m-notification.ind)
 60        szEncode1[102]='9';szEncode1[103] ='8';  //98  MMS transaction ID
 61
 62        szEncode1[104]='3';szEncode1[105] ='3'; 
 63        szEncode1[106]='4';szEncode1[107] ='6';  
 64        szEncode1[108]='3';szEncode1[109] ='6';  
 65        szEncode1[110]='3';szEncode1[111] ='6'; 
 66        szEncode1[112]='3';szEncode1[113] ='8';  
 67        szEncode1[114]='3';szEncode1[115] ='8';  
 68                szEncode1[116]='3';szEncode1[117] ='2'; 
 69            ByteToHexString(nTransactionID,&szEncode1[118]);// transaction id (connectionless WSP)
 70                szEncode1[120]='0';szEncode1[121] ='0'; 
 71
 72        szEncode1[122]='8';szEncode1[123] ='D';
 73                szEncode1[124]='9';szEncode1[125] ='0';// 8D90 MMS version 1.0
 74        szEncode1[126]='8';szEncode1[127] ='9';// FROM
 75        ByteToHexString(nSrcNumLen + 1 + 1,&szEncode1[128]); // length of from
 76        szEncode1[130]='8';szEncode1[131] ='0';              // 80 address present
 77
 78                ByteArrayToHexString(pSrcNum,nSrcNumLen,&szEncode1[132]);            //发送号码
 79        szEncode1[132+ nSrcNumLen *2 ]='0';szEncode1[133+ nSrcNumLen *2 ]='0';//00
 80
 81        szEncode1[134+ nSrcNumLen *2 ]='9';szEncode1[135+ nSrcNumLen *2 ]='6';//96 subject
 82
 83        ByteArrayToHexString(pSubject_UTF_8,nSubject_UTF_8_Len,&szEncode1[136+ nSrcNumLen *2 ]);//显示标题
 84        szEncode1[136+ (nSubject_UTF_8_Len + nSrcNumLen)*2 ]='0';szEncode1[137+  (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//00
 85
 86            szEncode1[138+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[139+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='A';
 87        szEncode1[140+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[141+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//Personal message class
 88        szEncode1[142+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[143+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='E';//msg size
 89        int msgByte=0;
 90                if(nMMSSize&0xFF000000)
 91                {
 92                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%08X",nMMSSize);
 93                        msgByte=4;
 94                }
 95        else if(nMMSSize&0xFF0000)
 96                {
 97                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%06X",nMMSSize);
 98                        msgByte=3;
 99                }
100        else if(nMMSSize&0xFF00)
101                {
102                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%04X",nMMSSize);
103                        msgByte=2;
104                }
105        else if(nMMSSize&0xFF)
106                {
107                        sprintf(&szEncode1[146+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%02X",nMMSSize);
108                        msgByte=1;
109                }
110                ByteToHexString(msgByte,&szEncode1[144+ (nSubject_UTF_8_Len + nSrcNumLen) *2]); // 2 octets
111
112        szEncode1[146+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[147+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='8';//88 expiry
113        szEncode1[148+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[149+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='5';//05 expiry length
114        szEncode1[150+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[151+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='1';//81 relative format
115
116                szEncode1[152+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[153+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';// 3 octets
117        szEncode1[154+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[155+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='9';
118        szEncode1[156+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='3';szEncode1[157+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='A';
119        szEncode1[158+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[159+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='0';//01 51 80: 24hrs (86400 secs)
120        szEncode1[160+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[161+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';//83 content location
121
122                ByteArrayToHexString(pUrl, nUrlLen ,&szEncode1[162+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2]);
123                szEncode1[162+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte + nUrlLen) *2]='0';
124                szEncode1[163+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte + nUrlLen) *2]='0';
125
126            *nOut1Len=140;
127                ChangeStringToHexBuf(szEncode1, (*nOut1Len) *2  ,pOut1);
128                nLeftByte =  164 + (nUrlLen + nSubject_UTF_8_Len+nSrcNumLen +msgByte )*2  - 280;
129        
130                   //第二条短信息
131                szEncode2[0]='0';szEncode2[1] ='B';  // "0B" User Data Header Length (11 bytes)
132                szEncode2[2]='0';szEncode2[3] ='5';  // "05" UDH Item Element id (Port Numbers)
133                szEncode2[4]='0';szEncode2[5] ='4';  // "04  UDH IE length (4 bytes)
134                szEncode2[6]='0';szEncode2[7] ='B';  // "0B" 
135                szEncode2[8]='8';szEncode2[9] ='4';  // "84" destination port number
136                szEncode2[10]='2';szEncode2[11] ='3';// "23" 
137                szEncode2[12]='F';szEncode2[13] ='0';// "F0"origin port number
138                szEncode2[14]='0';szEncode2[15] ='0';// "00"concatenation identifier element
139                szEncode2[16]='0';szEncode2[17] ='3';// "03"length of params
140                szEncode2[18]='3';szEncode2[19] ='A';// "3A"concat reference
141                szEncode2[20]='0';szEncode2[21] ='2';// "02"total parts
142                szEncode2[22]='0';szEncode2[23] ='2';// "01"sequence number
143                memcpy(&szEncode2[24],&szEncode1[280],nLeftByte);
144                *nOut2Len= 12+ nLeftByte/2 ;
145                ChangeStringToHexBuf(szEncode2, (*nOut2Len )*2 ,pOut2);
146                * nCount = 2 ;        
147        }        
148        else
149        {
150        // User Data Header: udh
151                szEncode1[0]='0';szEncode1[1] ='6';  // "06" User Data Header Length (6 bytes)
152                szEncode1[2]='0';szEncode1[3] ='5';  // "05" UDH Item Element id (Port Numbers)
153                szEncode1[4]='0';szEncode1[5] ='4';  // "04  UDH IE length (4 bytes)
154                szEncode1[6]='0';szEncode1[7] ='B';  // "0B" 
155                szEncode1[8]='8';szEncode1[9] ='4';  // "84" destination port number
156                szEncode1[10]='2';szEncode1[11] ='3';// "23" 
157                szEncode1[12]='F';szEncode1[13] ='0';// "F0"origin port number
158                //WSP header:
159            ByteToHexString(nTransactionID,&szEncode1[14]);// transaction id (connectionless WSP)
160                szEncode1[16]='0';szEncode1[17] ='6';// pdu type (06=push)
161        szEncode1[18]='2';szEncode1[19] ='2';// Headers len
162                //application/vnd.wap.mms-message+'0'
163                memcpy(&szEncode1[20],"6170706C69636174696F6E2F766E642E7761702E6D6D732D6D65737361676500",0x20 * 2 );
164                // AF84 x-wap-application.ua
165        szEncode1[84]='A';szEncode1[85] ='F';
166        szEncode1[86]='8';szEncode1[87] ='4';
167        // MMS Specific stuff
168        szEncode1[88]='8';szEncode1[89] ='C';
169        szEncode1[90]='8';szEncode1[91] ='2';  //8C 82 message type (m-notification.ind)
170        szEncode1[92]='9';szEncode1[93] ='8';  //98  MMS transaction ID
171
172        szEncode1[94]='3';szEncode1[95] ='3'; 
173        szEncode1[96]='4';szEncode1[97] ='6';  
174        szEncode1[98]='3';szEncode1[99] ='6';  
175        szEncode1[100]='3';szEncode1[101] ='6'; 
176        szEncode1[102]='3';szEncode1[103] ='8';  
177        szEncode1[104]='3';szEncode1[105] ='8';  
178                szEncode1[106]='3';szEncode1[107] ='2'; 
179            ByteToHexString(nTransactionID,&szEncode1[108]);// transaction id (connectionless WSP)
180                szEncode1[110]='0';szEncode1[111] ='0'; 
181
182        szEncode1[112]='8';szEncode1[113] ='D';
183                szEncode1[114]='9';szEncode1[115] ='0';// 8D90 MMS version 1.0
184        szEncode1[116]='8';szEncode1[117] ='9';// FROM
185        ByteToHexString(nSrcNumLen + 1 + 1,&szEncode1[118]); // length of from
186        szEncode1[120]='8';szEncode1[121] ='0';              // 80 address present
187
188                ByteArrayToHexString(pSrcNum,nSrcNumLen,&szEncode1[122]);            //发送号码
189        szEncode1[122+ nSrcNumLen *2 ]='0';szEncode1[123+ nSrcNumLen *2 ]='0';//00
190
191        szEncode1[124+ nSrcNumLen *2 ]='9';szEncode1[125+ nSrcNumLen *2 ]='6';//96 subject
192
193        ByteArrayToHexString(pSubject_UTF_8,nSubject_UTF_8_Len,&szEncode1[126+ nSrcNumLen *2 ]);//显示标题
194        szEncode1[126+ (nSubject_UTF_8_Len + nSrcNumLen)*2 ]='0';szEncode1[127+  (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//00
195
196            szEncode1[128+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[129+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='A';
197        szEncode1[130+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[131+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='0';//Personal message class
198        szEncode1[132+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='8';szEncode1[133+ (nSubject_UTF_8_Len + nSrcNumLen) *2 ]='E';//msg size
199        int msgByte=0;
200                if(nMMSSize&0xFF000000)
201                {
202                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%08X",nMMSSize);
203                        msgByte=4;
204                }
205        else if(nMMSSize&0xFF0000)
206                {
207                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%06X",nMMSSize);
208                        msgByte=3;
209                }
210        else if(nMMSSize&0xFF00)
211                {
212                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%04X",nMMSSize);
213                        msgByte=2;
214                }
215        else if(nMMSSize&0xFF)
216                {
217                        sprintf(&szEncode1[136+(nSubject_UTF_8_Len + nSrcNumLen )*2],"%02X",nMMSSize);
218                        msgByte=1;
219                }
220                ByteToHexString(msgByte,&szEncode1[134+ (nSubject_UTF_8_Len + nSrcNumLen) *2]); // 2 octets
221        szEncode1[136+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[137+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='8';//88 expiry
222        szEncode1[138+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[139+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='5';//05 expiry length
223        szEncode1[140+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[141+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='1';//81 relative format
224                szEncode1[142+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[143+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';// 3 octets
225        szEncode1[144+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='0';szEncode1[145+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='9';
226        szEncode1[146+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='3';szEncode1[147+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='A';
227        szEncode1[148+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[149+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='0';//01 51 80: 24hrs (86400 secs)
228        szEncode1[150+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2 ]='8';szEncode1[151+ (nSubject_UTF_8_Len+nSrcNumLen+msgByte)*2]='3';//83 content location
229                ByteArrayToHexString(pUrl, nUrlLen ,&szEncode1[152+ (nSubject_UTF_8_Len+nSrcNumLen +msgByte) *2]);
230        szEncode1[152+ (nSubject_UTF_8_Len + nSrcNumLen + msgByte + nUrlLen) *2 ]='0';szEncode1[153 + (nSubject_UTF_8_Len+nSrcNumLen+msgByte+nUrlLen) *2]='0';//00结束
231                *nOut1Len= 152/2 + 1 + nSubject_UTF_8_Len + nSrcNumLen + msgByte + nUrlLen;
232                ChangeStringToHexBuf(szEncode1, (*nOut1Len) *2  ,pOut1);
233                //WriteFile("mms.txt" ,szEncode1 ,(*nOut1Len) *2);
234        }
235        return 0;
236}
237



  1BYTE ChangeAsciiToHexByte(char src_char)
  2{
  3        BYTE src_byte = ( BYTE ) src_char; 
  4
  5        BYTE result_byte = src_byte; 
  6
  7        if(  src_byte >= 0x30 
  8          && src_byte <= 0x39 ) 
  9        
 10          result_byte = src_byte - 0x30
 11          return result_byte; 
 12        }
 
 13   
 14        if(  src_byte >= 0x41 
 15          && src_byte <= 0x46 ) 
 16        
 17          result_byte = src_byte - 0x41 + 0x0a
 18        }
 
 19
 20        if(  src_byte >= 0x61 
 21          && src_byte >= 0x66 ) 
 22        
 23          result_byte = src_byte - 0x61 + 0x0a
 24        }
 
 25
 26        return result_byte; 
 27}

 28
 29char *ChangeStringToHexBuf(char *pSrc, int len, char *pResultBuf)
 30{
 31
 32        int     nLength = len/2 ;
 33    BYTE        first_byte;
 34        BYTE        second_byte; 
 35        BYTE        result_byte;
 36        forint nIndex = 0; nIndex < nLength; nIndex ++ )
 37        {                
 38                first_byte  = ChangeAsciiToHexByte(pSrc[ nIndex * 2 ] );
 39                second_byte = ChangeAsciiToHexByte(pSrc[ nIndex * 2 + 1]);
 40                result_byte = ( BYTE ) ( first_byte * 16 + second_byte );
 41                pResultBuf[ nIndex ] = result_byte;
 42        }

 43        pResultBuf[ nIndex ] = '\0';
 44        return pResultBuf;
 45}

 46
 47static char HexCode[] = 
 48{
 49      '0''1''2''3''4''5''6''7''8''9',
 50      'A''B''C''D''E''F',
 51}
;
 52char * ByteToHexString(BYTE src_byte,char *pHexCode)
 53{
 54        int n = src_byte;
 55    if  (n < 0)
 56      n = 256 + n;
 57    pHexCode[0= HexCode[n / 16];
 58    pHexCode[1= HexCode[n % 16];
 59        return pHexCode;
 60}

 61char * ByteArrayToHexString(char *pSrc,int nLen ,char *pDesc)
 62{
 63        for (int nIndex = 0 ; nIndex <nLen; nIndex ++ )
 64        {
 65                ByteToHexString( (BYTE) pSrc[nIndex] , pDesc );
 66                pDesc    = pDesc + 2;
 67        }

 68    return pDesc;
 69}

 70
 71char * UTF_8ToUnicode(char *pText,WCHAR *pOut )
 72{
 73        unsigned char* uchar = (unsigned char *)pOut;
 74        uchar[1= ((pText[0& 0x0F<< 4+ ((pText[1>> 2& 0x0F);
 75        uchar[0= ((pText[1& 0x03<< 6+ (pText[2& 0x3F);
 76        return (char* )uchar ;
 77}

 78
 79char *UnicodeToUTF_8( WCHAR *pText,char *pOut)
 80{
 81        // 注意 WCHAR高低字的顺序,低字节在前,高字节在后
 82        unsigned char * pchar = (unsigned char *)pText;
 83        unsigned char * pdest = (unsigned char *)pOut;
 84        pdest[0= (0xE0 | ((pchar[1& 0xF0>> 4));
 85        pdest[1= (0x80 | ((pchar[1& 0x0F<< 2)) + ((pchar[0& 0xC0>> 6);
 86        pdest[2= (0x80 | (pchar[0& 0x3F));
 87        return (char * )pdest;
 88}

 89
 90char * Gb2312ToUnicode(char *pBuffer,WCHAR *pOut)
 91{
 92        ::MultiByteToWideChar(936,MB_PRECOMPOSED,pBuffer,2,pOut,1);
 93     return (char *)pOut;
 94}

 95char * UnicodeToGB2312(WCHAR *pBuffer,char  *pOut)
 96{
 97        WideCharToMultiByte(936,NULL,pBuffer,1,pOut,sizeof(WCHAR),NULL,NULL);
 98    return (char *)pOut;
 99}

100char * GB2312ToUTF_8(char *pText, int pLen,char * pOut)
101{
102        //UTF_8 must be three bytes
103        char buf[4]={0};
104        char* rst = pOut;  //new char[pLen * 3 + 2];//char* rst = new char[pLen + (pLen >> 2) + 2];
105        int i = 0;
106        int j = 0;      
107    WCHAR pbuffer;
108        while(i < pLen)
109        {
110            //如果是英文直接复制就可以
111            if*(pText + i) >= 0)
112                {
113                        rst[j++= pText[i++];
114                }

115            else
116                {
117                    Gb2312ToUnicode(pText+i,&pbuffer);
118                    UnicodeToUTF_8(&pbuffer,buf);               
119                    rst[j]   = buf[0];
120                    rst[j+1= buf[1];
121                    rst[j+2= buf[2];
122                    j += 3;
123                    i += 2;
124                }

125        }

126        rst[j] = '\0';                          
127        return pOut ;
128}

129
130char * UTF_8ToGB2312( char *pText, int pLen,char * pOut)
131{
132        char * newBuf = pOut ;
133        char Ctemp[4]={0};
134    int i = 0;
135    int j = 0;
136    WCHAR Wtemp;
137    while(i < pLen)
138    {
139        if(pText > 0)
140        {
141             newBuf[j++= pText[i++];                       
142        }

143        else                 
144        {
145            UTF_8ToUnicode(pText + i,&Wtemp);
146            UnicodeToGB2312(&Wtemp,Ctemp);
147            newBuf[j]     = Ctemp[0];
148            newBuf[j + 1= Ctemp[1];
149            i += 3;    
150            j += 2;   
151        }

152    }

153    newBuf[j] = '\0';   
154    return pOut; 
155}


  1char * CMMSEncoder::encodeUintvar( int data, char *pUintVar ,int *iUintVarLen)
  2{
  3        char reversed[8]={0};
  4    int i = 0;
  5    reversed = data & 0x7f;   // The lowest
  6    data = data >> 7;
  7    i++;
  8    while ( data > 0 )
  9    {
 10        reversed = 0x80 | (data & 0x7f);
 11        i++;
 12        data = data >> 7;
 13    }

 14    // Reverse it because it is in reverse order
 15    for ( int j = 0; j < i; j++ )
 16    {
 17        pUintVar[j] = reversed[i - j - 1];
 18    }

 19        *iUintVarLen=i;
 20        return pUintVar;
 21}

 22int  CMMSEncoder::decodeUintvar(char *pUintVar ,int iUintVarLen)
 23{
 24    int uintvar = 0 , i = 0;
 25    while ( pUintVar & 0x80 )
 26    {
 27        uintvar  = uintvar << 7;
 28        uintvar |=pUintVar & 0x7f;
 29        i++;
 30    }

 31    uintvar  = uintvar << 7;
 32    uintvar |= pUintVar & 0x7f;
 33    return uintvar;
 34}

 35int CMMSEncoder::encodeContentType(char *pContentType)
 36{
 37    if(stricmp(pContentType,"*/*"==0)
 38        return 0;
 39    if(stricmp(pContentType,"text/*"==0)
 40        return 1;
 41    if(stricmp(pContentType,"text/html"==0)
 42        return 2;
 43    if(stricmp(pContentType,"text/plain"==0)
 44        return 3;
 45    if(stricmp(pContentType,"text/x-hdml"==0)
 46        return 4;
 47    if(stricmp(pContentType,"text/x-ttml"==0)
 48        return 5;
 49    if(stricmp(pContentType,"text/x-vCalendar"==0)
 50        return 6;
 51    if(stricmp(pContentType,"text/x-vCard"==0)
 52        return 7;
 53    if(stricmp(pContentType,"text/vnd.wap.wml"==0)
 54        return 8;
 55    if(stricmp(pContentType,"text/vnd.wap.wmlscript"==0)
 56        return 9;
 57    if(stricmp(pContentType,"text/vnd.wap.channel"==0)
 58        return 10;
 59    if(stricmp(pContentType,"multipart/*"==0)
 60        return 11;
 61    if(stricmp(pContentType,"multipart/mixed"==0)
 62        return 12;
 63    if(stricmp(pContentType,"multipart/form-data"==0)
 64        return 13;
 65    if(stricmp(pContentType,"multipart/byteranges"==0)
 66        return 14;
 67    if(stricmp(pContentType,"multipart/alternative"==0)
 68        return 15;
 69    if(stricmp(pContentType,"application/*"==0)
 70        return 16;
 71    if(stricmp(pContentType,"application/java-vm"==0)
 72        return 17;
 73    if(stricmp(pContentType,"application/x-www-form-urlencoded"==0)
 74        return 18;
 75    if(stricmp(pContentType,"application/x-hdmlc"==0)
 76        return 19;
 77    if(stricmp(pContentType,"application/vnd.wap.wmlc"==0)
 78        return 20;
 79    if(stricmp(pContentType,"application/vnd.wap.wmlscriptc"==0)
 80        return 21;
 81    if(stricmp(pContentType,"application/vnd.wap.channelc"==0)
 82        return 22;
 83    if(stricmp(pContentType,"application/vnd.wap.uaprof"==0)
 84        return 23;
 85    if(stricmp(pContentType,"application/vnd.wap.wtls-ca-certificate"==0)
 86        return 24;
 87    if(stricmp(pContentType,"application/vnd.wap.wtls-user-certificate"==0)
 88        return 25;
 89    if(stricmp(pContentType,"application/x-x509-ca-cert"==0)
 90        return 26;
 91    if(stricmp(pContentType,"application/x-x509-user-cert"==0)
 92        return 27;
 93    if(stricmp(pContentType,"image/*"==0)
 94        return 28;
 95    if(stricmp(pContentType,"image/gif"==0)
 96        return 29;
 97    if(stricmp(pContentType,"image/jpeg"==0)
 98        return 30;
 99    if(stricmp(pContentType,"image/tiff"==0)
100        return 31;
101    if(stricmp(pContentType,"image/png"==0)
102        return 32;
103    if(stricmp(pContentType,"image/vnd.wap.wbmp"==0)
104        return 33;
105    if(stricmp(pContentType,"application/vnd.wap.multipart.*"==0)
106        return 34;
107    if(stricmp(pContentType,"application/vnd.wap.multipart.mixed"==0)
108        return 35;
109    if(stricmp(pContentType,"application/vnd.wap.multipart.form-data"==0)
110        return 36;
111    if(stricmp(pContentType,"application/vnd.wap.multipart.byteranges"==0)
112        return 37;
113    if(stricmp(pContentType,"application/vnd.wap.multipart.alternative"==0)
114        return 38;
115    if(stricmp(pContentType,"application/xml"==0)
116        return 39;
117    if(stricmp(pContentType,"text/xml"==0)
118        return 40;
119    if(stricmp(pContentType,"application/vnd.wap.wbxml"==0)
120        return 41;
121    if(stricmp(pContentType,"application/x-x968-cross-cert"==0)
122        return 42;
123    if(stricmp(pContentType,"application/x-x968-ca-cert"==0)
124        return 43;
125    if(stricmp(pContentType,"application/x-x968-user-cert"==0)
126        return 44;
127    if(stricmp(pContentType,"text/vnd.wap.si"==0)
128        return 45;
129    if(stricmp(pContentType,"application/vnd.wap.sic"==0)
130        return 46;
131    if(stricmp(pContentType,"text/vnd.wap.sl"==0)
132        return 47;
133    if(stricmp(pContentType,"application/vnd.wap.slc"==0)
134        return 48;
135    if(stricmp(pContentType,"text/vnd.wap.co"==0)
136        return 49;
137    if(stricmp(pContentType,"application/vnd.wap.coc"==0)
138        return 50;
139    if(stricmp(pContentType,"application/vnd.wap.multipart.related"==0)
140        return 51;
141    if(stricmp(pContentType,"application/vnd.wap.sia"==0)
142        return 52;
143    if(stricmp(pContentType,"text/vnd.wap.connectivity-xml"==0)
144        return 53;
145    if(stricmp(pContentType,"application/vnd.wap.connectivity-wbxml"==0)
146                return 54;
147        else
148                return -1;
149}


void CMMSEncoder::setMMSHead(char *pFrom,char *pTo,char *pSubject,int nMultipartRelated,int nChoiceType)
{
        memset(m_szFrom,
0,sizeof(m_szFrom));
        
if(pFrom)
        
{
                strcpy(m_szFrom,pFrom);
        }

        memset(m_szTo,
0,sizeof(m_szTo));
        
if(pTo)
        
{
                strcpy(m_szTo,pTo);
        }

        memset(m_szSubject,
0,sizeof(m_szSubject));
        
if(pSubject)
        
{
                strcpy(m_szSubject,pSubject);
        }

        m_nIsMultipartRelated
=nMultipartRelated;
        m_nChoiceType
=nChoiceType;
}

int CMMSEncoder::encodeHead(char *pHeader,char *pFrom,char *pTo,char *pSubject)
{
        
int nIndex=0;
        pHeader[nIndex
++]=0x8C;       // X-Mms-Message-Type
        if(m_nChoiceType)             //m-send-req
        {
                pHeader[nIndex
++]=0x80;   //m-send-req 
    }

        
else
        
{
                pHeader[nIndex
++]=0x84;  // m-retrieve-conf 
        }

        pHeader[nIndex
++]=0x98;  // transaction-id mms header
        char szMessageId[12]={0};
        m_MessageTransactionId
=time(NULL);
        nIndex
=nIndex+sprintf(&pHeader[nIndex],"%08X",m_MessageTransactionId);
    pHeader[nIndex
++]=0x00;  

        pHeader[nIndex
++]=0x8D;  // X-Mms-Version 
        pHeader[nIndex++]=0x90;  // 1.0     
    if(pFrom)
        
{   
                
if(pFrom[0])
                
{
                        
int iFromLen=strlen(pFrom);
                        pHeader[nIndex
++]=0x89;       //  From mms header
                        pHeader[nIndex++]=iFromLen+2//  address-length
                        pHeader[nIndex++]=0x80;       //  address-present-token
                        memcpy(&pHeader[nIndex],pFrom,iFromLen);
                        nIndex
=nIndex+iFromLen;
                        pHeader[nIndex
++]=0x00;       //  string terminator
                }

        }



if (pTo && (*pTo) )
        
{
            
int iToLen=strlen(pTo);
                pHeader[nIndex
++]=0x97;     //  To mms header
        memcpy(&pHeader[nIndex],pTo,iToLen);
                nIndex
=nIndex+iToLen;
                pHeader[nIndex
++]=0x00;     //  string terminator
        }

        
/*if (1)//CC =0x82
        {
            int iToLen=strlen("13820412022";
                pHeader[nIndex++]=0x82;     //  To mms header
        memcpy(&pHeader[nIndex],"13820412022",iToLen);
                nIndex=nIndex+iToLen;
                pHeader[nIndex++]=0x00;     //  string terminator
        }
*/

        
if(pSubject)
        

                
if(pSubject[0])
                
{
                
int  iSubjectLen=strlen(pSubject);
                    
int  nSubject_UTF_8_Len;            //标题***UTF-8的长度
                   char *pSubject_UTF_8 =(char *) alloca (iSubjectLen* 3 + 1 ); //new char[nSubjectLen* 3 + 1 ]={0};
                        GB2312ToUTF_8(pSubject, iSubjectLen,pSubject_UTF_8 );        //标题***UTF-8
            nSubject_UTF_8_Len=strlen(pSubject_UTF_8);
                        pHeader[nIndex
++]=0x96;     // Subject
            pHeader[nIndex++]=nSubject_UTF_8_Len + 1 + 1 ;
            pHeader[nIndex
++]=0xEA;
                        memcpy(
&pHeader[nIndex],pSubject_UTF_8,nSubject_UTF_8_Len);
                        nIndex
=nIndex+nSubject_UTF_8_Len;
                        pHeader[nIndex
++]=0x00;     // string terminator
                }

        }

pHeader[nIndex++= 0x8A// mes. class  
    pHeader[nIndex++= 0x80// personal  
    pHeader[nIndex++= 0x8F// priority  
    pHeader[nIndex++= 0x81// normal  
    pHeader[nIndex++= 0x94// sender visibility 
    pHeader[nIndex++= 0x81// no  
    pHeader[nIndex++= 0x86// delivery report  
    pHeader[nIndex++= 0x81// no  
    pHeader[nIndex++= 0x90// read reply  
    pHeader[nIndex++= 0x81// no 
    pHeader[nIndex++= 0x84// Content-type   
        if(m_nMessageParts==0)
        
{
                
return nIndex;
        }

        
if(m_nIsMultipartRelated) //related
        {
                
char szSIMLId[64]={0}//SIML文件ID
                int  iSIMLIdlen=0 ; 
                CMMSMessage 
*pPre,*pNext;
                pNext
=pPre=m_pMMSMessage;
                
while(pNext)
                
{
                        
if(stricmp(pNext->m_szContentType,"application/smil"==0)
                        
{
                                strcpy(szSIMLId,pNext
->m_szContentId);
                                iSIMLIdlen
=strlen(szSIMLId); 
                                
break;
                        }

                        pNext
=pNext->m_next;
                }



int  index=0;
   
int  iContentIdLen=0;
   
int  iContentLocationLen=0;
   
int  iId_Location_len=0;  
   
if(pContentId)     
   
{
           iContentIdLen
=strlen(pContentId) + 1 ;//"\0"
           /*
           if(m_nIsMultipartRelated)
           {
                   iId_Location_len=strlen("Content-ID"+1;
           }
           else
           {
                   iId_Location_len=2 ;
           }
*/

       iId_Location_len
=2 ;
   }

   
if(pContentLocation)  
   
{
           iContentLocationLen
=strlen(pContentLocation)+1;//"\0"
           iId_Location_len= iId_Location_len + 1 ;
   }

   
int  iContentType=encodeContentType(pContentType) + 128 ;//补高字节
   if(iContentType>128)
   
{
           
if(iContentType==131)//text/plain
           {
                   
int headlen= 4 + iContentIdLen + iContentLocationLen +iId_Location_len ;//HEAD LENGTH
                   
//int headlen= 6 + iContentIdLen + iContentLocationLen +iId_Location_len ;//HEAD LENGTH
                   int iUintVarLen=0;
                   
//7-bit 编码
posted on 2007-04-28 12:05 聂文龙 阅读(2560) 评论(2)  编辑 收藏 引用

FeedBack:
# re: 一些网上收集的MMS相关代码 2007-12-27 16:09 农民
兄弟,你能不能把这代码发完整?
我急用,谢谢你了。
  回复  更多评论
  
# re: 一些网上收集的MMS相关代码 2008-12-30 21:18 姓伍的
兄弟 有完整可用代码吗,我付点费用,能共享吗?我的邮箱86751081@163.COM  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理