www.pudn.com > DmyNP_source.rar > Share.c, change:2004-12-12,size:7545b


/*--> 
Damayi Net-Phone, 2004/11 (damayi.org) 
<--*/ 
 
#include "src\winmain.h" 
 
//弹出错误提示对话框 
void PromptError(LPCTSTR lpStr) 
{ 
   MessageBox(0, lpStr, "DmyNP", MB_OK|MB_ICONERROR); 
   return; 
} 
 
#pragma pack(1) 
typedef struct 
{ 
   unsigned int bitC6:5; 
   unsigned int bitC5:5; 
   unsigned int bitC4:5; 
   unsigned int bitC3:5; 
   unsigned int bitC2:5; 
   unsigned int bitC1:5; 
   unsigned int bitRT:2; 
}PIDBIT; 
#pragma pack() 
 
static char const * const gpcsPIASC = "*kug.cn+qwertyiopasd@fhjl-zxv_bm"; 
static char const * const gpcsPIRT  = "?&$#"; 
 
//将PID转换为字串 
//参数: dwID  32bit整数PID 
//      pcs   接收字串的缓冲区地址 
//返回: 成功返回TRUE, 失败返回FALSE。 
//备注: pcs指向的缓冲区至少为7个字节, 返回的字串不以NULL结尾。 
BOOL ItoC(DWORD dwID, char *pcs) 
{ 
   PIDBIT idbt; 
   if(!dwID || !pcs) return FALSE; 
   idbt = *((PIDBIT*)&dwID); 
   pcs[0] = gpcsPIRT[idbt.bitRT]; 
   pcs[1] = gpcsPIASC[idbt.bitC1]; 
   pcs[2] = gpcsPIASC[idbt.bitC2]; 
   pcs[3] = gpcsPIASC[idbt.bitC3]; 
   pcs[4] = gpcsPIASC[idbt.bitC4]; 
   pcs[5] = gpcsPIASC[idbt.bitC5]; 
   pcs[6] = gpcsPIASC[idbt.bitC6]; 
   return TRUE; 
} 
 
//将字串转换为PID 
//参数: pcs  字串地址 
//返回: 成功返回32bit整数PID值, 失败返回0。 
//备注: pcs指向7个字节长的字串, 字串不必以NULL结尾。 
DWORD CtoI(char const *pcs) 
{ 
   PIDBIT idbt = {0}; 
   int i; 
   if(!pcs) return 0; 
   for(i=0; i<4; i++) if(pcs[0]==gpcsPIRT[i]) { idbt.bitRT=i; break; } 
   if(i==4) return 0; 
   for(i=0; i<32; i++) if(pcs[1]==gpcsPIASC[i]){ idbt.bitC1=i; break; } 
   if(i==32) return 0; 
   for(i=0; i<32; i++) if(pcs[2]==gpcsPIASC[i]){ idbt.bitC2=i; break; } 
   if(i==32) return 0; 
   for(i=0; i<32; i++) if(pcs[3]==gpcsPIASC[i]){ idbt.bitC3=i; break; } 
   if(i==32) return 0; 
   for(i=0; i<32; i++) if(pcs[4]==gpcsPIASC[i]){ idbt.bitC4=i; break; } 
   if(i==32) return 0; 
   for(i=0; i<32; i++) if(pcs[5]==gpcsPIASC[i]){ idbt.bitC5=i; break; } 
   if(i==32) return 0; 
   for(i=0; i<32; i++) if(pcs[6]==gpcsPIASC[i]){ idbt.bitC6=i; break; } 
   if(i==32) return 0; 
   return *((DWORD*)&idbt); 
} 
 
//将字符串转换为地址结构 
//参数: pst  接收数据的STCALL结构地址 
//      pcs  以NULL结尾的字符串的地址 
//返回: 成功返回字符串类型, 失败返回0。 
//      1=PID字符串, 2=IP地址字符串, 3=IP+Port字符串, 4=IP+Port+UVD字符串。 
//备注: 该函数执行时修改pcs指向的字符串的内容, 函数返回后字符串内容不确定。 
int CtoST(STCALL *pst, char *pcs) 
{ 
   int  iStrLen, i; 
   BYTE byc; 
   char *pcPort = NULL; 
   char *pcUVD = NULL; 
 
   if(!pst || !pcs) return 0; 
   iStrLen = lstrlen(pcs); 
   if(iStrLen<7) return 0; 
   pst->IP = 0; 
   pst->Port = 0; 
   pst->UVD = 0; 
 
   //转换PID字符串 
   if(iStrLen==7) 
   { 
      pst->IP = CtoI(pcs); 
      if(pst->IP!=0) return 1; 
   } 
 
   //检查非法字符 
   for(i=0; i<iStrLen; i++) 
   { 
      byc = pcs[i]; 
      if(!(byc=='.'||(byc>='0'&&byc<='9')||byc==':'||byc=='-')) return 0; 
      if(byc==':') 
      { 
         if(pcPort!=NULL) return 0; 
         pcs[i] = 0; 
         pcPort = &pcs[i+1]; 
      } 
      if(byc=='-') 
      { 
         if(pcUVD!=NULL) return 0; 
         pcs[i] = 0; 
         pcUVD = &pcs[i+1]; 
      } 
   } 
   if(pcUVD!=NULL && pcPort>pcUVD) return 0; 
   if(pcUVD!=NULL && pcPort==NULL) return 0; 
   if(pcUVD!=NULL && *pcUVD==0) return 0; 
 
   //转换IP地址 
   pst->IP = inet_addr(pcs); 
   if(pst->IP==0 || pst->IP==INADDR_NONE) return 0; 
   if(pcPort==NULL) return 2; 
 
   //转换PORT端口 
   i = atoi(pcPort); 
   if((int)i!=(int)((WORD)i)) return 0; 
   pst->Port = htons((u_short)i); 
   if(pst->Port==0) return 0; 
   if(pcUVD==NULL) return 3; 
 
   //转换UVD验证码 
   i = atoi(pcUVD); 
   if((int)i!=(int)((WORD)i)) return 0; 
   pst->UVD = (WORD)i; 
   return 4; 
} 
 
//获取INI文件的完整路径和文件名 
//参数: pcName  接收返回文件名字符串的缓冲区地址 
//      dwSize  缓冲区大小 
//返回: 成功返回复制到缓冲区的字符个数, 失败返回零。 
//备注: 缓冲区大小应该不小于MAX_PATH宏定义的字节数。 
DWORD GetIniFileName(char *pcName, DWORD dwSize) 
{ 
   DWORD dwRst; 
   if(!pcName || !dwSize) return 0; 
   dwRst = GetModuleFileName(0, pcName, dwSize); 
   if(dwRst<5) return 0; 
   if(pcName[dwRst-4]!='.') return 0; 
   if(pcName[dwRst-3]!='e' && pcName[dwRst-3]!='E') return 0; 
   if(pcName[dwRst-2]!='x' && pcName[dwRst-2]!='X') return 0; 
   if(pcName[dwRst-1]!='e' && pcName[dwRst-1]!='E') return 0; 
   pcName[dwRst-3] = 'i'; 
   pcName[dwRst-2] = 'n'; 
   pcName[dwRst-1] = 'i'; 
   return dwRst; 
} 
 
//初始化INIVAR结构变量 
//参数: INIVAR变量地址 
void SetDefaultInivar(INIVAR *pst) 
{ 
   char sUserName[UNLEN+1] = {0}; 
   DWORD dwSize; 
   if(!pst) return; 
   ZeroMemory(pst, sizeof(INIVAR)); 
   pst->dwPID = (GetTickCount()>>2)|0xB5AD6B40; 
   pst->wPort = 5002; 
   pst->dwKeTime = 30000; 
   pst->dwSerAr = DSER_AR; 
   pst->stOptT.VIn = 3; 
   pst->stOptT.NorIn = 1; 
   pst->stOptT.CompMode = 1; 
   pst->dwDefMT = 1; 
   pst->optDelay = 1; 
   pst->bRing = TRUE; 
   pst->bLowPRI = TRUE; 
   pst->bLostAW = TRUE; 
   pst->bTrayIco = TRUE; 
   pst->wAutoREV = AUTOREV; 
   pst->stUD.in.type = UD_TYPE; 
   pst->stUD.in.identify = UD_IDENT; 
   pst->stUD.in.ver = VER_HEX; 
   lstrcpyn(pst->stUD.in.soft, "大蚂蚁网络电话", sizeof(pst->stUD.in.soft)); 
   dwSize = sizeof(sUserName); 
   GetUserName(sUserName, &dwSize); 
   lstrcpyn(pst->stUD.in.name, sUserName, sizeof(pst->stUD.in.name)); 
   lstrcpyn(pst->stUD.note, strDEFNOTE, sizeof(pst->stUD.note)); 
   return; 
} 
 
//读取INI文件数据 
//参数: 接收数据的INIVAR结构变量地址 
//返回: 成功返回TRUE, 失败返回FALSE。 
BOOL ReadIniFile(INIVAR *pst) 
{ 
   char sName[MAX_PATH]; 
   DWORD dwVar; 
   BOOL bRst; 
   HANDLE hFile; 
   if(!pst) return FALSE; 
   if(!GetIniFileName(sName,sizeof(sName))) return FALSE; 
   hFile = CreateFile(sName, GENERIC_READ, FILE_SHARE_READ, 
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
   if(hFile==INVALID_HANDLE_VALUE) return FALSE; 
   bRst = ReadFile(hFile, pst, sizeof(INIVAR), &dwVar, NULL); 
   if(!bRst || dwVar!=sizeof(INIVAR)) SetDefaultInivar(pst); 
   CloseHandle(hFile); 
   return TRUE; 
} 
 
//写入INI文件数据 
//参数: 写入数据的INIVAR结构变量地址 
//返回: 成功返回TRUE, 失败返回FALSE。 
BOOL WriteIniFile(INIVAR const *pst) 
{ 
   char sName[MAX_PATH]; 
   DWORD dwVar; 
   BOOL bRst; 
   HANDLE hFile; 
   if(!pst) return FALSE; 
   if(!GetIniFileName(sName,sizeof(sName))) return FALSE; 
   hFile = CreateFile(sName, GENERIC_WRITE, 0, NULL, 
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
   if(hFile==INVALID_HANDLE_VALUE) return FALSE; 
   bRst = WriteFile(hFile, pst, sizeof(INIVAR), &dwVar, NULL); 
   CloseHandle(hFile); 
   return bRst; 
} 
 
//播放声音 
//参数: vp  波形数据地址(NULL:停止播放) 
//      bl  是否循环播放(TRUE:循环播放) 
//      bs  中断正在播放的声音(TRUE:是) 
//返回: 成功返回TRUE, 失败返回FALSE。 
BOOL PlayWave(void const * const vp, BOOL bl, BOOL bs) 
{ 
   BOOL bRst = FALSE; 
   UINT ufdw = SND_MEMORY|SND_NOWAIT|SND_NODEFAULT|SND_ASYNC; 
   if(bs) bRst = PlaySound(NULL, NULL, NULL); 
   if(vp==NULL) return bRst; 
   ufdw = ufdw|(bl?SND_LOOP:0)|(bs?0:SND_NOSTOP); 
   bRst = PlaySound(vp, NULL, ufdw); 
   return bRst; 
} 
 
//计算时间差 
//参数: pst  接收结果的DITIME结构变量地址 
//      dwT  启始时间(TICK) 
void DiffTime(DITIME *pst, DWORD dwT) 
{ 
   DWORD dwVar; 
   if(pst==NULL) return; 
   dwVar = (DWORD)(GetTickCount()-dwT) / 1000; 
   pst->dwHour = dwVar / 3600; 
   dwVar = dwVar % 3600; 
   pst->dwMin = dwVar / 60; 
   pst->dwSec = dwVar % 60; 
   return; 
}