/* Jabber Protocol Plugin for Miranda IM Copyright (C) 2002-04 Santithorn Bunchua Copyright (C) 2005-12 George Hazan This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "jabber.h" #include "jabber_iq.h" #include "jabber_caps.h" ///////////////////////////////////////////////////////////////////////////////////////// // Agent registration progress dialog class CAgentRegProgressDlg : public CJabberDlgBase { CCtrlButton m_ok; public: CAgentRegProgressDlg(CJabberProto* _ppro, HWND _owner) : CJabberDlgBase(_ppro, IDD_OPT_REGISTER, _owner, false), m_ok(this, IDOK) { m_ok.OnClick = Callback(this, &CAgentRegProgressDlg::OnOk); } virtual void OnInitDialog() { m_proto->m_hwndRegProgress = m_hwnd; SetWindowTextA(m_hwnd, "Jabber Agent Registration"); TranslateDialogDefault(m_hwnd); } virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_JABBER_REGDLG_UPDATE) { if ((TCHAR*)lParam == NULL) SetDlgItemText(m_hwnd, IDC_REG_STATUS, TranslateT("No message")); else SetDlgItemText(m_hwnd, IDC_REG_STATUS, (TCHAR*)lParam); if (wParam >= 0) SendMessage(GetDlgItem(m_hwnd, IDC_PROGRESS_REG), PBM_SETPOS, wParam, 0); if (wParam >= 100) m_ok.SetText(TranslateT("OK")); } return CJabberDlgBase::DlgProc(msg, wParam, lParam); } void OnOk(CCtrlButton*) { m_proto->m_hwndRegProgress = NULL; EndDialog(m_hwnd, 0); } }; ///////////////////////////////////////////////////////////////////////////////////////// // Transport registration form class CAgentRegDlg : public CJabberDlgBase { int m_curPos; int m_formHeight, m_frameHeight; RECT m_frameRect; HXML m_agentRegIqNode; TCHAR* m_jid; CCtrlButton m_submit; public: CAgentRegDlg(CJabberProto* _ppro, TCHAR* _jid) : CJabberDlgBase(_ppro, IDD_FORM, NULL, false), m_submit(this, IDC_SUBMIT), m_jid(_jid), m_agentRegIqNode(NULL) { m_submit.OnClick = Callback(this, &CAgentRegDlg::OnSubmit); } virtual void OnInitDialog() { EnableWindow(GetParent(m_hwnd), FALSE); m_proto->m_hwndAgentRegInput = m_hwnd; SetWindowText(m_hwnd, TranslateT("Jabber Agent Registration")); SetDlgItemText(m_hwnd, IDC_SUBMIT, TranslateT("Register")); SetDlgItemText(m_hwnd, IDC_FRAME_TEXT, TranslateT("Please wait...")); int iqId = m_proto->SerialNext(); m_proto->IqAdd(iqId, IQ_PROC_GETREGISTER, &CJabberProto::OnIqResultGetRegister); m_proto->m_ThreadInfo->send(XmlNodeIq(_T("get"), iqId, m_jid) << XQUERY(_T(JABBER_FEAT_REGISTER))); // Enable WS_EX_CONTROLPARENT on IDC_FRAME (so tab stop goes through all its children) LONG frameExStyle = GetWindowLongPtr(GetDlgItem(m_hwnd, IDC_FRAME), GWL_EXSTYLE); frameExStyle |= WS_EX_CONTROLPARENT; SetWindowLongPtr(GetDlgItem(m_hwnd, IDC_FRAME), GWL_EXSTYLE, frameExStyle); } virtual void OnDestroy() { xi.destroyNode(m_agentRegIqNode); JabberFormDestroyUI(GetDlgItem(m_hwnd, IDC_FRAME)); m_proto->m_hwndAgentRegInput = NULL; EnableWindow(GetParent(m_hwnd), TRUE); SetActiveWindow(GetParent(m_hwnd)); } virtual INT_PTR DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CTLCOLORSTATIC: switch(GetDlgCtrlID((HWND)lParam)) { case IDC_WHITERECT: case IDC_INSTRUCTION: case IDC_TITLE: return (INT_PTR)GetStockObject(WHITE_BRUSH); default: return NULL; } case WM_JABBER_REGINPUT_ACTIVATE: if (wParam == 1) { // success // lParam = node from agent JID as a result of "get jabber:iq:register" HWND hFrame = GetDlgItem(m_hwnd, IDC_FRAME); ShowWindow(GetDlgItem(m_hwnd, IDC_FRAME_TEXT), SW_HIDE); HXML queryNode, xNode; if ((m_agentRegIqNode = (HXML)lParam) == NULL) return TRUE; if ((queryNode = xmlGetChild(m_agentRegIqNode , "query")) == NULL) return TRUE; RECT rect; m_curPos = 0; GetClientRect(GetDlgItem(m_hwnd, IDC_FRAME), &(m_frameRect)); GetClientRect(GetDlgItem(m_hwnd, IDC_VSCROLL), &rect); m_frameRect.right -= (rect.right - rect.left); GetClientRect(GetDlgItem(m_hwnd, IDC_FRAME), &rect); m_frameHeight = rect.bottom - rect.top; if ((xNode=xmlGetChild(queryNode , "x")) != NULL) { // use new jabber:x:data form HXML n = xmlGetChild(xNode , "instructions"); if (n != NULL && xmlGetText(n)!=NULL) JabberFormSetInstruction(m_hwnd, xmlGetText(n)); JabberFormCreateUI(hFrame, xNode, &m_formHeight /*dummy*/); } else { // use old registration information form HJFORMLAYOUT layout_info = JabberFormCreateLayout(hFrame); for (int i=0; ; i++) { HXML n = xmlGetChild(queryNode ,i); if ( !n) break; if (xmlGetName(n)) { if ( !lstrcmp(xmlGetName(n), _T("instructions"))) { JabberFormSetInstruction(m_hwnd, xmlGetText(n)); } else if ( !lstrcmp(xmlGetName(n), _T("key")) || !lstrcmp(xmlGetName(n), _T("registered"))) { // do nothing } else if ( !lstrcmp(xmlGetName(n), _T("password"))) JabberFormAppendControl(hFrame, layout_info, JFORM_CTYPE_TEXT_PRIVATE, xmlGetName(n), xmlGetText(n)); else // everything else is a normal text field JabberFormAppendControl(hFrame, layout_info, JFORM_CTYPE_TEXT_SINGLE, xmlGetName(n), xmlGetText(n)); } } JabberFormLayoutControls(hFrame, layout_info, &m_formHeight); mir_free(layout_info); } if (m_formHeight > m_frameHeight) { HWND hwndScroll; hwndScroll = GetDlgItem(m_hwnd, IDC_VSCROLL); EnableWindow(hwndScroll, TRUE); SetScrollRange(hwndScroll, SB_CTL, 0, m_formHeight - m_frameHeight, FALSE); m_curPos = 0; } EnableWindow(GetDlgItem(m_hwnd, IDC_SUBMIT), TRUE); } else if (wParam == 0) { // lParam = error message SetDlgItemText(m_hwnd, IDC_FRAME_TEXT, (LPCTSTR) lParam); } return TRUE; case WM_VSCROLL: int pos = m_curPos; switch (LOWORD(wParam)) { case SB_LINEDOWN: pos += 10; break; case SB_LINEUP: pos -= 10; break; case SB_PAGEDOWN: pos += (m_frameHeight - 10); break; case SB_PAGEUP: pos -= (m_frameHeight - 10); break; case SB_THUMBTRACK: pos = HIWORD(wParam); break; } if (pos > (m_formHeight - m_frameHeight)) pos = m_formHeight - m_frameHeight; if (pos < 0) pos = 0; if (m_curPos != pos) { ScrollWindow(GetDlgItem(m_hwnd, IDC_FRAME), 0, m_curPos - pos, NULL, &(m_frameRect)); SetScrollPos(GetDlgItem(m_hwnd, IDC_VSCROLL), SB_CTL, pos, TRUE); m_curPos = pos; } } return CJabberDlgBase::DlgProc(msg, wParam, lParam); } 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; int iqId = m_proto->SerialNext(); m_proto->IqAdd(iqId, IQ_PROC_SETREGISTER, &CJabberProto::OnIqResultSetRegister); XmlNodeIq iq(_T("set"), iqId, from); HXML query = iq << XQUERY(_T(JABBER_FEAT_REGISTER)); if ((xNode = xmlGetChild(queryNode , "x")) != NULL) { // use new jabber:x:data form HXML n = JabberFormGetData(hFrame, xNode); xmlAddChild(query, n); xi.destroyNode(n); } else { // use old registration information form for (int i=0; ; i++) { HXML n = xmlGetChild(queryNode ,i); if ( !n) break; if (xmlGetName(n)) { if ( !lstrcmp(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 ( !lstrcmp(xmlGetName(n), _T("registered")) || !lstrcmp(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(); } }; void CJabberProto::RegisterAgent(HWND /*hwndDlg*/, TCHAR* jid) { (new CAgentRegDlg(this, jid))->Show(); }