diff options
Diffstat (limited to 'plugins/!NotAdopted/SMS/functions.cpp')
-rw-r--r-- | plugins/!NotAdopted/SMS/functions.cpp | 761 |
1 files changed, 761 insertions, 0 deletions
diff --git a/plugins/!NotAdopted/SMS/functions.cpp b/plugins/!NotAdopted/SMS/functions.cpp new file mode 100644 index 0000000000..aebafa42d8 --- /dev/null +++ b/plugins/!NotAdopted/SMS/functions.cpp @@ -0,0 +1,761 @@ +#include "main.h"
+
+
+
+
+
+BOOL DB_GetStaticStringW(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpwszRetBuff,SIZE_T dwRetBuffSize,SIZE_T *pdwRetBuffSize)
+{// sizes in wchars
+ BOOL bRet=FALSE;
+ SIZE_T dwReadedStringLen;
+ DBVARIANT dbv={0};
+ DBCONTACTGETSETTING sVal={0};
+
+ dbv.type=DBVT_WCHAR;
+ sVal.pValue=&dbv;
+ sVal.szModule=lpszModule;
+ sVal.szSetting=lpszValueName;
+ if (CallService(MS_DB_CONTACT_GETSETTING_STR,(WPARAM)hContact,(LPARAM)&sVal)==0)
+ {
+ dwReadedStringLen=lstrlenW(dbv.pwszVal);
+ if (lpwszRetBuff && (dwRetBuffSize>dwReadedStringLen))
+ {
+ CopyMemory(lpwszRetBuff,dbv.pszVal,(dwReadedStringLen*sizeof(WCHAR)));//include null terminated
+ (*((WCHAR*)(lpwszRetBuff+dwReadedStringLen)))=0;
+ bRet=TRUE;
+ }else{
+ if (lpwszRetBuff && dwRetBuffSize>=sizeof(WCHAR)) (*((WCHAR*)lpwszRetBuff))=0;
+ }
+ if (pdwRetBuffSize) (*pdwRetBuffSize)=dwReadedStringLen;
+
+ DBFreeVariant(&dbv);
+ }else{
+ if (lpwszRetBuff && dwRetBuffSize>=sizeof(WCHAR)) (*((WCHAR*)lpwszRetBuff))=0;
+ if (pdwRetBuffSize) (*pdwRetBuffSize)=0;
+ }
+return(bRet);
+}
+
+
+BOOL DB_SetStringExW(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpwszValue,SIZE_T dwValueSize)
+{
+ BOOL bRet=FALSE;
+
+ if (lpwszValue && dwValueSize)
+ {
+ LPWSTR lpwszValueLocal=(LPWSTR)MEMALLOC(((dwValueSize+MAX_PATH)*sizeof(WCHAR)));
+
+ if (lpwszValueLocal)
+ {
+ DBCONTACTWRITESETTING cws={0};
+
+ cws.szModule=lpszModule;
+ cws.szSetting=lpszValueName;
+ cws.value.type=DBVT_WCHAR;
+ cws.value.pwszVal=(WCHAR*)lpwszValueLocal;
+ CopyMemory(lpwszValueLocal,lpwszValue,(dwValueSize*sizeof(WCHAR)));
+ bRet=(CallService(MS_DB_CONTACT_WRITESETTING,(WPARAM)hContact,(LPARAM)&cws)==0);
+
+ MEMFREE(lpwszValueLocal);
+ }
+ }else{
+ bRet=TRUE;
+ DBDeleteContactSetting(hContact,lpszModule,lpszValueName);
+ }
+return(bRet);
+}
+
+
+LPSTR GetModuleName(HANDLE hContact)
+{
+ LPSTR lpszRet;
+
+ if (hContact)
+ {
+ lpszRet=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if (lpszRet==NULL) lpszRet=PROTOCOL_NAMEA;
+ }else{
+ lpszRet=PROTOCOL_NAMEA;
+ }
+return(lpszRet);
+}
+
+
+void EnableControlsArray(HWND hWndDlg,WORD *pwControlsList,SIZE_T dwControlsListCount,BOOL bEnabled)
+{
+ for(SIZE_T i=0;i<dwControlsListCount;i++) EnableWindow(GetDlgItem(hWndDlg,pwControlsList[i]),bEnabled);
+}
+
+
+void CListShowMenuItem(HANDLE hMenuItem,BOOL bShow)
+{
+ CLISTMENUITEM mi={0};
+
+ mi.cbSize=sizeof(mi);
+ mi.flags=CMIM_FLAGS;
+ if (bShow==FALSE) mi.flags|=CMIF_HIDDEN;
+
+ CallService(MS_CLIST_MODIFYMENUITEM,(WPARAM)hMenuItem,(LPARAM)&mi);
+}
+
+
+//This function gets a Cellular string szPhone and clean it from symbools.
+SIZE_T CopyNumberA(LPSTR lpszOutBuff,LPSTR lpszBuff,SIZE_T dwLen)
+{
+ BYTE btChar;
+ LPBYTE lpbOutBuff=(LPBYTE)lpszOutBuff,lpbInBuff=(LPBYTE)lpszBuff;
+
+ for(SIZE_T i=0;i<dwLen;i++)
+ {
+ btChar=(*lpbInBuff++);
+ if (btChar>='0' && btChar<='9') (*lpbOutBuff++)=btChar;
+ }
+ (*lpbOutBuff)=0;
+
+return((lpbOutBuff-(LPBYTE)lpszOutBuff));
+}
+
+SIZE_T CopyNumberW(LPWSTR lpcOutBuff,LPWSTR lpcBuff,SIZE_T dwLen)
+{
+ WCHAR wChar;
+ LPWSTR lpwszOutBuff=lpcOutBuff,lpwszInBuff=lpcBuff;
+
+ for(SIZE_T i=0;i<dwLen;i++)
+ {
+ wChar=(*lpwszInBuff++);
+ if (wChar>='0' && wChar<='9') (*lpwszOutBuff++)=wChar;
+ }
+ (*lpwszOutBuff)=0;
+
+return((lpwszOutBuff-lpcOutBuff));
+}
+
+
+BOOL IsPhoneW(LPWSTR lpwszString,SIZE_T dwStringLen)
+{
+ BOOL bRet;
+
+ if (dwStringLen>1)
+ {// country code
+ WCHAR wChar;
+
+ bRet=TRUE;
+ for(SIZE_T i=0;i<dwStringLen;i++)
+ {
+ wChar=(*lpwszString++);
+ if (wChar<'0' || wChar>'9')
+ if (wChar!='+' && wChar!='S' && wChar!='M' && wChar!=' ' && wChar!='(' && wChar!=')')
+ {
+ bRet=FALSE;
+ break;
+ }
+ }
+ }else{
+ bRet=FALSE;
+ }
+return(bRet);
+}
+
+
+
+DWORD GetContactPhonesCountParam(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName)
+{
+ DWORD dwRet=0;
+ char szBuff[MAX_PATH];
+ WCHAR wszPhone[MAX_PHONE_LEN];
+ SIZE_T i,dwPhoneSize;
+
+ if (DB_GetStaticStringW(hContact,lpszModule,lpszValueName,wszPhone,SIZEOF(wszPhone),&dwPhoneSize))
+ {
+ if (IsPhoneW(wszPhone,dwPhoneSize)) dwRet++;
+ }
+
+ for (i=0;TRUE;i++)
+ {
+ mir_snprintf(szBuff,sizeof(szBuff),"%s%ld",lpszValueName,i);
+ if (DB_GetStaticStringW(hContact,lpszModule,szBuff,wszPhone,SIZEOF(wszPhone),&dwPhoneSize))
+ {
+ if (IsPhoneW(wszPhone,dwPhoneSize)) dwRet++;
+ }else{
+ if (i>PHONES_MIN_COUNT) break;
+ }
+ }
+return(dwRet);
+}
+
+
+DWORD GetContactPhonesCount(HANDLE hContact)
+{
+ DWORD dwRet=0;
+ LPSTR lpszProto;
+
+ lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if (lpszProto)
+ {
+ dwRet+=GetContactPhonesCountParam(hContact,lpszProto,"Phone");
+ dwRet+=GetContactPhonesCountParam(hContact,lpszProto,"Cellular");
+ dwRet+=GetContactPhonesCountParam(hContact,lpszProto,"Fax");
+ }
+ dwRet+=GetContactPhonesCountParam(hContact,"UserInfo","MyPhone");
+ dwRet+=GetContactPhonesCountParam(hContact,"UserInfo","Phone");
+ dwRet+=GetContactPhonesCountParam(hContact,"UserInfo","Cellular");
+ dwRet+=GetContactPhonesCountParam(hContact,"UserInfo","Fax");
+
+return(dwRet);
+}
+
+
+BOOL IsContactPhoneParam(HANDLE hContact,LPSTR lpszModule,LPSTR lpszValueName,LPWSTR lpwszPhone,SIZE_T dwPhoneSize)
+{
+ BOOL bRet=FALSE;
+ char szBuff[MAX_PATH];
+ WCHAR wszPhoneLocal[MAX_PHONE_LEN];
+ SIZE_T i,dwPhoneSizeLocal;
+
+ if (DB_GetStaticStringW(hContact,lpszModule,lpszValueName,wszPhoneLocal,SIZEOF(wszPhoneLocal),&dwPhoneSizeLocal))
+ if (IsPhoneW(wszPhoneLocal,dwPhoneSizeLocal))
+ {
+ dwPhoneSizeLocal=CopyNumberW(wszPhoneLocal,wszPhoneLocal,dwPhoneSizeLocal);
+ if (MemoryCompare(wszPhoneLocal,dwPhoneSizeLocal,lpwszPhone,dwPhoneSize)==CSTR_EQUAL)
+ {
+ bRet=TRUE;
+ }
+ }
+
+ for (i=0;bRet==FALSE;i++)
+ {
+ mir_snprintf(szBuff,sizeof(szBuff),"%s%ld",lpszValueName,i);
+ if (DB_GetStaticStringW(hContact,lpszModule,szBuff,wszPhoneLocal,SIZEOF(wszPhoneLocal),&dwPhoneSizeLocal))
+ {
+ if (IsPhoneW(wszPhoneLocal,dwPhoneSizeLocal))
+ {
+ dwPhoneSizeLocal=CopyNumberW(wszPhoneLocal,wszPhoneLocal,dwPhoneSizeLocal);
+ if (MemoryCompare(wszPhoneLocal,dwPhoneSizeLocal,lpwszPhone,dwPhoneSize)==CSTR_EQUAL)
+ {
+ bRet=TRUE;
+ break;
+ }
+ }
+ }else{
+ if (i>PHONES_MIN_COUNT) break;
+ }
+ }
+return(bRet);
+}
+
+
+BOOL IsContactPhone(HANDLE hContact,LPWSTR lpwszPhone,SIZE_T dwPhoneSize)
+{
+ BOOL bRet=FALSE;
+ WCHAR wszPhoneLocal[MAX_PHONE_LEN];
+ LPSTR lpszProto;
+ SIZE_T dwPhoneSizeLocal;
+
+ dwPhoneSizeLocal=CopyNumberW(wszPhoneLocal,lpwszPhone,dwPhoneSize);
+ lpszProto=(LPSTR)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact,0);
+ if (lpszProto)
+ {
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,lpszProto,"Phone",wszPhoneLocal,dwPhoneSizeLocal);
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,lpszProto,"Cellular",wszPhoneLocal,dwPhoneSizeLocal);
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,lpszProto,"Fax",wszPhoneLocal,dwPhoneSizeLocal);
+ }
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","MyPhone",wszPhoneLocal,dwPhoneSizeLocal);
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","Phone",wszPhoneLocal,dwPhoneSizeLocal);
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","Cellular",wszPhoneLocal,dwPhoneSizeLocal);
+ if (bRet==FALSE) bRet=IsContactPhoneParam(hContact,"UserInfo","Fax",wszPhoneLocal,dwPhoneSizeLocal);
+
+return(bRet);
+}
+
+
+//This function get a string cellular number and return the HANDLE of the contact that has this
+//number in the miranda phonebook (and marked as an SMS able) at the User Details.
+//If no one has this number function returns NULL.
+HANDLE HContactFromPhone(LPWSTR lpwszPhone,SIZE_T dwPhoneSize)
+{
+ HANDLE hContact=NULL;
+
+ if (lpwszPhone && dwPhoneSize)
+ {
+ //check not already on list
+ for(hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDFIRST,0,0);hContact!=NULL;hContact=(HANDLE)CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM)hContact,0))
+ {
+ if (IsContactPhone(hContact,lpwszPhone,dwPhoneSize)) break;
+ }
+ }
+return(hContact);
+}
+
+
+BOOL GetDataFromMessage(LPSTR lpszMessage,SIZE_T dwMessageSize,DWORD *pdwEventType,LPWSTR lpwszPhone,SIZE_T dwPhoneSize,SIZE_T *pdwPhoneSizeRet,UINT *piIcon)
+{
+ BOOL bRet=FALSE;
+
+ DWORD dwEventTypeRet=0;
+ SIZE_T dwPhoneSizeRet=0;
+ UINT iIconRet=0;
+
+ if (lpszMessage && dwMessageSize)
+ {
+ LPSTR lpsz;
+
+ if (MemoryCompare(lpszMessage,10,"SMS From: ",10)==CSTR_EQUAL)
+ {
+ lpsz=(LPSTR)MemoryFind(10,lpszMessage,dwMessageSize,"\r\n",2);
+ if (lpsz)
+ {
+ if (lpwszPhone && dwPhoneSize)
+ {
+ dwPhoneSizeRet=MultiByteToWideChar(CP_UTF8,0,(lpszMessage+10),min((SIZE_T)(lpsz-(lpszMessage+10)),dwPhoneSize),lpwszPhone,dwPhoneSize);
+ dwPhoneSizeRet=CopyNumberW(lpwszPhone,lpwszPhone,dwPhoneSizeRet);
+ }
+ }
+ iIconRet=0;
+ dwEventTypeRet=ICQEVENTTYPE_SMS;
+ bRet=TRUE;
+ }else
+ if (MemoryCompare(lpszMessage,23,"SMS Confirmation From: ",23)==CSTR_EQUAL)
+ {
+ lpsz=(LPSTR)MemoryFind(23,lpszMessage,dwMessageSize,"\r\n",2);
+ if (lpsz)
+ {
+ if (lpwszPhone && dwPhoneSize)
+ {
+ dwPhoneSizeRet=MultiByteToWideChar(CP_UTF8,0,(lpszMessage+23),min((SIZE_T)(lpsz-(lpszMessage+23)),dwPhoneSize),lpwszPhone,dwPhoneSize);
+ dwPhoneSizeRet=CopyNumberW(lpwszPhone,lpwszPhone,dwPhoneSizeRet);
+ }
+
+ lpsz+=2;
+ if (MemoryCompare(lpsz,24,"SMS was sent succesfully",24)==CSTR_EQUAL)
+ {
+ iIconRet=IDI_SMSSENT;
+ }else{
+ iIconRet=IDI_SMSNOTSENT;
+ }
+ }
+ dwEventTypeRet=ICQEVENTTYPE_SMSCONFIRMATION;
+ bRet=TRUE;
+ }
+ }
+
+ if (pdwPhoneSizeRet) (*pdwPhoneSizeRet)=dwPhoneSizeRet;
+ if (pdwEventType) (*pdwEventType)=dwEventTypeRet;
+ if (piIcon) (*piIcon)=iIconRet;
+
+return(bRet);
+}
+
+BOOL GetXMLFieldEx(LPSTR lpszXML,SIZE_T dwXMLSize,LPSTR *plpszData,SIZE_T *pdwDataSize,const char *tag1,...)
+{
+ BOOL bRet=FALSE;
+ int thisLevel=0;
+ LPSTR lpszFindTag=(LPSTR)tag1,lpszTagStart,lpszTagEnd=lpszXML,lpszDataStart=NULL;
+ va_list va;
+
+ va_start(va,tag1);
+ while(TRUE)
+ {
+ lpszTagStart=(LPSTR)MemoryFindByte((lpszTagEnd-lpszXML),lpszXML,dwXMLSize,'<');
+ if (lpszTagStart)
+ {
+ lpszTagEnd=(LPSTR)MemoryFindByte((lpszTagStart-lpszXML),lpszXML,dwXMLSize,'>');
+ if (lpszTagEnd)
+ {
+ lpszTagStart++;
+ lpszTagEnd--;
+ if ((*((BYTE*)lpszTagStart))=='/')
+ {
+ if (--thisLevel<0)
+ {
+ if (lpszDataStart)
+ {
+ if (plpszData) (*plpszData)=lpszDataStart;
+ if (pdwDataSize) (*pdwDataSize)=((lpszTagStart-1)-lpszDataStart);
+ bRet=TRUE;
+ }
+ break;
+ }
+ }else{
+ if (++thisLevel==1)
+ if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpszFindTag,-1,lpszTagStart,((lpszTagEnd+1)-lpszTagStart))==CSTR_EQUAL)
+ {
+ lpszFindTag=va_arg(va,LPSTR);
+ if (lpszFindTag==NULL) lpszDataStart=(lpszTagEnd+2);
+ thisLevel=0;
+ }
+ }
+ }else{
+ break;
+ }
+ }else{
+ break;
+ }
+ }
+ va_end(va);
+return(bRet);
+}
+
+
+BOOL GetXMLFieldExBuff(LPSTR lpszXML,SIZE_T dwXMLSize,LPSTR lpszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSizeRet,const char *tag1,...)
+{
+ BOOL bRet=FALSE;
+ int thisLevel=0;
+ LPSTR lpszFindTag=(LPSTR)tag1,lpszTagStart,lpszTagEnd=lpszXML,lpszDataStart=NULL;
+ va_list va;
+
+
+ va_start(va,tag1);
+ while(TRUE)
+ {
+ lpszTagStart=(LPSTR)MemoryFindByte((lpszTagEnd-lpszXML),lpszXML,dwXMLSize,'<');
+ if (lpszTagStart)
+ {
+ lpszTagEnd=(LPSTR)MemoryFindByte((lpszTagStart-lpszXML),lpszXML,dwXMLSize,'>');
+ if (lpszTagEnd)
+ {
+ lpszTagStart++;
+ lpszTagEnd--;
+ if ((*((BYTE*)lpszTagStart))=='/')
+ {
+ if (--thisLevel<0)
+ {
+ if (lpszDataStart)
+ {
+ SIZE_T dwBuffSizeRet=min((dwBuffSize-2),(SIZE_T)((lpszTagStart-1)-lpszDataStart));
+ if (lpszBuff && dwBuffSize) CopyMemory(lpszBuff,lpszDataStart,dwBuffSizeRet);(*((WORD*)(lpszBuff+dwBuffSizeRet)))=0;
+ if (pdwBuffSizeRet) (*pdwBuffSizeRet)=dwBuffSizeRet;
+ bRet=TRUE;
+ }
+ break;
+ }
+ }else{
+ if (++thisLevel==1)
+ if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpszFindTag,-1,lpszTagStart,((lpszTagEnd+1)-lpszTagStart))==CSTR_EQUAL)
+ {
+ lpszFindTag=va_arg(va,LPSTR);
+ if (lpszFindTag==NULL) lpszDataStart=(lpszTagEnd+2);
+ thisLevel=0;
+ }
+ }
+ }else{
+ break;
+ }
+ }else{
+ break;
+ }
+ }
+ va_end(va);
+
+
+ if (bRet==FALSE)
+ {
+ if (lpszBuff) (*((WORD*)lpszBuff))=0;
+ if (pdwBuffSizeRet) (*pdwBuffSizeRet)=0;
+ }
+
+return(bRet);
+}
+
+
+/*BOOL GetXMLFieldExW(LPWSTR lpwszXML,SIZE_T dwXMLSize,LPWSTR *plpwszData,SIZE_T *pdwDataSize,const WCHAR *tag1,...)
+{
+ BOOL bRet=FALSE;
+ int thisLevel=0;
+ LPWSTR lpwszFindTag=(LPWSTR)tag1,lpwszTagStart,lpwszTagEnd=lpwszXML,lpwszDataStart=NULL;
+ va_list va;
+
+ va_start(va,tag1);
+ while(TRUE)
+ {
+ lpwszTagStart=(LPWSTR)MemoryFind((lpwszTagEnd-lpwszXML),lpwszXML,dwXMLSize,L"<",2);
+ if (lpwszTagStart)
+ {
+ lpwszTagEnd=(LPWSTR)MemoryFind((lpwszTagStart-lpwszXML),lpwszXML,dwXMLSize,L">",2);
+ if (lpwszTagEnd)
+ {
+ lpwszTagStart++;
+ lpwszTagEnd--;
+ if ((*((WORD*)lpwszTagStart))==(*((WORD*)"/")))
+ {
+ if (--thisLevel<0)
+ {
+ if (lpwszDataStart)
+ {
+ if (plpwszData) (*plpwszData)=lpwszDataStart;
+ if (pdwDataSize) (*pdwDataSize)=((lpwszTagStart-1)-lpwszDataStart);
+ bRet=TRUE;
+ }
+ break;
+ }
+ }else{
+ if (++thisLevel==1)
+ if (CompareStringW(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,lpwszFindTag,-1,lpwszTagStart,((lpwszTagEnd+1)-lpwszTagStart))==CSTR_EQUAL)
+ {
+ lpwszFindTag=va_arg(va,LPWSTR);
+ if (lpwszFindTag==NULL) lpwszDataStart=(lpwszTagEnd+2);
+ thisLevel=0;
+ }
+ }
+ }else{
+ break;
+ }
+ }else{
+ break;
+ }
+ }
+ va_end(va);
+return(bRet);
+}
+
+
+BOOL GetXMLFieldExBuffW(LPWSTR lpwszXML,SIZE_T dwXMLSize,LPWSTR lpwszBuff,SIZE_T dwBuffSize,SIZE_T *pdwBuffSizeRet,const WCHAR *tag1,...)
+{
+ BOOL bRet;
+ LPWSTR lpwszData;
+ SIZE_T dwDataSize;
+
+ if ((bRet=GetXMLFieldExW(lpwszXML,dwXMLSize,&lpwszData,&dwDataSize,tag1)))
+ {
+ SIZE_T dwBuffSizeRet=min((dwBuffSize-2),dwDataSize);
+
+ if (lpwszBuff && dwBuffSize) CopyMemory(lpwszBuff,lpwszData,dwBuffSizeRet);(*((WORD*)(lpwszBuff+dwBuffSizeRet)))=0;
+ if (pdwBuffSizeRet) (*pdwBuffSizeRet)=dwBuffSizeRet;
+ }else{
+ if (lpwszBuff) (*((WORD*)lpwszBuff))=0;
+ if (pdwBuffSizeRet) (*pdwBuffSizeRet)=0;
+ }
+
+return(bRet);
+}//*/
+
+
+DWORD ReplaceInBuff(LPVOID lpInBuff,SIZE_T dwInBuffSize,SIZE_T dwReplaceItemsCount,LPVOID *plpInReplaceItems,SIZE_T *pdwInReplaceItemsCounts,LPVOID *plpOutReplaceItems,SIZE_T *pdwOutReplaceItemsCounts,LPVOID lpOutBuff,SIZE_T dwOutBuffSize,SIZE_T *pdwOutBuffSize)
+{
+ DWORD dwRetErrorCode=NO_ERROR;
+ LPBYTE *plpszFounded,lpszMessageConvertedCur,lpszMessageCur,lpszMessageCurPrev,lpszMessageConvertedMax;
+ SIZE_T i,dwFirstFoundedIndex=0,dwFoundedCount=0,dwMemPartToCopy;
+
+#ifdef _DEBUG //check tables
+ for(i=0;i<dwReplaceItemsCount;i++)
+ {
+ if (lstrlen((LPTSTR)plpInReplaceItems[i])!=(pdwInReplaceItemsCounts[i]/sizeof(TCHAR))) DebugBreak();
+ if (lstrlen((LPTSTR)plpOutReplaceItems[i])!=(pdwOutReplaceItemsCounts[i]/sizeof(TCHAR))) DebugBreak();
+ }
+#endif
+
+ plpszFounded=(LPBYTE*)MEMALLOC((sizeof(LPBYTE)*dwReplaceItemsCount));
+
+ lpszMessageCurPrev=(LPBYTE)lpInBuff;
+ lpszMessageConvertedCur=(LPBYTE)lpOutBuff;
+ lpszMessageConvertedMax=(((LPBYTE)lpOutBuff)+dwOutBuffSize);
+ for(i=0;i<dwReplaceItemsCount;i++)
+ {// loking for in first time
+ plpszFounded[i]=(LPBYTE)MemoryFind((lpszMessageCurPrev-(LPBYTE)lpInBuff),lpInBuff,dwInBuffSize,plpInReplaceItems[i],pdwInReplaceItemsCounts[i]);
+ if (plpszFounded[i]) dwFoundedCount++;
+ }
+
+ while(dwFoundedCount)
+ {
+ for(i=0;i<dwReplaceItemsCount;i++)
+ {// looking for first to replace
+ if (plpszFounded[i] && (plpszFounded[i]<plpszFounded[dwFirstFoundedIndex] || plpszFounded[dwFirstFoundedIndex]==NULL)) dwFirstFoundedIndex=i;
+ }
+
+ if (plpszFounded[dwFirstFoundedIndex])
+ {// in founded
+ dwMemPartToCopy=(plpszFounded[dwFirstFoundedIndex]-lpszMessageCurPrev);
+ if (lpszMessageConvertedMax>(lpszMessageConvertedCur+(dwMemPartToCopy+pdwInReplaceItemsCounts[dwFirstFoundedIndex])))
+ {
+ CopyMemory(lpszMessageConvertedCur,lpszMessageCurPrev,dwMemPartToCopy);lpszMessageConvertedCur+=dwMemPartToCopy;
+ CopyMemory(lpszMessageConvertedCur,plpOutReplaceItems[dwFirstFoundedIndex],pdwOutReplaceItemsCounts[dwFirstFoundedIndex]);lpszMessageConvertedCur+=pdwOutReplaceItemsCounts[dwFirstFoundedIndex];
+ lpszMessageCurPrev=(plpszFounded[dwFirstFoundedIndex]+pdwInReplaceItemsCounts[dwFirstFoundedIndex]);
+
+ for(i=0;i<dwReplaceItemsCount;i++)
+ {// loking for in next time
+ if (plpszFounded[i] && plpszFounded[i]<lpszMessageCurPrev)
+ {
+ dwFoundedCount--;
+ plpszFounded[i]=(LPBYTE)MemoryFind((lpszMessageCurPrev-(LPBYTE)lpInBuff),lpInBuff,dwInBuffSize,plpInReplaceItems[i],pdwInReplaceItemsCounts[i]);
+ if (plpszFounded[i]) dwFoundedCount++;
+ }
+ }
+ }else{
+ dwRetErrorCode=ERROR_BUFFER_OVERFLOW;
+ DebugBreak();
+ break;
+ }
+ }else{// сюда по идее никогда не попадём, на всякий случай.
+ DebugBreak();
+ break;
+ }
+ }
+ lpszMessageCur=(((LPBYTE)lpInBuff)+dwInBuffSize);
+ CopyMemory(lpszMessageConvertedCur,lpszMessageCurPrev,(lpszMessageCur-lpszMessageCurPrev));lpszMessageConvertedCur+=(lpszMessageCur-lpszMessageCurPrev);
+ (*((WORD*)lpszMessageConvertedCur))=0;
+
+ MEMFREE(plpszFounded);
+
+ if (pdwOutBuffSize) (*pdwOutBuffSize)=(lpszMessageConvertedCur-((LPBYTE)lpOutBuff));
+
+return(dwRetErrorCode);
+}
+
+
+static const LPTSTR lpszXMLTags[] ={TEXT("'"), TEXT("""), TEXT("&"), TEXT("<"), TEXT(">")};
+static const SIZE_T dwXMLTagsCount[] ={(6*sizeof(TCHAR)), (6*sizeof(TCHAR)), (5*sizeof(TCHAR)), (4*sizeof(TCHAR)), (4*sizeof(TCHAR))};
+static const LPTSTR lpszXMLSymbols[] ={TEXT("\'"), TEXT("\""), TEXT("&"), TEXT("<"), TEXT(">")};
+static const SIZE_T dwXMLSymbolsCount[] ={sizeof(TCHAR), sizeof(TCHAR), sizeof(TCHAR), sizeof(TCHAR), sizeof(TCHAR)};
+
+//Decode XML coded string. The function translate special xml code into standard characters.
+DWORD DecodeXML(LPTSTR lptszMessage,SIZE_T dwMessageSize,LPTSTR lptszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize)
+{
+ DWORD dwRet=ReplaceInBuff(lptszMessage,(dwMessageSize*sizeof(TCHAR)),SIZEOF(lpszXMLTags),(LPVOID*)lpszXMLTags,(SIZE_T*)dwXMLTagsCount,(LPVOID*)lpszXMLSymbols,(SIZE_T*)dwXMLSymbolsCount,lptszMessageConverted,(dwMessageConvertedBuffSize*sizeof(TCHAR)),pdwMessageConvertedSize);
+
+ if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)/=sizeof(TCHAR);
+return(dwRet);
+}
+
+//Encode XML coded string. The function translate special saved xml characters into special characters.
+DWORD EncodeXML(LPTSTR lptszMessage,SIZE_T dwMessageSize,LPTSTR lptszMessageConverted,SIZE_T dwMessageConvertedBuffSize,SIZE_T *pdwMessageConvertedSize)
+{
+ DWORD dwRet=ReplaceInBuff(lptszMessage,(dwMessageSize*sizeof(TCHAR)),SIZEOF(lpszXMLTags),(LPVOID*)lpszXMLSymbols,(SIZE_T*)dwXMLSymbolsCount,(LPVOID*)lpszXMLTags,(SIZE_T*)dwXMLTagsCount,lptszMessageConverted,(dwMessageConvertedBuffSize*sizeof(TCHAR)),pdwMessageConvertedSize);
+
+ if (pdwMessageConvertedSize) (*pdwMessageConvertedSize)/=sizeof(TCHAR);
+return(dwRet);
+}
+
+
+//(Taken from Miranda-IM source code:)
+BYTE MsgDlgGetFontDefaultCharset(const TCHAR* szFont)
+{
+ return(DEFAULT_CHARSET);
+}
+
+
+void LoadMsgDlgFont(int i,LOGFONT *lf,COLORREF *colour)
+{
+ int style;
+ char str[MAX_PATH];
+ DBVARIANT dbv;
+
+ if (colour)
+ {
+ mir_snprintf(str,sizeof(str),"Font%dCol",i);
+ (*colour)=DBGetContactSettingDword(NULL,SRMMMOD,str,fontOptionsList[0].defColour);
+ }
+
+ if (lf)
+ {
+ if (DBGetContactSetting(NULL,SRMMMOD,str,&dbv))
+ {
+ lstrcpyn(lf->lfFaceName,fontOptionsList[0].szDefFace,SIZEOF(lf->lfFaceName));
+ }else{
+ lstrcpyn(lf->lfFaceName,dbv.ptszVal,SIZEOF(lf->lfFaceName));
+ DBFreeVariant(&dbv);
+ }
+
+ mir_snprintf(str,sizeof(str),"Font%dSize",i);
+ lf->lfHeight=(char)DBGetContactSettingByte(NULL,SRMMMOD,str,fontOptionsList[0].defSize);
+ lf->lfWidth=0;
+ lf->lfEscapement=0;
+ lf->lfOrientation=0;
+ mir_snprintf(str,sizeof(str),"Font%dSty",i);
+ style=DBGetContactSettingByte(NULL,SRMMMOD,str,fontOptionsList[0].defStyle);
+ lf->lfWeight=style&FONTF_BOLD?FW_BOLD:FW_NORMAL;
+ lf->lfItalic=style&FONTF_ITALIC?1:0;
+ lf->lfUnderline=0;
+ lf->lfStrikeOut=0;
+ mir_snprintf(str,sizeof(str),"Font%dSet",i);
+ lf->lfCharSet=DBGetContactSettingByte(NULL,SRMMMOD,str,MsgDlgGetFontDefaultCharset(lf->lfFaceName));
+ lf->lfOutPrecision=OUT_DEFAULT_PRECIS;
+ lf->lfClipPrecision=CLIP_DEFAULT_PRECIS;
+ lf->lfQuality=DEFAULT_QUALITY;
+ lf->lfPitchAndFamily=DEFAULT_PITCH|FF_DONTCARE;
+ mir_snprintf(str,sizeof(str),"Font%d",i);
+ }
+}
+
+
+LRESULT CALLBACK MessageSubclassProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
+{
+ LRESULT lrRet=0;
+ WNDPROC OldMessageEditProc=(WNDPROC)GetWindowLongPtr(hwnd,GWL_USERDATA);
+
+ switch(message){
+ case WM_CHAR:
+ if (wParam=='\n' && GetKeyState(VK_CONTROL)&0x8000)
+ {
+ PostMessage(GetParent(hwnd),WM_COMMAND,IDOK,0);
+ return(0);
+ }
+ break;
+ }
+
+ if (OldMessageEditProc) lrRet=CallWindowProc(OldMessageEditProc,hwnd,message,wParam,lParam);
+
+return(lrRet);
+}
+
+
+
+
+//This function refresh account list.
+//It called when SMS plugin loaded and upon change in the account list.
+int RefreshAccountList(WPARAM eventCode,LPARAM lParam)
+{
+ SIZE_T dwAccCount=0,i,dwSMSAccountsCount=0;
+ PROTOACCOUNT **ppaAccounts;
+
+ ProtoEnumAccounts((int*)&dwAccCount,&ppaAccounts);
+
+ FreeAccountList();
+ ssSMSSettings.ppaSMSAccounts=(PROTOACCOUNT**)MEMALLOC((dwAccCount*sizeof(LPVOID)));
+ if (ssSMSSettings.ppaSMSAccounts)
+ {
+ char szServiceName[MAX_PATH];
+
+ for (i=0;i<dwAccCount;i++)
+ {
+ if (IsAccountEnabled(ppaAccounts[i]))
+ {
+ mir_snprintf(szServiceName,sizeof(szServiceName),"%s%s",ppaAccounts[i]->szModuleName,MS_ICQ_SENDSMS);
+ if (ServiceExists(szServiceName))
+ {
+ ssSMSSettings.ppaSMSAccounts[dwSMSAccountsCount++]=ppaAccounts[i];
+ }
+ }
+ }
+ }
+ ssSMSSettings.dwSMSAccountsCount=dwSMSAccountsCount;
+ SendSMSWindowsUpdateAllAccountLists();
+
+return(0);
+}
+
+//This function free the global account list.
+//This function should be called before list refresh or when SMS plugin unloaded.
+void FreeAccountList()
+{
+ MEMFREE(ssSMSSettings.ppaSMSAccounts);
+ ssSMSSettings.dwSMSAccountsCount=0;
+}
+
+//This function check if the module is in the account list that supports sms sending in miranda.
+/*BOOL IsModuleInAccountList(LPSTR lpszModule)
+{
+ BOOL bRet=FALSE;
+
+ if (ssSMSSettings.ppaSMSAccounts && ssSMSSettings.dwSMSAccountsCount)
+ {
+ for(SIZE_T i=0;i<ssSMSSettings.dwSMSAccountsCount;i++)
+ {
+ if (CompareStringA(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),NORM_IGNORECASE,ssSMSSettings.ppaSMSAccounts[i]->szModuleName,-1,lpszModule,-1)==CSTR_EQUAL)
+ {
+ bRet=TRUE;
+ break;
+ }
+ }
+ }
+return(bRet);
+}//*/
+
|