HWND __cdecl CJabberProto::SearchAdvanced( HWND hwndDlg ) { if ( !m_bJabberOnline || !hwndDlg ) return 0; //error JabberSearchData * dat=(JabberSearchData *)GetWindowLongPtr(hwndDlg,GWLP_USERDATA); if ( !dat ) return 0; //error // check if server connected (at least one field exists) if ( dat->nJSInfCount == 0 ) return 0; // formating request BOOL fRequestNotEmpty=FALSE; // get server name TCHAR szServerName[100]; GetDlgItemText( hwndDlg, IDC_SERVER, szServerName, SIZEOF( szServerName )); // formating query int iqId = SerialNext(); XmlNodeIq iq( _T("set"), iqId, szServerName ); HXML query = iq << XQUERY( _T("jabber:iq:search")); if ( m_tszSelectedLang ) iq << XATTR( _T("xml:lang"), m_tszSelectedLang ); // i'm sure :) // next can be 2 cases: // Forms: XEP-0055 Example 7 if ( dat->fSearchRequestIsXForm ) { fRequestNotEmpty=TRUE; HXML n = JabberFormGetData(GetDlgItem(hwndDlg, IDC_FRAME), dat->xNode); xmlAddChild( query, n ); xi.destroyNode( n ); } else { //and Simple fields: XEP-0055 Example 3 for ( int i=0; i<dat->nJSInfCount; i++ ) { TCHAR szFieldValue[100]; GetWindowText(dat->pJSInf[i].hwndValueItem, szFieldValue, SIZEOF(szFieldValue)); if ( szFieldValue[0] != _T('\0')) { xmlAddChild( query, dat->pJSInf[i].szFieldName, szFieldValue ); fRequestNotEmpty=TRUE; } } } if ( fRequestNotEmpty ) { // register search request result handler IqAdd( iqId, IQ_PROC_GETSEARCH, &CJabberProto::OnIqResultAdvancedSearch ); // send request m_ThreadInfo->send( iq ); return ( HWND )iqId; } return 0; }
int JabberSearchByAdvanced( WPARAM wParam, LPARAM lParam ) { if ( !jabberOnline || !lParam) return 0; //error HWND hwndDlg=(HWND) lParam; JabberSearchData * dat=(JabberSearchData *)GetWindowLong(hwndDlg,GWL_USERDATA); if ( !dat ) return 0; //error // check if server connected (at least one field exists) if ( dat->nJSInfCount == 0 ) return 0; // formating request BOOL fRequestNotEmpty=FALSE; // get server name char szServerName[100]; GetDlgItemTextA( hwndDlg, IDC_SERVER, szServerName, sizeof( szServerName )); // formating query int iqId = JabberSerialNext(); XmlNodeIq iq( "set", iqId, szServerName ); XmlNode* query = iq.addChild( "query" ), *field; iq.addAttr( "xml:lang", "en" ); //? not sure is it needed ? query->addAttr( "xmlns", "jabber:iq:search" ); // next can be 2 cases: // Forms: XEP-0055 Example 7 if ( dat->fSearchRequestIsXForm ) { fRequestNotEmpty=TRUE; query->addChild(JabberFormGetData(GetDlgItem(hwndDlg, IDC_FRAME), dat->xNode)); } else { //and Simple fields: XEP-0055 Example 3 for ( int i=0; i<dat->nJSInfCount; i++ ) { TCHAR szFieldValue[100]; GetWindowText(dat->pJSInf[i].hwndValueItem, szFieldValue, SIZEOF(szFieldValue)); if ( szFieldValue[0] != _T('\0')) { char* szTemp=t2a(dat->pJSInf[i].szFieldName); field = query->addChild( szTemp, szFieldValue ); mir_free(szTemp); fRequestNotEmpty=TRUE; } } } if ( fRequestNotEmpty ) { // register search request result handler JabberIqAdd( iqId, IQ_PROC_GETSEARCH, JabberIqResultAdvancedSearch ); // send request JabberSend( jabberThreadInfo->s, iq ); return iqId; } return 0; }
void OnSubmit(CCtrlButton*) { HXML queryNode, xNode; const TCHAR *from; if (m_agentRegIqNode == NULL) return; if ((from = XmlGetAttrValue(m_agentRegIqNode, _T("from"))) == NULL) return; if ((queryNode = XmlGetChild(m_agentRegIqNode , "query")) == NULL) return; HWND hFrame = GetDlgItem(m_hwnd, IDC_FRAME); TCHAR *str2 = (TCHAR*)alloca(sizeof(TCHAR) * 128); int id = 0; XmlNodeIq iq( m_proto->AddIQ(&CJabberProto::OnIqResultSetRegister, JABBER_IQ_TYPE_SET, from)); HXML query = iq << XQUERY(JABBER_FEAT_REGISTER); if ((xNode = XmlGetChild(queryNode , "x")) != NULL) { // use new jabber:x:data form HXML n = JabberFormGetData(hFrame, xNode); XmlAddChild(query, n); xmlDestroyNode(n); } else { // use old registration information form for (int i=0; ; i++) { HXML n = XmlGetChild(queryNode ,i); if (!n) break; if (XmlGetName(n)) { if (!mir_tstrcmp(XmlGetName(n), _T("key"))) { // field that must be passed along with the registration if (XmlGetText(n)) XmlAddChild(query, XmlGetName(n), XmlGetText(n)); else XmlAddChild(query, XmlGetName(n)); } else if (!mir_tstrcmp(XmlGetName(n), _T("registered")) || !mir_tstrcmp(XmlGetName(n), _T("instructions"))) { // do nothing, we will skip these } else { GetDlgItemText(hFrame, id, str2, 128); XmlAddChild(query, XmlGetName(n), str2); id++; } } } } m_proto->m_ThreadInfo->send(iq); CAgentRegProgressDlg(m_proto, m_hwnd).DoModal(); Close(); }