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" ));
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #6
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;
}
Пример #7
0
// 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);
		}
	}
}
Пример #8
0
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';
}
Пример #9
0
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;
}
Пример #10
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;
}
Пример #11
0
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);
			}
		}
	}
}
Пример #12
0
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);
	}

}
Пример #13
0
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;
}
Пример #14
0
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);
	}
}
Пример #15
0
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);
        }
    }
}
Пример #16
0
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 );
}