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);  
		}  
}