summaryrefslogtreecommitdiff
path: root/protocols/JabberG/src/jabber_agent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/JabberG/src/jabber_agent.cpp')
-rw-r--r--protocols/JabberG/src/jabber_agent.cpp283
1 files changed, 283 insertions, 0 deletions
diff --git a/protocols/JabberG/src/jabber_agent.cpp b/protocols/JabberG/src/jabber_agent.cpp
new file mode 100644
index 0000000000..b0ad17e8a0
--- /dev/null
+++ b/protocols/JabberG/src/jabber_agent.cpp
@@ -0,0 +1,283 @@
+/*
+
+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 = <iq/> 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();
+}