www.pudn.com > agsm2-1.2_src.zip > Helper.cpp
// Helper.cpp: implementation of the Helper class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "agsm2.h"
#include "Helper.h"
#include "malloc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define TOHEX(a, b) {*b++ = hextable[a >> 4];*b++ = hextable[a&0xf];}
#define BCDTOASCII(a,b) {*b++ = bcdtable[a&0xf]; *b++ = bcdtable[a >> 4];}
char Helper::hextable[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char Helper::bcdtable[16] = {'0','1','2','3','4','5','6','7','8','9','*','#','a','b','c','\0'};
static WCHAR gTable_AlphabetToUnicode[] = {
64, //0 COMMERCIAL AT @ 64
163, //1 POUND SIGN ¡ê 163
36, //2 DOLLAR SIGN $ 36
165, //3 YEN SIGN £¤ 165
232, //4 LATIN SMALL LETTER E WITH GRAVE ¨¨ 232
233, //5 LATIN SMALL LETTER E WITH ACUTE ¨¦ 233
249, //6 LATIN SMALL LETTER U WITH GRAVE ¨´ 249
236, //7 LATIN SMALL LETTER I WITH GRAVE ¨¬ 236
242, //8 LATIN SMALL LETTER O WITH GRAVE ¨° 242
199, //9 LATIN CAPITAL LETTER C WITH CEDILLA ? 199
10, //10 LINE FEED 10
216, //11 LATIN CAPITAL LETTER O WITH STROKE ? 216
248, //12 LATIN SMALL LETTER O WITH STROKE ? 248
13, //13 CARRIAGE RETURN 13
197, //14 LATIN CAPITAL LETTER A WITH RING ABOVE ? 197
229, //15 LATIN SMALL LETTER A WITH RING ABOVE ? 229
916, //16 GREEK CAPITAL LETTER DELTA ¦¤
95, //17 LOW LINE _ 95
934, //18 GREEK CAPITAL LETTER PHI ¦µ
915, //19 GREEK CAPITAL LETTER GAMMA ¦£
923, //20 GREEK CAPITAL LETTER LAMBDA ¦«
937, //21 GREEK CAPITAL LETTER OMEGA ¦¸
928, //22 GREEK CAPITAL LETTER PI ¦°
968, //23 GREEK CAPITAL LETTER PSI ¦·
931, //24 GREEK CAPITAL LETTER SIGMA ¦²
952, //25 GREEK CAPITAL LETTER THETA ¦¨
926, //26 GREEK CAPITAL LETTER XI ¦®
27, //27 ESCAPE TO EXTENSION TABLE
198, //28 LATIN CAPITAL LETTER AE ? 198
230, //29 LATIN SMALL LETTER AE ? 230
223, //30 LATIN SMALL LETTER SHARP S (German) ? 223
201, //31 LATIN CAPITAL LETTER E WITH ACUTE ¨¦ 201
32, //32 SPACE 32
33, //33 EXCLAMATION MARK ! 33
34, //34 QUOTATION MARK " 34
35, //35 NUMBER SIGN # 35
36, //36 CURRENCY SIGN ¡è 164 (ISO-8859-1)
37, //37 PERCENT SIGN % 37
38, //38 AMPERSAND & 38
39, //39 APOSTROPHE ' 39
40, //40 LEFT PARENTHESIS ( 40
41, //41 RIGHT PARENTHESIS ) 41
42, //42 ASTERISK * 42
43, //43 PLUS SIGN + 43
44, //44 COMMA , 44
45, //45 HYPHEN-MINUS - 45
46, //46 FULL STOP . 46
47, //47 SOLIDUS (SLASH) / 47
48, //48 DIGIT ZERO 0 48
49, //49 DIGIT ONE 1 49
50, //50 DIGIT TWO 2 50
51, //51 DIGIT THREE 3 51
52, //52 DIGIT FOUR 4 52
53, //53 DIGIT FIVE 5 53
54, //54 DIGIT SIX 6 54
55, //55 DIGIT SEVEN 7 55
56, //56 DIGIT EIGHT 8 56
57, //57 DIGIT NINE 9 57
58, //58 COLON : 58
59, //59 SEMICOLON ; 59
60, //60 LESS-THAN SIGN < 60
61, //61 EQUALS SIGN = 61
62, //62 GREATER-THAN SIGN > 62
63, //63 QUESTION MARK ? 63
64, //64 INVERTED EXCLAMATION MARK ? 161
65, //65 LATIN CAPITAL LETTER A A 65
66, //66 LATIN CAPITAL LETTER B B 66
67, //67 LATIN CAPITAL LETTER C C 67
68, //68 LATIN CAPITAL LETTER D D 68
69, //69 LATIN CAPITAL LETTER E E 69
70, //70 LATIN CAPITAL LETTER F F 70
71, //71 LATIN CAPITAL LETTER G G 71
72, //72 LATIN CAPITAL LETTER H H 72
73, //73 LATIN CAPITAL LETTER I I 73
74, //74 LATIN CAPITAL LETTER J J 74
75, //75 LATIN CAPITAL LETTER K K 75
76, //76 LATIN CAPITAL LETTER L L 76
77, //77 LATIN CAPITAL LETTER M M 77
78, //78 LATIN CAPITAL LETTER N N 78
79, //79 LATIN CAPITAL LETTER O O 79
80, //80 LATIN CAPITAL LETTER P P 80
81, //81 LATIN CAPITAL LETTER Q Q 81
82, //82 LATIN CAPITAL LETTER R R 82
83, //83 LATIN CAPITAL LETTER S S 83
84, //84 LATIN CAPITAL LETTER T T 84
85, //85 LATIN CAPITAL LETTER U U 85
86, //86 LATIN CAPITAL LETTER V V 86
87, //87 LATIN CAPITAL LETTER W W 87
88, //88 LATIN CAPITAL LETTER X X 88
89, //89 LATIN CAPITAL LETTER Y Y 89
90, //90 LATIN CAPITAL LETTER Z Z 90
91, //91 LATIN CAPITAL LETTER A WITH DIAERESIS ? 196
92, //92 LATIN CAPITAL LETTER O WITH DIAERESIS ? 214
93, //93 LATIN CAPITAL LETTER N WITH TILDE ? 209
94, //94 LATIN CAPITAL LETTER U WITH DIAERESIS ¨¹ 220
95, //95 SECTION SIGN ¡ì 167
96, //96 INVERTED QUESTION MARK ? 191
97, //97 LATIN SMALL LETTER A a 97
98, //98 LATIN SMALL LETTER B b 98
99, //99 LATIN SMALL LETTER C c 99
100, //100 LATIN SMALL LETTER D d 100
101, //101 LATIN SMALL LETTER E e 101
102, //102 LATIN SMALL LETTER F f 102
103, //103 LATIN SMALL LETTER G g 103
104, //104 LATIN SMALL LETTER H h 104
105, //105 LATIN SMALL LETTER I i 105
106, //106 LATIN SMALL LETTER J j 106
107, //107 LATIN SMALL LETTER K k 107
108, //108 LATIN SMALL LETTER L l 108
109, //109 LATIN SMALL LETTER M m 109
110, //110 LATIN SMALL LETTER N n 110
111, //111 LATIN SMALL LETTER O o 111
112, //112 LATIN SMALL LETTER P p 112
113, //113 LATIN SMALL LETTER Q q 113
114, //114 LATIN SMALL LETTER R r 114
115, //115 LATIN SMALL LETTER S s 115
116, //116 LATIN SMALL LETTER T t 116
117, //117 LATIN SMALL LETTER U u 117
118, //118 LATIN SMALL LETTER V v 118
119, //119 LATIN SMALL LETTER W w 119
120, //120 LATIN SMALL LETTER X x 120
121, //121 LATIN SMALL LETTER Y y 121
122, //122 LATIN SMALL LETTER Z z 122
123, //123 LATIN SMALL LETTER A WITH DIAERESIS ? 228
124, //124 LATIN SMALL LETTER O WITH DIAERESIS ? 246
125, //125 LATIN SMALL LETTER N WITH TILDE ? 241
126, //126 LATIN SMALL LETTER U WITH DIAERESIS ¨¹ 252
127, //127 LATIN SMALL LETTER A WITH GRAVE ¨¤ 224
};
//template< class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap : public CObject
typedef CMap CMapWCharToUChar;
static CMapWCharToUChar gMap_WCharTo7BitAlphabet;
/*
EXTENSION TABLE
0x1B0A 27 10 FORM FEED 12
0x1B14 27 20 CIRCUMFLEX ACCENT ^ 94
0x1B28 27 40 LEFT CURLY BRACKET { 123
0x1B29 27 41 RIGHT CURLY BRACKET } 125
0x1B2F 27 47 REVERSE SOLIDUS (BACKSLASH) \ 92
0x1B3C 27 60 LEFT SQUARE BRACKET [ 91
0x1B3D 27 61 TILDE ~ 126
0x1B3E 27 62 RIGHT SQUARE BRACKET ] 93
0x1B40 27 64 VERTICAL BAR | 124
0x1B65 27 101 EURO SIGN € 164 (ISO
*/
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//Helper::Helper()
//{
//}
//Helper::~Helper()
//{
//}
UCHAR Helper::WCharTo7BitAlphabet(WCHAR w)
{
if(gMap_WCharTo7BitAlphabet.IsEmpty())
{
for(int i=0; i<128; i++)
gMap_WCharTo7BitAlphabet[gTable_AlphabetToUnicode[i]] = i;
}
return gMap_WCharTo7BitAlphabet[w];
}
LPSTR Helper::BinToHex(LPBYTE p, int len)
{
LPSTR str = (LPSTR)malloc(len*3+1);
LPSTR basestr = str;
for(int i=0; i>1);
LPBYTE basepByte = pByte;
int i=0;
BYTE b;
while(*s)
{
if(*s <= '9' && *s >= '0')
{
b = *s++ - '0';
*pByte = (*pByte << 4) | (b & 0xf);
i++;
}else if(*s <= 'f' && *s >= 'a'){
b = *s++ - 'a' + 10 ;
*pByte = (*pByte << 4) | (b & 0xf);
i++;
}else if(*s <= 'F' && *s >= 'A'){
b = *s++ - 'A' + 10;
*pByte = (*pByte << 4) | (b & 0xf);
i++;
}else
*s++;
if(i==2)
{
pByte++;
i = 0;
}
}
if(i)
pByte++;
len = pByte - basepByte;
if(len)
return basepByte;
else{
free(basepByte);
return NULL;
}
}
CString Helper::BcdToAscii(LPBYTE p, int len)
{
CString cstr;
LPSTR str = (LPSTR)_alloca(len*2+1);
LPSTR basestr = str;
for(int i=0; i '0' && ch < '9')
ch -= '0';
else if(ch == '*')
ch = 10;
else if(ch == '#')
ch = 11;
return ch;
}
CString Helper::Gsm11SCTStoCStr(LPBYTE p, int len)
{
//e.g 50 70 90 71 81 12 23 to 05-07-09 17:18:12
CString cstr;
LPSTR str = (LPSTR)_alloca(32);
LPSTR basestr = str;
BCDTOASCII(*p, str);
p++;
*str++ = '-';
BCDTOASCII(*p, str);
p++;
*str++ = '-';
BCDTOASCII(*p, str);
p++;
*str++ = ' ';
BCDTOASCII(*p, str);
p++;
*str++ = ':';
BCDTOASCII(*p, str);
p++;
*str++ = ':';
BCDTOASCII(*p, str);
*str = '\0';
cstr = basestr;
return cstr;
}
int Helper::CStrToGsm11SCTS(CString Date,LPBYTE pResult, int len)
{
UCHAR chL,chH;
int ret;
int a,b,c,d,e,f;
ret = sscanf(Date,"%d-%d-%d %d:%d:%d",&a,&b,&c,&d,&e,&f);
if(ret != 6)
{
CTime time(CTime::GetCurrentTime());
Date = time.Format(_T("%y-%m-%d %H:%M:%S"));
TRACE("Current Time %s\n",Date);
}
for(int i=0; i strlen) || ((dst-pRecData) >= len) )
break;
shift_n = (i&7);
next7bit = *src++;
tmp = next7bit<<(8-shift_n);
shift_buf |= tmp;
*dst++ = shift_buf;
i++;
if(shift_n == 7)
{
shift_buf = *src++;
i++;
}else
shift_buf = (next7bit >> shift_n);
}while(1);
str.UnlockBuffer();
return (dst - pRecData);
}
CString Helper::Gsm11Enc7bitToCStr(LPBYTE pData,int len)
{
char *str = (char *)_alloca(len*8/7 + 1);
char *base_str = str;
ULONG shift_buf;
int remanent_bits,consume_len;
shift_buf = *pData++;
remanent_bits = 8;
consume_len = 1;
do{
*str++ = (char)(shift_buf & 0x7f);
shift_buf >>= 7;
remanent_bits -= 7;
if(remanent_bits < 7)
{
if(consume_len >= len)
break;
shift_buf |= (*pData++ << remanent_bits);
remanent_bits += 8;
consume_len++;
}
}while(TRUE);
*str = 0;
int str_len = str-base_str;
WCHAR *wstr = (WCHAR *)_alloca(sizeof(WCHAR)*str_len+1);
for(int i=0; i 0)
{
LPWSTR uniName = T2W(name);
int ulen = lstrlenW(uniName);
pRecData[0] = 0x80;//unicode flag
for(i=1; i<(int)(ulen*sizeof(WCHAR)+1) && i>8;
pRecData[i+1] = *uniName&0xff;
uniName++;
ret += 2;
}
}
for(; i '9') || (c < '0') )
return true;
}
return false;
}
int Helper::CStrToCalledPartyBcd(CString phone,LPBYTE pRecData,int len)
{
int i=0;
int j=0;
int bcd_len;
if(phone.GetLength())
{
if(phone.Find(_T("+")) == 0)
{
bcd_len = phone.GetLength()/2;
*pRecData++ = bcd_len+1;
*pRecData++ = 0x91;
i = 1;
}else if(strContaionNotNumber(phone))
{//for Alphanumeric Address type
//The maximum length of the full address field (Address-Length, Type-of-Address and Address-Value) is 12 octets.
int len = CStrToGsm11Enc7bit(phone, pRecData+2,10);
/*The Address-Length field is an integer representation of the number of useful semi-octets within the Address-Value field,
i.e. excludes any semi octet containing only fill bits.
04.08 page 35
*/
*pRecData++ = len*2; //
*pRecData++ = 0xd0; //Alphanumeric
return len+2;
}else{
bcd_len = (phone.GetLength()+1)/2;
*pRecData++ = bcd_len+1;
*pRecData++ = 0x81;
i = 0;
}
j = 2;
int max_len;
if(len == -1)
{
len = bcd_len + 2;
max_len = len;
}else
max_len = len - 2;
for(; i CMapCStringToUChar;
static CMapCStringToUChar gMap_SmsStatusToUChar;
static LPCTSTR SmsStatus[] = {
(LPCSTR)IDS_STRING_FREE,
(LPCSTR)IDS_STRING_READ,
(LPCSTR)IDS_STRING_DONT_KNOW,
(LPCSTR)IDS_STRING_TO_BE_READ,
(LPCSTR)IDS_STRING_DONT_KNOW,
(LPCSTR)IDS_STRING_SENT,
(LPCSTR)IDS_STRING_DONT_KNOW,
(LPCSTR)IDS_STRING_TO_BE_SEND
};
CString Helper::UCharToSmsStatus(UCHAR s)
{
return SmsStatus[s&0x7];
}
BOOL Helper::SmsStatusToUChar(LPCTSTR Status, UCHAR &rValue)
{
if(gMap_SmsStatusToUChar.IsEmpty())
{
for(int i=0; iGetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(pWnd->GetSafeHwnd(),GWL_EXSTYLE)|0x80000/*WS_EX_LAYERED*/);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//È¡µÃSetLayeredWindowAttributesº¯ÊýÖ¸Õë
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(pWnd->GetSafeHwnd(),0,(255 * percent)/100,2/*LWA_ALPHA*/);
FreeLibrary(hInst);
}
}