4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
7 * Sooyoung Ha <yoosah.ha@samsung.com>
8 * Sungmin Ha <sungmin82.ha@samsung.com>
9 * YeongKyoon Lee <yeongkyoon.lee@samsung.com>
11 * This library is free software; you can redistribute it and/or modify it under
12 * the terms of the GNU Lesser General Public License as published by the
13 * Free Software Foundation; either version 2.1 of the License, or (at your option)
16 * This library is distributed in the hope that it will be useful, but WITHOUT ANY
17 * WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
19 * License for more details.
21 * You should have received a copy of the GNU Lesser General Public License
22 * along with this library; if not, write to the Free Software Foundation, Inc., 51
23 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34 #include "sms_header.h"
38 void reverse(char* x, int len)
42 for (i = 0; i < j; i++)
50 char* AcItoa(int n, char* str, int b)
55 str[i++] = "0123456789ABCDEF"[n%b];
66 return (('a' <= (ch) && (ch) <= 'z')? ((ch) - ('a'-'A')) : (ch));
69 char* SmsUtilUnpackGSM8Code( char* szData, const BYTE* pIn, int in_len )
73 for (i = 0; i < in_len; i ++) {
81 int SmsUtilUnpackGSMCode( char* szData, const BYTE* pIn, int in_len )
87 /* If the number of fill bits != 0, then it would cause an additional shift */
96 for ( i = 0; i < in_len; i++, pos++ )
98 szData[i] = ( pIn[pos] << shift ) & 0x7F;
102 /* except the first byte, a character contains some bits
103 ** from the previous byte.
105 szData[i] |= pIn[pos-1] >> (8-shift);
114 /* a possible extra complete character is available */
116 szData[i] = pIn[pos] >> 1;
120 /* this is the end of the input, quit */
129 int SmsUtilpackGSM8Code( BYTE* pOut, const char* szData, int in_len )
134 for (i = 0; i < in_len; i ++) {
135 pOut[i] = szData [i];
142 int SmsUtilPackGSMCode( BYTE* pOut, const char* szData, int in_len )
149 // memset( out, 0, out_len_max );
151 /* pack the ASCII characters
158 for( pos = 0, i = 0; /*pos < out_len_max &&*/ i < in_len; pos++, i++ )
160 /* pack the low bits */
161 pOut[pos] = szData[i] >> shift;
163 if ( i + 1 < in_len )
165 /* pack the high bits using the low bits of the next character */
166 pOut[pos] |= szData[i+1] << ( 7 - shift );
183 void SmsUtilConvertBCD2Digit( char* pDigits, char* pBCD, int digitLen )
187 unsigned char higher, lower;
189 //SysDebug( ( MID_SMS, "__SmsConvertBCD2Digit: start.\n" ) );
191 if ( pBCD == NULL || pDigits == NULL )
193 printf("__SmsConvertBCD2Digit: pBCD == NULL || pDigits == NULL. return.\n" );
199 //printf("__SmsConvertBCD2Digit: digitLen == 0. return.\n" );
207 bcdLen = digitLen / 2 + 1;
209 bcdLen = digitLen / 2;
211 memset( pDigits, 0, bcdLen * 2 );
213 for ( i = 0; i < bcdLen; i++ )
215 lower = pBCD[i] & 0x0F; // get low nibble
219 else if ( lower == 0x0B )
221 else if ( lower == 0x0C )
222 lower = 'p'; //DTMF Control pDigits seperator
223 else if ( lower == 0x0F )
227 AcItoa( lower, c, 16 );
228 lower = (char) AcToupper(c[0]);
231 higher = ( pBCD[i] >> 4 ) & 0x0F; // get high nibble
233 if ( higher == 0x0A )
234 higher = '*'; // =0x2A
235 else if ( higher == 0x0B )
236 higher = '#'; // =0x23
237 else if ( higher == 0x0C )
238 higher = 'p'; // =0x70, DTMF Control pDigits seperator
239 else if ( higher == 0x0F ) // if higher semi-octet is 0x0F, filled bits.
242 sprintf(pDigits + strlen(pDigits), "%c", lower);
243 pDigits[/*digitLen-1*/bcdLen*2-1] = '\0';
245 //printf("__SmsConvertBCD2Digit: pDigits [%s].\n", pDigits );
251 AcItoa(higher, c, 16);
252 higher = (char) AcToupper(c[0]);
255 //sprintf(pDigits, "%s%c%c", pDigits, lower, higher);
256 sprintf(pDigits + strlen(pDigits), "%c%c", lower, higher);
259 pDigits[digitLen] = '\0';
261 //printf("__SmsConvertBCD2Digit: pDigits [%s].\n", pDigits );
265 void SmsUtilConvertDigit2BCD( char* pBCD, char* pDigits, int digitLen )
269 unsigned char higher, lower;
271 if ( pBCD == NULL || pDigits == NULL )
274 // 0123456789 -> 1032547698
275 for ( i = 0, j = 0; i < digitLen; i = i + 2, j++ )
277 if ( pDigits[i] == '*' )
279 else if ( pDigits[i] == '#' )
281 else if ( AcToupper( pDigits[i] ) == 'P' )
284 digit = (int) ( pDigits[i] - '0' );
286 lower = digit & 0x0F;
288 if ( digitLen != i + 1 )
290 if ( pDigits[i+1] == '*' )
292 else if ( pDigits[i+1] == '#' )
294 else if ( AcToupper( pDigits[i+1] ) == 'P' )
297 digit = (int) ( pDigits[i+1] - '0' );
299 higher = digit & 0x0F;
306 pBCD[j] = ( higher << 4 ) | lower;
311 TmDateTime* SmsUtilDecodeTimeStamp(unsigned char * pTimeStamp, TmDateTime *tmDateTime )
313 //TmDateTime tmDateTime;
317 if ( pTimeStamp == NULL )
320 SmsUtilConvertBCD2Digit( szBuf, (char*) &pTimeStamp[0], 2 );
321 tmDateTime->year = atoi( szBuf ) + 2000;
322 if ( ( tmDateTime->year >= 1900 + MAX_YEAR )/* && ( tmDateTime->year < 2000 + BASE_YEAR )*/ )
323 tmDateTime->year -= 100;
324 SmsUtilConvertBCD2Digit( szBuf, (char*) &pTimeStamp[1], 2 );
325 tmDateTime->month = atoi( szBuf );
326 SmsUtilConvertBCD2Digit( szBuf, (char*) &pTimeStamp[2], 2 );
327 tmDateTime->day = atoi( szBuf );
328 SmsUtilConvertBCD2Digit( szBuf, (char*) &pTimeStamp[3], 2 );
329 tmDateTime->hour = atoi( szBuf );
330 SmsUtilConvertBCD2Digit( szBuf, (char*) &pTimeStamp[4], 2 );
331 tmDateTime->minute = atoi( szBuf );
332 SmsUtilConvertBCD2Digit( szBuf, (char*) &pTimeStamp[5], 2 );
333 tmDateTime->second = atoi( szBuf );
335 if ( ( tmDateTime->year < 1900 + BASE_YEAR ) || ( tmDateTime->year > 1900 + MAX_YEAR ) )
336 tmDateTime->year = 1900 + BASE_YEAR;
339 time = TmDateTimeToSeconds( &tmDateTime );
340 if ( time > MAX_SECONDS )
348 unsigned char* SmsUtilEncodeTimeStamp( TmDateTime* tmDateTime, unsigned char* pTimeStamp )
353 if ( pTimeStamp == NULL )
356 memset( (void*) pTimeStamp, 0x00, sizeof ( unsigned char ) * 7 );
358 year = tmDateTime->year - 2000;
362 sprintf( szBuf, "%02d", year );
363 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[0], szBuf, 2 );
364 sprintf( szBuf, "%02d", tmDateTime->month );
365 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[1], szBuf, 2 );
366 sprintf( szBuf, "%02d", tmDateTime->day );
367 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[2], szBuf, 2 );
368 sprintf( szBuf, "%02d", tmDateTime->hour );
369 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[3], szBuf, 2 );
370 sprintf( szBuf, "%02d", tmDateTime->minute );
371 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[4], szBuf, 2 );
372 sprintf( szBuf, "%02d", tmDateTime->second );
373 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[5], szBuf, 2 );
375 sprintf( szBuf, "%02d", 0x00 );
376 SmsUtilConvertDigit2BCD( (char*) &pTimeStamp[6], szBuf, 2 );
381 void SmsUtilDecodeAddrField_sca(char *diallingNum, unsigned char* pAddrField, int *result_ton, int *result_npi )
389 ton = ( pAddrField[index+1] & 0x70 ) >> 4;
390 npi = pAddrField[index+1] & 0x0F;
392 if ( ton != SIM_TON_ALPHA_NUMERIC )
394 // Origination/Destination address Çʵ忡¼ÀÇ length´Â ½ÇÁ¦ address length
395 // origination/destination address ÇʵåÀÎ °æ¿ì length°¡ 0 ÀÏ ¶§¶óµµ number type/plan Çʵå´Â 0xFF °ªÀ» °®´Â´Ù.
396 //dialnumLen = pAddrField[index++];
397 length = pAddrField[index];
398 // º¸³»Áö ¾ÊÀº ¸Þ½ÃÁöÀÇ °æ¿ì¿¡´Â service center address°¡ ¾øÀ» ¼öµµ ÀÖ´Ù.
399 // ÀÌ °æ¿ì¿¡ length °¡ 0 À̸é number type, plan µµ ¾ø´Â °æ¿ì
400 // length °¡ 1 À̸é type, plan ¸¸ ÀÖ´Â °æ¿ì
403 dialnumLen = ( pAddrField[index++] - 1 ) * 2; // -1Àº TON/API Çʵå
408 dialnumLen = ( ( ( pAddrField[index++] + 1 ) / 2 ) * 8 ) / 7;
414 // SIM_SMSP_ADDRESS_LEN º¸´Ù address length °¡ Å©¸é SIM_SMSP_ADDRESS_LEN ¸¸Å¸¸ º¯È¯À» ÇÑ´Ù.
416 if ( dialnumLen > SIM_SMSP_ADDRESS_LEN )
418 dialnumLen = SIM_SMSP_ADDRESS_LEN;
421 //printf(" dialnumLen = %d\n", dialnumLen );
423 index++; /* ignore Type of Address field */
425 if (ton != SIM_TON_ALPHA_NUMERIC )
427 SmsUtilConvertBCD2Digit( (char*)diallingNum, (char*) &pAddrField[index],dialnumLen );
431 SmsUtilUnpackGSMCode( diallingNum, &pAddrField[index],dialnumLen );
436 //printf( "__SmsDecodeAddrField: diallingNum [%s].\n", (char*) diallingNum );
443 void SmsUtilDecodeAddrField_dst(char *diallingNum, unsigned char* pAddrField, int *result_ton, int *result_npi )
449 ton = ( pAddrField[index+1] & 0x70 ) >> 4;
450 npi = pAddrField[index+1] & 0x0F;
452 if ( ton != SIM_TON_ALPHA_NUMERIC )
454 // Origination/Destination address Çʵ忡¼ÀÇ length´Â ½ÇÁ¦ address length
455 // origination/destination address ÇʵåÀÎ °æ¿ì length°¡ 0 ÀÏ ¶§¶óµµ number type/plan Çʵå´Â 0xFF °ªÀ» °®´Â´Ù.
456 dialnumLen = pAddrField[index++];
461 dialnumLen = ( ( ( pAddrField[index++] + 1 ) / 2 ) * 8 ) / 7;
467 // SIM_SMSP_ADDRESS_LEN º¸´Ù address length °¡ Å©¸é SIM_SMSP_ADDRESS_LEN ¸¸Å¸¸ º¯È¯À» ÇÑ´Ù.
469 if ( dialnumLen > SIM_SMSP_ADDRESS_LEN )
471 dialnumLen = SIM_SMSP_ADDRESS_LEN;
474 //printf(" dialnumLen = %d\n", dialnumLen );
476 index++; /* ignore Type of Address field */
478 if (ton != SIM_TON_ALPHA_NUMERIC )
480 SmsUtilConvertBCD2Digit( (char*)diallingNum, (char*) &pAddrField[index],dialnumLen );
484 SmsUtilUnpackGSMCode( diallingNum, &pAddrField[index],dialnumLen );
492 int SmsReadSMSCfromSIM(unsigned char* pAddrFiled)
497 pAddrFiled[index++] = 0x7; //there are 7 octets following
498 pAddrFiled[index++] = 0x91; //internatial format
500 pAddrFiled[index++]=0x11; // SMSC number stored in SIM is 111111111111
505 int SmsUtilEncodeAddrField_sca(unsigned char* pAddrField, unsigned char* diallingNum, int dialnumLen, int ton, int npi)
509 if ( diallingNum == NULL || pAddrField == NULL )
512 if ( ton != SIM_TON_ALPHA_NUMERIC )
514 if ( dialnumLen % 2 )
516 pAddrField[index++] = dialnumLen / 2 + 1 + 1;
520 pAddrField[index++] = dialnumLen / 2 + 1;
525 pAddrField[index] = (unsigned char) ( ( ( dialnumLen * 7 + 7 ) / 8 ) * 2 );
527 if ( ( ( dialnumLen * 7 ) % 8 ) <= 4 )
530 printf(" addr len packet: %d out of SIM_TON_ALPAHA\n", pAddrField[index]);
535 SET_TON_NPI( pAddrField[index], ton, npi );
539 if ( ton != SIM_TON_ALPHA_NUMERIC )
541 SmsUtilConvertDigit2BCD( (char*) &pAddrField[index], (char*) diallingNum, dialnumLen );
543 if ( dialnumLen % 2 )
544 index += dialnumLen / 2 + 1;
546 index += dialnumLen / 2;
550 index += SmsUtilPackGSMCode( &pAddrField[index], (char *)diallingNum, (int) dialnumLen );
556 int SmsUtilEncodeAddrField_dst(unsigned char* pAddrField, unsigned char* diallingNum, int dialnumLen, int ton, int npi )
560 if ( diallingNum == NULL || pAddrField == NULL )
563 if ( ton != SIM_TON_ALPHA_NUMERIC )
565 // Origination/Destination address Çʵ忡¼ÀÇ length´Â ½ÇÁ¦ address length
566 pAddrField[index++] = (unsigned char)dialnumLen;
567 //printf(" addr len packet: %d\n", pAddrField[index]);
571 pAddrField[index] = (unsigned char) ( ( ( dialnumLen * 7 + 7 ) / 8 ) * 2 );
573 // ¸¶Áö¸· ¹ÙÀÌÆ®¿¡¼ »óÀ§ 4ºñÆ®°¡ »ç¿ëµÇÁö ¾ÊÀ¸¸é length Çʵ尪À» -1À» ÇÑ´Ù.
574 if ( ( ( dialnumLen * 7 ) % 8 ) <= 4 )
577 printf(" addr len packet: %d out of SIM_TON_ALPAHA\n", pAddrField[index]);
585 SET_TON_NPI( pAddrField[index], ton, npi );
587 index++; // SET_TON_NPI °¡ MACRO À̹ǷΠ³»ºÎ¿¡¼ Áõ°¡½ÃÅ°¸é ¹ö±×
589 if ( ton != SIM_TON_ALPHA_NUMERIC )
591 SmsUtilConvertDigit2BCD( (char*) &pAddrField[index], (char*) diallingNum, dialnumLen );
593 if ( dialnumLen % 2 )
594 index += dialnumLen / 2 + 1;
596 index += dialnumLen / 2;
600 index += SmsUtilPackGSMCode( &pAddrField[index], (char *)diallingNum, (int) dialnumLen );
606 int SmsUtilEncodeAddrField(unsigned char* pAddrField, unsigned char* diallingNum, int dialnumLen, int ton, int npi )
610 if ( diallingNum == NULL || pAddrField == NULL )
613 if ( ton != SIM_TON_ALPHA_NUMERIC )
615 // Origination/Destination address Çʵ忡¼ÀÇ length´Â ½ÇÁ¦ address length
616 pAddrField[index++] = (unsigned char)dialnumLen;
617 //printf(" addr len packet: %d\n", pAddrField[index]);
621 pAddrField[index] = (unsigned char) ( ( ( dialnumLen * 7 + 7 ) / 8 ) * 2 );
623 // ¸¶Áö¸· ¹ÙÀÌÆ®¿¡¼ »óÀ§ 4ºñÆ®°¡ »ç¿ëµÇÁö ¾ÊÀ¸¸é length Çʵ尪À» -1À» ÇÑ´Ù.
624 if ( ( ( dialnumLen * 7 ) % 8 ) <= 4 )
627 printf(" addr len packet: %d out of SIM_TON_ALPAHA\n", pAddrField[index]);
635 SET_TON_NPI( pAddrField[index], ton, npi );
637 index++; // SET_TON_NPI °¡ MACRO À̹ǷΠ³»ºÎ¿¡¼ Áõ°¡½ÃÅ°¸é ¹ö±×
639 if ( ton != SIM_TON_ALPHA_NUMERIC )
641 SmsUtilConvertDigit2BCD( (char*) &pAddrField[index], (char*) diallingNum, dialnumLen );
643 if ( dialnumLen % 2 )
644 index += dialnumLen / 2 + 1;
646 index += dialnumLen / 2;
650 index += SmsUtilPackGSMCode( &pAddrField[index], (char *)diallingNum, (int) dialnumLen );
655 int SmsUtilDecodeScAddrField( SmsAddressInfo* pSmsAddrField, BYTE* pAddrField )
657 printf("SmsUtilDecodeScAddrField\n");
661 //SysDebug( ( MID_SMS, "__SmsDecodeScAddrField: start.\n" ) );
663 if ( pSmsAddrField == NULL || pAddrField == NULL )
665 printf( "SmsUtilDecodeScAddrField: pSimAddrField or pAddrField is NULL.\n" );
670 // Service Center address Çʵ忡¼ÀÇ length´Â µÚ¿¡ ³ª¿À´Â byteÀÇ ¼ö
671 // -> ½ÇÁ¦ address ±æÀÌ´Â TON/API ¹ÙÀÌÆ®¸¦ Á¦¿ÜÇÏ°í ³ª¸ÓÁö ¹ÙÀÌÆ®ÀÇ 2¹è or 2¹è - 1(½ÇÁ¦ ±æÀÌ°¡ Ȧ¼öÀΰæ¿ì)
672 length = pAddrField[index];
673 // º¸³»Áö ¾ÊÀº ¸Þ½ÃÁöÀÇ °æ¿ì¿¡´Â service center address°¡ ¾øÀ» ¼öµµ ÀÖ´Ù.
674 // ÀÌ °æ¿ì¿¡ length °¡ 0 À̸é number type, plan µµ ¾ø´Â °æ¿ì
675 // length °¡ 1 À̸é type, plan ¸¸ ÀÖ´Â °æ¿ì
678 pSmsAddrField->dialnumLen = ( pAddrField[index++] - 1 ) * 2; // -1Àº TON/API Çʵå
680 // SIM_SMSP_ADDRESS_LEN º¸´Ù address length °¡ Å©¸é SIM_SMSP_ADDRESS_LEN ¸¸Å¸¸ º¯È¯À» ÇÑ´Ù.
681 if ( pSmsAddrField->dialnumLen > SIM_SMSP_ADDRESS_LEN )
683 pSmsAddrField->dialnumLen = SIM_SMSP_ADDRESS_LEN;
686 pSmsAddrField->ton = ( pAddrField[index] & 0x70 ) >> 4;
687 pSmsAddrField->npi = pAddrField[index] & 0x0F;
689 index++; /* ignore Type of Address field */
691 SmsUtilConvertBCD2Digit( (char*) pSmsAddrField->diallingNum, (char*) &pAddrField[index], pSmsAddrField->dialnumLen );
693 printf( "SmsUtilDecodeScAddrField: diallingNum [%s].\n", (char*) pSmsAddrField->diallingNum );
695 printf( "length=%d , ton %d, npi =%d\n",pSmsAddrField->dialnumLen, pSmsAddrField->ton,pSmsAddrField->npi );
701 int SmsUtilEncodeScAddrField( BYTE* pAddrField, SmsAddressInfo * pSmsAddrField )
705 if ( pSmsAddrField == NULL || pAddrField == NULL )
708 // Service Center address Çʵ忡¼ÀÇ length´Â µÚ¿¡ ³ª¿À´Â byteÀÇ ¼ö
709 // -> ½ÇÁ¦ address ±æÀÌ´Â TON/API ¹ÙÀÌÆ®¸¦ Á¦¿ÜÇÏ°í ³ª¸ÓÁö ¹ÙÀÌÆ®ÀÇ 2¹è or 2¹è - 1(½ÇÁ¦ ±æÀÌ°¡ Ȧ¼öÀΰæ¿ì)
710 if ( pSmsAddrField->dialnumLen % 2 )
712 pAddrField[index++] = pSmsAddrField->dialnumLen / 2 + 1 + 1; // +1 Àº TON/NPI Çʵå, Ȧ¼ö°³ÀÎ °æ¿ì´Â °³¼ö¸¦ ¸ÂÃß±â À§ÇØ Çѹø ´õ +1
716 pAddrField[index++] = pSmsAddrField->dialnumLen / 2 + 1; // +1 Àº TON/NPI Çʵå
719 SET_TON_NPI( pAddrField[index], pSmsAddrField->ton, pSmsAddrField->npi );
721 index++; // SET_TON_NPI °¡ MACRO À̹ǷΠ³»ºÎ¿¡¼ Áõ°¡½ÃÅ°¸é ¹ö±×¹ß»ý
723 SmsUtilConvertDigit2BCD( (char*) &pAddrField[index], (char*) pSmsAddrField->diallingNum, pSmsAddrField->dialnumLen );
725 if ( pSmsAddrField->dialnumLen % 2 )
726 index += pSmsAddrField->dialnumLen / 2 + 1;
728 index += pSmsAddrField->dialnumLen / 2;
733 void SmsUtilDecodeDCS( TapiNetTextCodingScheme* pCodingScheme, unsigned char dcs )
735 assert( pCodingScheme != NULL );
737 memset( pCodingScheme, 0, sizeof ( TapiNetTextCodingScheme ) );
739 if ( dcs < 0x40 ) // bits 7..4 = 00xx : general data coding indication
741 pCodingScheme->codingGroupType = TAPI_NETTEXT_CODGRP_SM_GENERAL_DCS;
743 if ( dcs & 0x20 ) // bit 5 = 1 : indicates the text is compressed
744 pCodingScheme->bCompressed = TRUE;
746 if ( dcs & 0x10 ) // bit 4 = 1 : indicates that bits 1 to 0 have a message class meaning
748 pCodingScheme->bMsgClassSet = TRUE;
750 switch ( dcs & 0x03 ) // bits 1 to 0 : message class
753 pCodingScheme->classType = TAPI_NETTEXT_CLASS_0;
756 pCodingScheme->classType = TAPI_NETTEXT_CLASS_1;
759 pCodingScheme->classType = TAPI_NETTEXT_CLASS_2;
762 pCodingScheme->classType = TAPI_NETTEXT_CLASS_3;
766 else // bit 4 = 0 : indicates that bits 1 to 0 are reserved and have no message class meaning
767 pCodingScheme->classType = TAPI_NETTEXT_CLASS_NONE;
769 switch ( dcs & 0x0C ) // bits 4 to 3 : character set
772 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_DEFAULT;
775 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_8BIT;
778 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_UCS2;
781 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_MAX;
785 else if ( dcs >= 0x40 && dcs < 0x80 ) // bits 7..4 = 01xx : message marked for automatic deletion group. bits 5..0 are coded exactly the same as group 00xx
787 pCodingScheme->codingGroupType = TAPI_NETTEXT_CODGRP_SM_AUTO_DELETION;
789 if ( dcs & 0x20 ) // bit 5 = 1 : indicates the text is compressed
790 pCodingScheme->bCompressed = TRUE;
792 if ( dcs & 0x10 ) // bit 4 = 1 : indicates that bits 1 to 0 have a message class meaning
794 pCodingScheme->bMsgClassSet = TRUE;
796 switch ( dcs & 0x03 ) // bits 1 to 0 : message class
799 pCodingScheme->classType = TAPI_NETTEXT_CLASS_0;
802 pCodingScheme->classType = TAPI_NETTEXT_CLASS_1;
805 pCodingScheme->classType = TAPI_NETTEXT_CLASS_2;
808 pCodingScheme->classType = TAPI_NETTEXT_CLASS_3;
812 else // bit 4 = 0 : indicates that bits 1 to 0 are reserved and have no message class meaning
813 pCodingScheme->classType = TAPI_NETTEXT_CLASS_NONE;
815 switch ( dcs & 0x0C ) // bits 4 to 3 : character set
818 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_DEFAULT;
821 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_8BIT;
824 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_UCS2;
827 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_MAX;
831 // bits 7..4 = 1000 ~ 1011 : reserved
832 else if ( dcs == 0xC0 ) // bits 7..4 = 1100 : message waiting indication group, discard message
834 pCodingScheme->codingGroupType = TAPI_NETTEXT_CODGRP_SM_WAITING_DISCARD;
836 else if ( dcs < 0xE0 )
838 pCodingScheme->codingGroupType = TAPI_NETTEXT_CODGRP_SM_WAITING_STORE;
841 pCodingScheme->bMsgIndActive = TRUE;
843 switch ( dcs & 0x03 )
846 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_VOICE_MSG;
849 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_FAX_MSG;
852 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_EMAIL_MSG;
855 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_OTHER_MSG;
859 else if ( dcs < 0xF0 )
861 pCodingScheme->codingGroupType = TAPI_NETTEXT_CODGRP_SM_WAITING_STORE_UCS2;
864 pCodingScheme->bMsgIndActive = TRUE;
866 switch ( dcs & 0x03 )
869 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_VOICE_MSG;
872 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_FAX_MSG;
875 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_EMAIL_MSG;
878 pCodingScheme->waitingType = TAPI_NETTEXT_WAITING_OTHER_MSG;
884 pCodingScheme->codingGroupType = TAPI_NETTEXT_CODGRP_SM_CLASS_CODING;
887 pCodingScheme->alphabetType = TAPI_NETTEXT_ALPHABET_8BIT;
889 switch ( dcs & 0x03 )
892 pCodingScheme->classType = TAPI_NETTEXT_CLASS_0;
895 pCodingScheme->classType = TAPI_NETTEXT_CLASS_1;
898 pCodingScheme->classType = TAPI_NETTEXT_CLASS_2;
901 pCodingScheme->classType = TAPI_NETTEXT_CLASS_3;
907 void SmsUtilEncodeDCS( BYTE* pDCS, TapiNetTextCodingScheme* pCodingScheme )
911 assert( pCodingScheme != NULL );
913 switch ( pCodingScheme->codingGroupType )
915 case TAPI_NETTEXT_CODGRP_SM_GENERAL_DCS: // bit 7..4 is 00xx
917 if ( pCodingScheme->bCompressed )
918 dcs |= 0x20; // bit 5 is 1
920 if ( pCodingScheme->bMsgClassSet )
922 dcs |= 0x10; // bit 4 is 1
924 switch ( pCodingScheme->classType )
926 case TAPI_NETTEXT_CLASS_0: // bit 1..0 is 00
931 case TAPI_NETTEXT_CLASS_1: // bit 1..0 is 01
936 case TAPI_NETTEXT_CLASS_2: // bit 1..0 is 10
941 case TAPI_NETTEXT_CLASS_3: // bit 1..0 is 11
951 switch ( pCodingScheme->alphabetType )
953 case TAPI_NETTEXT_ALPHABET_DEFAULT: // bit 3..2 is 00
958 case TAPI_NETTEXT_ALPHABET_8BIT: // bit 3..2 is 01
963 case TAPI_NETTEXT_ALPHABET_UCS2: // bit 3..2 is 10
968 default: // bit 3..2 is 11
977 case TAPI_NETTEXT_CODGRP_SM_WAITING_DISCARD: // bit 7..4 is 1100
983 case TAPI_NETTEXT_CODGRP_SM_WAITING_STORE: // bit 7..4 is 1101
987 if ( pCodingScheme->bMsgIndActive ) // bit 3..2 is 10
990 switch ( pCodingScheme->waitingType )
992 case TAPI_NETTEXT_WAITING_VOICE_MSG: // bit 1..0 is 00
997 case TAPI_NETTEXT_WAITING_FAX_MSG: // bit 1..0 is 01
1002 case TAPI_NETTEXT_WAITING_EMAIL_MSG: // bit 1..0 is 10
1007 case TAPI_NETTEXT_WAITING_OTHER_MSG: // bit 1..0 is 11
1018 case TAPI_NETTEXT_CODGRP_SM_WAITING_STORE_UCS2: // bit 7..4 is 1110
1022 if ( pCodingScheme->bMsgIndActive ) // bit 3..2 is 10
1025 switch ( pCodingScheme->waitingType )
1027 case TAPI_NETTEXT_WAITING_VOICE_MSG: // bit 1..0 is 00
1032 case TAPI_NETTEXT_WAITING_FAX_MSG: // bit 1..0 is 01
1037 case TAPI_NETTEXT_WAITING_EMAIL_MSG: // bit 1..0 is 10
1042 case TAPI_NETTEXT_WAITING_OTHER_MSG: // bit 1..0 is 11
1053 case TAPI_NETTEXT_CODGRP_SM_CLASS_CODING: // bit 7..4 is 1111
1057 switch ( pCodingScheme->alphabetType )
1059 case TAPI_NETTEXT_ALPHABET_DEFAULT: // bit 2 is 0
1064 case TAPI_NETTEXT_ALPHABET_8BIT: // bit 2 is 1
1073 switch ( pCodingScheme->classType )
1075 case TAPI_NETTEXT_CLASS_0: // bit 1..0 is 00
1079 case TAPI_NETTEXT_CLASS_1: // bit 1..0 is 01
1084 case TAPI_NETTEXT_CLASS_2: // bit 1..0 is 10
1089 case TAPI_NETTEXT_CLASS_3: // bit 1..0 is 11
1100 case TAPI_NETTEXT_CODGRP_SM_RESERVED: // bit 7..4 is 1111
1102 dcs = (pCodingScheme->codingGroup << 4) & 0xF0;
1103 dcs |= (pCodingScheme->code & 0x0F);
1110 memcpy( pDCS, &dcs, sizeof ( BYTE ) );
1113 UINT8 SmsUtilEncodeValidity( BYTE* pValidity, TapiNetTextVP* pVP )
1117 switch( pVP->vpType )
1119 case TAPI_NETTEXT_VP_NOT_USED:
1122 case TAPI_NETTEXT_VP_RELATIVE:
1123 pValidity[pos] = (UINT8) pVP->vpValue;
1127 case TAPI_NETTEXT_VP_ABSOLUTE:
1129 //SmsUtilEncodeTimeStamp( pValidity, pVP->vpValue );
1133 case TAPI_NETTEXT_VP_ENHANCED: