/* Jabber Protocol Plugin for Miranda IM Copyright ( C ) 2002-04 Santithorn Bunchua Copyright ( C ) 2005-06 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. File name : $Source: /cvsroot/miranda/miranda/protocols/JabberG/jabber_agent.cpp,v $ Revision : $Revision: 2866 $ Last change on : $Date: 2006-05-16 20:39:40 +0400 (Втр, 16 Май 2006) $ Last change by : $Author: ghazan $ */ #include "jabber.h" #include #include "resource.h" #include "jabber_iq.h" static BOOL CALLBACK JabberAgentsDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ); BOOL CALLBACK JabberAgentRegInputDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ); static BOOL CALLBACK JabberAgentRegDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ); static BOOL CALLBACK JabberAgentManualRegDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ); int JabberMenuHandleAgents( WPARAM wParam, LPARAM lParam ) { if ( IsWindow( hwndJabberAgents )) SetForegroundWindow( hwndJabberAgents ); else CreateDialogParam( hInst, MAKEINTRESOURCE( IDD_AGENTS ), NULL, JabberAgentsDlgProc, ( LPARAM )NULL ); return 0; } static void JabberRegisterAgent( HWND hwndDlg, TCHAR* jid ) { int iqId = JabberSerialNext(); JabberIqAdd( iqId, IQ_PROC_GETREGISTER, JabberIqResultGetRegister ); XmlNodeIq iq( "get", iqId, jid ); XmlNode* query = iq.addQuery( "jabber:iq:register" ); JabberSend( jabberThreadInfo->s, iq ); hwndAgentRegInput = CreateDialogParam( hInst, MAKEINTRESOURCE( IDD_FORM ), hwndDlg, JabberAgentRegInputDlgProc, 0 ); } static BOOL CALLBACK JabberAgentsDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { HWND lv; LVCOLUMN lvCol; LVITEM lvItem; JABBER_LIST_ITEM *item; int i; TCHAR text[128]; TCHAR* p; int iqId; switch ( msg ) { case WM_INITDIALOG: hwndJabberAgents = hwndDlg; SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )) ); TranslateDialogDefault( hwndDlg ); // Add columns to the top list lv = GetDlgItem( hwndDlg, IDC_AGENT_LIST ); lvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; lvCol.pszText = TranslateT( "JID" ); lvCol.cx = 120; lvCol.iSubItem = 0; ListView_InsertColumn( lv, 0, &lvCol ); lvCol.pszText = TranslateT( "Description" ); lvCol.cx = 250; lvCol.iSubItem = 1; ListView_InsertColumn( lv, 1, &lvCol ); // Add columns to the bottom list lv = GetDlgItem( hwndDlg, IDC_AGENT_TRANSPORT ); lvCol.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; lvCol.pszText = TranslateT( "JID" ); lvCol.cx = 120; lvCol.iSubItem = 0; ListView_InsertColumn( lv, 0, &lvCol ); lvCol.pszText = TranslateT( "Status" ); lvCol.cx = 80; lvCol.iSubItem = 1; ListView_InsertColumn( lv, 1, &lvCol ); if ( jabberOnline ) { SetDlgItemTextA( hwndDlg, IDC_AGENT_SERVER, jabberThreadInfo->server ); JabberListRemoveList( LIST_AGENT ); iqId = JabberSerialNext(); JabberIqAdd( iqId, IQ_PROC_DISCOAGENTS, JabberIqResultDiscoAgentItems ); XmlNodeIq iq( "get", iqId, jabberThreadInfo->server ); XmlNode* query = iq.addQuery( "http://jabber.org/protocol/disco#items" ); JabberSend( jabberThreadInfo->s, iq ); SendMessage( hwndDlg, WM_JABBER_TRANSPORT_REFRESH, 0, 0 ); } return TRUE; case WM_NOTIFY: switch (( ( LPNMHDR ) lParam )->code ) { case LVN_ITEMCHANGED: { LPNMLISTVIEW lpnm; lpnm = ( LPNMLISTVIEW ) lParam; if ( lpnm->hdr.idFrom == IDC_AGENT_LIST ) { lv = GetDlgItem( hwndDlg, IDC_AGENT_LIST ); if ( lpnm->uChanged & LVIF_STATE ) { if ( lpnm->uNewState & LVIS_SELECTED ) { lvItem.iItem = lpnm->iItem; lvItem.iSubItem = 0; lvItem.mask = LVIF_TEXT; lvItem.pszText = text; lvItem.cchTextMax = SIZEOF( text ); ListView_GetItem( lv, &lvItem ); if (( item=JabberListGetItemPtr( LIST_AGENT, lvItem.pszText )) != NULL ) { if ( item->cap & AGENT_CAP_REGISTER ) EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_REGISTER ), TRUE ); //if ( item->canSearch ) EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_SEARCH ), TRUE ); if ( item->cap & AGENT_CAP_GROUPCHAT ) EnableWindow( GetDlgItem( hwndDlg, IDC_JOIN ), TRUE ); } } else { EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_REGISTER ), FALSE ); //EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_SEARCH ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_JOIN ), FALSE ); } return TRUE; } } else if ( lpnm->hdr.idFrom == IDC_AGENT_TRANSPORT ) { lv = GetDlgItem( hwndDlg, IDC_AGENT_TRANSPORT ); if ( lpnm->uChanged & LVIF_STATE ) { EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGON ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGOFF ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_UNREGISTER ), FALSE ); if ( lpnm->uNewState & LVIS_SELECTED ) { lvItem.iItem = lpnm->iItem; lvItem.iSubItem = 0; lvItem.mask = LVIF_TEXT; lvItem.pszText = text; lvItem.cchTextMax = SIZEOF( text ); ListView_GetItem( lv, &lvItem ); if (( item=JabberListGetItemPtr( LIST_ROSTER, lvItem.pszText )) != NULL ) { if ( item->status == ID_STATUS_OFFLINE ) EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGON ), TRUE ); else EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGOFF ), TRUE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_UNREGISTER ), TRUE ); } } return TRUE; } } } break; } break; case WM_JABBER_AGENT_REFRESH: // lParam = server from which agent information is obtained if ( lParam ) SetDlgItemText( hwndDlg, IDC_AGENT_SERVER, ( TCHAR* )lParam ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_REGISTER ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_SEARCH ), FALSE ); i = 0; lv = GetDlgItem( hwndDlg, IDC_AGENT_LIST ); ListView_DeleteAllItems( lv ); lvItem.iItem = 0; while (( i=JabberListFindNext( LIST_AGENT, i )) >= 0 ) { if (( item=JabberListGetItemPtrFromIndex( i )) != NULL ) { lvItem.mask = LVIF_TEXT; lvItem.iSubItem = 0; lvItem.pszText = item->jid; ListView_InsertItem( lv, &lvItem ); lvItem.iSubItem = 1; lvItem.pszText = item->name; ListView_SetItem( lv, &lvItem ); lvItem.iItem++; } i++; } EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_SERVER ), TRUE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_BROWSE ), TRUE ); return TRUE; case WM_JABBER_TRANSPORT_REFRESH: EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGON ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGOFF ), FALSE ); i = 0; lv = GetDlgItem( hwndDlg, IDC_AGENT_TRANSPORT ); ListView_DeleteAllItems( lv ); lvItem.iItem = 0; while (( i=JabberListFindNext( LIST_ROSTER, i )) >= 0 ) { if (( item=JabberListGetItemPtrFromIndex( i )) != NULL ) { if ( _tcschr( item->jid, '@' )==NULL && item->subscription!=SUB_NONE ) { _tcscpy( text, item->jid ); if (( p=_tcschr( text, '/' )) != NULL ) *p = '\0'; lvItem.mask = LVIF_TEXT; lvItem.iSubItem = 0; lvItem.pszText = text; ListView_InsertItem( lv, &lvItem ); lvItem.iSubItem = 1; if ( item->status != ID_STATUS_OFFLINE ) lvItem.pszText = TranslateT( "Online" ); else lvItem.pszText = TranslateT( "Offline" ); ListView_SetItem( lv, &lvItem ); lvItem.iItem++; } } i++; } return TRUE; case WM_JABBER_CHECK_ONLINE: if ( !jabberOnline ) { if ( hwndAgentRegInput ) DestroyWindow( hwndAgentRegInput ); if ( hwndAgentManualReg ) DestroyWindow( hwndAgentManualReg ); } break; case WM_COMMAND: switch ( LOWORD( wParam )) { case IDC_MANUAL_REGISTER: hwndAgentManualReg = CreateDialogParam( hInst, MAKEINTRESOURCE( IDD_AGENT_MANUAL_REGISTER ), hwndDlg, JabberAgentManualRegDlgProc, 0 ); return TRUE; case IDC_AGENT_REGISTER: lv = GetDlgItem( hwndDlg, IDC_AGENT_LIST ); if (( lvItem.iItem=ListView_GetNextItem( lv, -1, LVNI_SELECTED )) >= 0 ) { lvItem.iSubItem = 0; lvItem.mask = LVIF_TEXT; lvItem.pszText = text; lvItem.cchTextMax = SIZEOF( text ); ListView_GetItem( lv, &lvItem ); ListView_SetItemState( lv, lvItem.iItem, 0, LVIS_SELECTED ); // Unselect the item if (( item=JabberListGetItemPtr( LIST_AGENT, lvItem.pszText )) != NULL ) JabberRegisterAgent( hwndDlg, item->jid ); } return TRUE; case IDC_JOIN: lv = GetDlgItem( hwndDlg, IDC_AGENT_LIST ); if (( lvItem.iItem=ListView_GetNextItem( lv, -1, LVNI_SELECTED )) >= 0 ) { lvItem.iSubItem = 0; lvItem.mask = LVIF_TEXT; lvItem.pszText = text; lvItem.cchTextMax = SIZEOF( text ); ListView_GetItem( lv, &lvItem ); ListView_SetItemState( lv, lvItem.iItem, 0, LVIS_SELECTED ); // Unselect the item if (( item=JabberListGetItemPtr( LIST_AGENT, lvItem.pszText )) != NULL ) JabberMenuHandleGroupchat( 0, ( LPARAM )item->jid ); } return TRUE; case IDC_AGENT_SERVER: GetDlgItemText( hwndDlg, IDC_AGENT_SERVER, text, SIZEOF( text )); if ( jabberOnline && text[0] ) EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_BROWSE ), TRUE ); else EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_BROWSE ), FALSE ); break; case IDC_AGENT_BROWSE: GetDlgItemText( hwndDlg, IDC_AGENT_SERVER, text, SIZEOF( text )); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_BROWSE ), FALSE ); ListView_DeleteAllItems( GetDlgItem( hwndDlg, IDC_AGENT_LIST )); JabberListRemoveList( LIST_AGENT ); iqId = JabberSerialNext(); JabberIqAdd( iqId, IQ_PROC_DISCOAGENTS, JabberIqResultDiscoAgentItems ); { XmlNodeIq iq( "get", iqId, text ); XmlNode* query = iq.addQuery( "http://jabber.org/protocol/disco#items" ); JabberSend( jabberThreadInfo->s, iq ); } return TRUE; case IDC_AGENT_LOGON: case IDC_AGENT_LOGOFF: EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_UNREGISTER ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGON ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGOFF ), FALSE ); lv = GetDlgItem( hwndDlg, IDC_AGENT_TRANSPORT ); if (( lvItem.iItem=ListView_GetNextItem( lv, -1, LVNI_SELECTED )) >= 0 ) { lvItem.iSubItem = 0; lvItem.mask = LVIF_TEXT; lvItem.pszText = text; lvItem.cchTextMax = SIZEOF( text ); ListView_GetItem( lv, &lvItem ); if (( item=JabberListGetItemPtr( LIST_ROSTER, lvItem.pszText )) != NULL ) { XmlNode p( "presence" ); p.addAttr( "to", item->jid ); if ( LOWORD( wParam ) != IDC_AGENT_LOGON ) p.addAttr( "type", "unavailable" ); JabberSend( jabberThreadInfo->s, p ); } } return TRUE; case IDC_AGENT_UNREGISTER: EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_UNREGISTER ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGON ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_AGENT_LOGOFF ), FALSE ); lv = GetDlgItem( hwndDlg, IDC_AGENT_TRANSPORT ); if (( lvItem.iItem=ListView_GetNextItem( lv, -1, LVNI_SELECTED )) >= 0 ) { lvItem.iSubItem = 0; lvItem.mask = LVIF_TEXT; lvItem.pszText = text; lvItem.cchTextMax = SIZEOF( text ); ListView_GetItem( lv, &lvItem ); if (( item=JabberListGetItemPtr( LIST_ROSTER, lvItem.pszText )) != NULL ) { { XmlNodeIq iq( "set", NOID, item->jid ); XmlNode* query = iq.addQuery( "jabber:iq:register" ); query->addChild( "remove" ); JabberSend( jabberThreadInfo->s, iq ); } { XmlNodeIq iq( "set" ); XmlNode* query = iq.addQuery( "jabber:iq:roster" ); XmlNode* itm = query->addChild( "item" ); itm->addAttr( "jid", item->jid ); itm->addAttr( "subscription", "remove" ); JabberSend( jabberThreadInfo->s, iq ); } } } return TRUE; case IDCLOSE: DestroyWindow( hwndDlg ); return TRUE; } break; case WM_CLOSE: DestroyWindow( hwndDlg ); break; case WM_DESTROY: hwndJabberAgents = NULL; break; } return FALSE; } BOOL CALLBACK JabberAgentRegInputDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { static XmlNode *agentRegIqNode; int id, ypos, i; TCHAR *from, *str, *str2; switch ( msg ) { case WM_INITDIALOG: { EnableWindow( GetParent( hwndDlg ), FALSE ); TranslateDialogDefault( hwndDlg ); agentRegIqNode = NULL; SetWindowText( hwndDlg, TranslateT( "Jabber Agent Registration" )); SetDlgItemText( hwndDlg, IDC_SUBMIT, TranslateT( "Register" )); SetDlgItemText( hwndDlg, IDC_FRAME_TEXT, TranslateT( "Please wait..." )); // Enable WS_EX_CONTROLPARENT on IDC_FRAME ( so tab stop goes through all its children ) LONG frameExStyle = GetWindowLong( GetDlgItem( hwndDlg, IDC_FRAME ), GWL_EXSTYLE ); frameExStyle |= WS_EX_CONTROLPARENT; SetWindowLong( GetDlgItem( hwndDlg, IDC_FRAME ), GWL_EXSTYLE, frameExStyle ); return TRUE; } case WM_COMMAND: switch ( LOWORD( wParam )) { case IDC_SUBMIT: { XmlNode *queryNode, *xNode, *n; if ( agentRegIqNode == NULL ) return TRUE; if (( from=JabberXmlGetAttrValue( agentRegIqNode, "from" )) == NULL ) return TRUE; if (( queryNode=JabberXmlGetChild( agentRegIqNode, "query" )) == NULL ) return TRUE; HWND hFrame = GetDlgItem( hwndDlg, IDC_FRAME ); str = ( TCHAR* )alloca( sizeof(TCHAR) * 128 ); str2 = ( TCHAR* )alloca( sizeof(TCHAR) * 128 ); id = 0; int iqId = JabberSerialNext(); JabberIqAdd( iqId, IQ_PROC_SETREGISTER, JabberIqResultSetRegister ); XmlNodeIq iq( "set", iqId, from ); XmlNode* query = iq.addQuery( "jabber:iq:register" ); if (( xNode=JabberXmlGetChild( queryNode, "x" )) != NULL ) { // use new jabber:x:data form query->addChild( JabberFormGetData( hFrame, xNode )); } else { // use old registration information form for ( i=0; inumChild; i++ ) { n = queryNode->child[i]; if ( n->name ) { if ( !strcmp( n->name, "key" )) { // field that must be passed along with the registration if ( n->text ) query->addChild( n->name, n->text ); else query->addChild( n->name ); } else if ( !strcmp( n->name, "registered" ) || !strcmp( n->name, "instructions" )) { // do nothing, we will skip these } else { GetDlgItemText( hFrame, id, str2, 128 ); query->addChild( n->name, str2 ); id++; } } } } JabberSend( jabberThreadInfo->s, iq ); DialogBoxParam( hInst, MAKEINTRESOURCE( IDD_OPT_REGISTER ), hwndDlg, JabberAgentRegDlgProc, 0 ); // Fall through to IDCANCEL } case IDCANCEL: if ( agentRegIqNode ) delete agentRegIqNode; DestroyWindow( hwndDlg ); return TRUE; } break; 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( hwndDlg, IDC_FRAME ); HFONT hFont = ( HFONT ) SendMessage( hFrame, WM_GETFONT, 0, 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_FRAME_TEXT ), SW_HIDE ); XmlNode *queryNode, *xNode, *n; if (( agentRegIqNode=( XmlNode * ) lParam ) == NULL ) return TRUE; if (( queryNode=JabberXmlGetChild( agentRegIqNode, "query" )) == NULL ) return TRUE; id = 0; ypos = 14; if (( xNode=JabberXmlGetChild( queryNode, "x" )) != NULL ) { // use new jabber:x:data form if (( n=JabberXmlGetChild( xNode, "instructions" ))!=NULL && n->text!=NULL ) SetDlgItemText( hwndDlg, IDC_INSTRUCTION, n->text ); JabberFormCreateUI( hFrame, xNode, &i /*dummy*/ ); } else { // use old registration information form for ( i=0; inumChild; i++ ) { n = queryNode->child[i]; if ( n->name ) { if ( !strcmp( n->name, "instructions" )) { SetDlgItemText( hwndDlg, IDC_INSTRUCTION, n->text ); } else if ( !strcmp( n->name, "key" ) || !strcmp( n->name, "registered" )) { // do nothing } else if ( !strcmp( n->name, "password" )) { HWND hCtrl = CreateWindowA( "static", n->name, WS_CHILD|WS_VISIBLE|SS_RIGHT, 10, ypos+4, 100, 18, hFrame, ( HMENU ) IDC_STATIC, hInst, NULL ); SendMessage( hCtrl, WM_SETFONT, ( WPARAM ) hFont, 0 ); hCtrl = CreateWindowEx( WS_EX_CLIENTEDGE, _T("edit"), n->text, WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP|ES_LEFT|ES_AUTOHSCROLL|ES_PASSWORD, 120, ypos, 128, 24, hFrame, ( HMENU ) id, hInst, NULL ); SendMessage( hCtrl, WM_SETFONT, ( WPARAM ) hFont, 0 ); id++; ypos += 24; } else { // everything else is a normal text field HWND hCtrl = CreateWindowA( "static", n->name, WS_CHILD|WS_VISIBLE|SS_RIGHT, 10, ypos+4, 100, 18, hFrame, ( HMENU ) IDC_STATIC, hInst, NULL ); SendMessage( hCtrl, WM_SETFONT, ( WPARAM ) hFont, 0 ); hCtrl = CreateWindowEx( WS_EX_CLIENTEDGE, _T("edit"), n->text, WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP|ES_LEFT|ES_AUTOHSCROLL, 120, ypos, 128, 24, hFrame, ( HMENU ) id, hInst, NULL ); SendMessage( hCtrl, WM_SETFONT, ( WPARAM ) hFont, 0 ); id++; ypos += 24; } } } } EnableWindow( GetDlgItem( hwndDlg, IDC_SUBMIT ), TRUE ); } else if ( wParam == 0 ) { // lParam = error message SetDlgItemTextA( hwndDlg, IDC_FRAME_TEXT, ( LPCSTR ) lParam ); } return TRUE; case WM_DESTROY: hwndAgentRegInput = NULL; EnableWindow( GetParent( hwndDlg ), TRUE ); SetActiveWindow( GetParent( hwndDlg )); break; } return FALSE; } static BOOL CALLBACK JabberAgentManualRegDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { static BOOL dontEnableParent; // Very ugly hack switch ( msg ) { case WM_INITDIALOG: EnableWindow( GetParent( hwndDlg ), FALSE ); dontEnableParent = FALSE; SendMessage( hwndDlg, WM_SETICON, ICON_BIG, ( LPARAM )LoadIcon( hInst, MAKEINTRESOURCE( IDI_AGENTS )) ); TranslateDialogDefault( hwndDlg ); return TRUE; case WM_COMMAND: { TCHAR jid[256]; switch ( LOWORD( wParam )) { case IDC_JID: GetDlgItemText( hwndDlg, IDC_JID, jid, SIZEOF( jid )); EnableWindow( GetDlgItem( hwndDlg, IDOK ), ( jid[0]=='\0' )?FALSE:TRUE ); break; case IDOK: GetDlgItemText( hwndDlg, IDC_JID, jid, SIZEOF( jid )); JabberRegisterAgent( GetParent( hwndDlg ), jid ); dontEnableParent = TRUE; // Fall through case IDCANCEL: case IDCLOSE: DestroyWindow( hwndDlg ); return TRUE; } } break; case WM_DESTROY: hwndAgentManualReg = NULL; if ( dontEnableParent == FALSE ) { EnableWindow( GetParent( hwndDlg ), TRUE ); SetActiveWindow( GetParent( hwndDlg )); } break; } return FALSE; } static BOOL CALLBACK JabberAgentRegDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) { switch ( msg ) { case WM_INITDIALOG: hwndRegProgress = hwndDlg; SetWindowTextA( hwndDlg, "Jabber Agent Registration" ); TranslateDialogDefault( hwndDlg ); ShowWindow( GetDlgItem( hwndDlg, IDOK ), SW_HIDE ); ShowWindow( GetDlgItem( hwndDlg, IDCANCEL ), SW_HIDE ); ShowWindow( GetDlgItem( hwndDlg, IDC_PROGRESS_REG ), SW_SHOW ); ShowWindow( GetDlgItem( hwndDlg, IDCANCEL2 ), SW_SHOW ); return TRUE; case WM_COMMAND: switch ( LOWORD( wParam )) { case IDCANCEL2: case IDOK2: hwndRegProgress = NULL; EndDialog( hwndDlg, 0 ); return TRUE; } break; case WM_JABBER_REGDLG_UPDATE: // wParam=progress ( 0-100 ), lparam=status string if (( TCHAR* )lParam == NULL ) SetDlgItemText( hwndDlg, IDC_REG_STATUS, TranslateT( "No message" )); else SetDlgItemText( hwndDlg, IDC_REG_STATUS, ( TCHAR* )lParam ); if ( wParam >= 0 ) SendMessage( GetDlgItem( hwndDlg, IDC_PROGRESS_REG ), PBM_SETPOS, wParam, 0 ); if ( wParam >= 100 ) { ShowWindow( GetDlgItem( hwndDlg, IDCANCEL2 ), SW_HIDE ); ShowWindow( GetDlgItem( hwndDlg, IDOK2 ), SW_SHOW ); SetFocus( GetDlgItem( hwndDlg, IDOK2 )); } else SetFocus( GetDlgItem( hwndDlg, IDCANCEL2 )); return TRUE; } return FALSE; }