Index: jabber.cpp =================================================================== --- jabber.cpp (revision 5763) +++ jabber.cpp (working copy) @@ -38,19 +38,19 @@ PLUGININFOEX pluginInfo = { sizeof( PLUGININFOEX ), - "Jabber Protocol", + "Meebo Protocol", __VERSION_DWORD, - "Jabber protocol plugin for Miranda IM ( "__DATE__" )", - "George Hazan", + "Meebo protocol plugin for Miranda IM ( "__DATE__" )", + "George Hazan, Ricardo Pescuma Domenecci", "ghazan@miranda-im.org", - "( c ) 2002-05 Santithorn Bunchua, George Hazan", - "http://miranda-im.org", + "( c ) 2002-05 Santithorn Bunchua, George Hazan, Ricardo Pescuma Domenecci", + "http://pescuma.mirandaim.ru/miranda/meebo", UNICODE_AWARE, 0, #if defined( _UNICODE ) - {0x1ee5af12, 0x26b0, 0x4290, { 0x8f, 0x97, 0x16, 0x77, 0xcb, 0xe, 0xfd, 0x2b }} //{1EE5AF12-26B0-4290-8F97-1677CB0EFD2B} + { 0x2dcd3555, 0x9be9, 0x4fbf, { 0x9c, 0xfb, 0x24, 0x29, 0xaf, 0xee, 0xeb, 0x96 } } // {2DCD3555-9BE9-4fbf-9CFB-2429AFEEEB96} #else - {0xf7f5861d, 0x988d, 0x479d, { 0xa5, 0xbb, 0x80, 0xc7, 0xfa, 0x8a, 0xd0, 0xef }} //{F7F5861D-988D-479d-A5BB-80C7FA8AD0EF} + { 0xeb3c7d40, 0xbb83, 0x463d, { 0xb2, 0xbf, 0x7e, 0x5, 0x7c, 0xdb, 0x39, 0xc4 } } // {EB3C7D40-BB83-463d-B2BF-7E057CDB39C4} #endif }; @@ -343,7 +343,7 @@ pd.type = PROTOTYPE_PROTOCOL; JCallService( MS_PROTO_REGISTERMODULE, 0, ( LPARAM )&pd ); - // Set all contacts to offline + // Set all contacts to offline and delete meebomecontacts HANDLE hContact = ( HANDLE ) JCallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); while ( hContact != NULL ) { char* szProto = ( char* )JCallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM ) hContact, 0 ); @@ -351,8 +351,8 @@ if ( JGetWord( hContact, "Status", ID_STATUS_OFFLINE ) != ID_STATUS_OFFLINE ) JSetWord( hContact, "Status", ID_STATUS_OFFLINE ); + DBVARIANT dbv; if ( JGetByte( hContact, "IsTransport", 0 )) { - DBVARIANT dbv; if ( !JGetStringT( hContact, "jid", &dbv )) { TCHAR* domain = NEWTSTR_ALLOCA(dbv.ptszVal); TCHAR* resourcepos = _tcschr( domain, '/' ); @@ -360,8 +360,21 @@ *resourcepos = '\0'; jabberTransports.insert( _tcsdup( domain )); JFreeVariant( &dbv ); - } } } + } } + if ( JGetByte( "AlwaysRemoveMeebome", TRUE ) ) { + if ( !JGetStringT( hContact, "MirVer", &dbv )) { + HANDLE hContactNext = NULL; + if ( lstrcmp( _T("meebome"), dbv.ptszVal ) == 0 ) { + HANDLE hContactNext = ( HANDLE ) JCallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM ) hContact, 0 ); + JCallService( MS_DB_CONTACT_DELETE, ( WPARAM ) hContact, 0 ); + } + JFreeVariant( &dbv ); + if ( hContactNext != NULL ) { + hContact = hContactNext; + continue; + } } } } + hContact = ( HANDLE ) JCallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM ) hContact, 0 ); } Index: jabber.h =================================================================== --- jabber.h (revision 5763) +++ jabber.h (working copy) @@ -501,7 +501,7 @@ void JabberChatDllError( void ); int JabberCompareJids( const TCHAR* jid1, const TCHAR* jid2 ); void JabberContactListCreateGroup( TCHAR* groupName ); -void JabberDBAddAuthRequest( TCHAR* jid, TCHAR* nick ); +void JabberDBAddAuthRequest( TCHAR* jid, TCHAR* nick, TCHAR *group ); HANDLE JabberDBCreateContact( TCHAR* jid, TCHAR* nick, BOOL temporary, BOOL stripResource ); void JabberGetAvatarFileName( HANDLE hContact, char* pszDest, int cbLen ); void JabberResolveTransportNicks( TCHAR* jid ); Index: jabber.rc =================================================================== --- jabber.rc (revision 5763) +++ jabber.rc (working copy) @@ -739,7 +739,24 @@ PUSHBUTTON "Cancel",IDCANCEL,85,35,50,14 END +IDD_OPT_MEEBO DIALOGEX 0, 0, 304, 228 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +EXSTYLE WS_EX_CONTROLPARENT +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX " Meebo specific options ",-1,8,3,290,56 + CONTROL "Automatically authorize all new contacts", + IDC_AUTO_AUTHORIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 16,17,273,10 + CONTROL "Always remove meebome contacts when they go offline", + IDC_ALWAYS_REMOVE_MEEBOME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,16,29,273,10 + CONTROL "Move meebome contacts to group:",IDC_MOVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,16,41,130,10 + EDITTEXT IDC_GROUP,150,40,139,12,ES_AUTOHSCROLL +END + ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO @@ -1002,6 +1019,15 @@ TOPMARGIN, 7 BOTTOMMARGIN, 49 END + + IDD_OPT_MEEBO, DIALOG + BEGIN + LEFTMARGIN, 8 + RIGHTMARGIN, 296 + VERTGUIDE, 9 + TOPMARGIN, 3 + BOTTOMMARGIN, 209 + END END #endif // APSTUDIO_INVOKED Index: jabber_iqid.cpp =================================================================== --- jabber_iqid.cpp (revision 5763) +++ jabber_iqid.cpp (working copy) @@ -359,8 +359,15 @@ if ( jid == NULL ) continue; + HANDLE hContact = JabberHContactFromJID( jid ); + + DBVARIANT dbNick; if (( name = JabberXmlGetAttrValue( itemNode, "name" )) != NULL ) nick = mir_tstrdup( name ); + else if ( hContact != NULL && !JGetStringT( hContact, "Nick", &dbNick )) { + nick = mir_tstrdup( dbNick.ptszVal ); + JFreeVariant( &dbNick ); + } else nick = JabberNickFromJID( jid ); @@ -393,7 +400,6 @@ XmlNode* groupNode = JabberXmlGetChild( itemNode, "group" ); replaceStr( item->group, ( groupNode ) ? groupNode->text : NULL ); - HANDLE hContact = JabberHContactFromJID( jid ); if ( hContact == NULL ) { // Received roster has a new JID. // Add the jid ( with empty resource ) to Miranda contact list. @@ -401,7 +407,6 @@ } if ( name != NULL ) { - DBVARIANT dbNick; if ( !JGetStringT( hContact, "Nick", &dbNick )) { if ( lstrcmp( nick, dbNick.ptszVal ) != 0 ) DBWriteContactSettingTString( hContact, "CList", "MyHandle", nick ); Index: jabber_misc.cpp =================================================================== --- jabber_misc.cpp (revision 5763) +++ jabber_misc.cpp (working copy) @@ -129,12 +129,65 @@ /////////////////////////////////////////////////////////////////////////////// // JabberDBAddAuthRequest() -void JabberDBAddAuthRequest( TCHAR* jid, TCHAR* nick ) +void JabberDBAddAuthRequest( TCHAR* jid, TCHAR* nick, TCHAR *group ) { + BOOL freeNick = FALSE; HANDLE hContact = JabberDBCreateContact( jid, NULL, FALSE, TRUE ); JDeleteSetting( hContact, "Hidden" ); - //JSetStringT( hContact, "Nick", nick ); + if ( nick != NULL ) + JSetStringT( hContact, "Nick", nick ); + + if ( group != NULL ) { + DBVARIANT dbv, dbv2; + if ( JGetByte( "MoveMeebomeContacts", FALSE ) && !JGetStringT( NULL, "MeebomeContactsGroup", &dbv ) ) { + TCHAR meebomeGroup[128]; + if ( !JGetStringT( NULL, "MeebomeDefaultGroup", &dbv2 ) ) { + lstrcpyn(meebomeGroup, dbv2.ptszVal, 128); + JFreeVariant( &dbv2 ); + } + else + lstrcpyn(meebomeGroup, _T("Site Chat"), 128); + + if ( lstrcmp(meebomeGroup, group) == 0 ) + DBWriteContactSettingTString( hContact, "CList", "Group", dbv.ptszVal ); + else + DBWriteContactSettingTString( hContact, "CList", "Group", group ); + + JFreeVariant( &dbv ); + } + else + DBWriteContactSettingTString( hContact, "CList", "Group", group ); + } + + // Auto add everyone + if ( JGetByte( "AutoAuthorize", TRUE ) ) { + JabberLog( "Send 'authorization allowed' to " TCHAR_STR_PARAM, jid ); + + XmlNode presence( "presence" ); presence.addAttr( "to", jid ); presence.addAttr( "type", "subscribed" ); + jabberThreadInfo->send( presence ); + + DBWriteContactSettingByte( hContact, "CList", "NotOnList", 1 ); + + // Automatically add this user to my roster if option is enabled + if ( JGetByte( "AutoAdd", TRUE ) == TRUE ) { + JABBER_LIST_ITEM *item; + + if (( item = JabberListGetItemPtr( LIST_ROSTER, jid )) == NULL || ( item->subscription != SUB_BOTH && item->subscription != SUB_TO )) { + JabberLog( "Try adding contact automatically jid = " TCHAR_STR_PARAM, jid ); + // Trigger actual add by removing the "NotOnList" added by AddToListByJID() + // See AddToListByJID() and JabberDbSettingChanged(). + DBDeleteContactSetting( hContact, "CList", "NotOnList" ); + } } + + return; + } + + if ( nick == NULL ) { + nick = JabberNickFromJID( jid ); + freeNick = TRUE; + } + #if defined( _UNICODE ) char* szJid = u2a( jid ); char* szNick = u2a( nick ); @@ -168,6 +221,9 @@ mir_free( szJid ); mir_free( szNick ); #endif + + if ( freeNick ) + mir_free( nick ); } /////////////////////////////////////////////////////////////////////////////// Index: jabber_opt.cpp =================================================================== --- jabber_opt.cpp (revision 5763) +++ jabber_opt.cpp (working copy) @@ -201,14 +201,14 @@ if ( !dbv.pszVal[0] ) enableRegister = FALSE; JFreeVariant( &dbv ); } - else SetDlgItemTextA( hwndDlg, IDC_EDIT_LOGIN_SERVER, "jabber.org" ); + else SetDlgItemTextA( hwndDlg, IDC_EDIT_LOGIN_SERVER, "meebo.org" ); WORD port = ( WORD )JGetWord( NULL, "Port", JABBER_DEFAULT_PORT ); SetDlgItemInt( hwndDlg, IDC_PORT, port, FALSE ); if ( port <= 0 ) enableRegister = FALSE; CheckDlgButton( hwndDlg, IDC_USE_SSL, JGetByte( "UseSSL", FALSE )); - CheckDlgButton( hwndDlg, IDC_USE_TLS, JGetByte( "UseTLS", FALSE )); + CheckDlgButton( hwndDlg, IDC_USE_TLS, JGetByte( "UseTLS", TRUE )); if ( !JabberSslInit() ) { EnableWindow(GetDlgItem( hwndDlg, IDC_USE_SSL ), FALSE ); EnableWindow(GetDlgItem( hwndDlg, IDC_USE_TLS ), FALSE ); @@ -241,7 +241,7 @@ SetDlgItemTextA( hwndDlg, IDC_JUD, dbv.pszVal ); JFreeVariant( &dbv ); } - else SetDlgItemTextA( hwndDlg, IDC_JUD, "users.jabber.org" ); + else SetDlgItemTextA( hwndDlg, IDC_JUD, "users.meebo.org" ); msgLangListBox = GetDlgItem( hwndDlg, IDC_MSGLANG ); TCHAR str[ 256 ]; @@ -606,7 +606,64 @@ return FALSE; } + ///////////////////////////////////////////////////////////////////////////////////////// +// MeeboOptDlgProc - meebo options dialog procedure + +static BOOL CALLBACK MeeboOptDlgProc( HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + switch ( msg ) { + case WM_INITDIALOG: + { + TranslateDialogDefault( hwndDlg ); + + CheckDlgButton( hwndDlg, IDC_AUTO_AUTHORIZE, JGetByte( "AutoAuthorize", TRUE )); + CheckDlgButton( hwndDlg, IDC_ALWAYS_REMOVE_MEEBOME, JGetByte( "AlwaysRemoveMeebome", TRUE )); + CheckDlgButton( hwndDlg, IDC_MOVE, JGetByte( "MoveMeebomeContacts", FALSE )); + + DBVARIANT dbv; + if ( !JGetStringT( NULL, "MeebomeContactsGroup", &dbv )) { + SetDlgItemText( hwndDlg, IDC_GROUP, dbv.ptszVal ); + JFreeVariant( &dbv ); + } + else if ( !JGetStringT( NULL, "MeebomeDefaultGroup", &dbv ) ) { + SetDlgItemText( hwndDlg, IDC_GROUP, dbv.ptszVal ); + JFreeVariant( &dbv ); + } + else + SetDlgItemText( hwndDlg, IDC_GROUP, _T("Site Chat") ); + SendDlgItemMessage(hwndDlg, IDC_GROUP, EM_LIMITTEXT, 256, 0); + + return TRUE; + } + case WM_COMMAND: + { + if (LOWORD(wParam) == IDC_GROUP) + if (HIWORD(wParam) != EN_CHANGE || (HWND)lParam != GetFocus()) + break; + + SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 ); + break; + } + case WM_NOTIFY: + if (( ( LPNMHDR ) lParam )->code == PSN_APPLY ) { + JSetByte( "AutoAuthorize", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_AUTO_AUTHORIZE )); + JSetByte( "AlwaysRemoveMeebome", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_ALWAYS_REMOVE_MEEBOME )); + JSetByte( "MoveMeebomeContacts", ( BYTE )IsDlgButtonChecked( hwndDlg, IDC_MOVE )); + + TCHAR tmp[1024]; + GetDlgItemText(hwndDlg, IDC_GROUP, tmp, 256); + JSetStringT( NULL, "MeebomeContactsGroup", tmp ); + + return TRUE; + } + break; + } + + return FALSE; +} + +///////////////////////////////////////////////////////////////////////////////////////// // JabberOptInit - initializes all options dialogs int JabberOptInit( WPARAM wParam, LPARAM lParam ) @@ -627,5 +684,10 @@ odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_JABBER2 ); odp.pfnDlgProc = JabberAdvOptDlgProc; JCallService( MS_OPT_ADDPAGE, wParam, ( LPARAM )&odp ); + + odp.pszTab = "Meebo"; + odp.pszTemplate = MAKEINTRESOURCEA( IDD_OPT_MEEBO ); + odp.pfnDlgProc = MeeboOptDlgProc; + JCallService( MS_OPT_ADDPAGE, wParam, ( LPARAM )&odp ); return 0; } Index: jabber_thread.cpp =================================================================== --- jabber_thread.cpp (revision 5763) +++ jabber_thread.cpp (working copy) @@ -1307,10 +1307,18 @@ JabberUpdateMirVer( hContact, &item->resource[r] ); } - if ( _tcschr( jid, '@' )!=NULL || JGetByte( "ShowTransport", TRUE )==TRUE ) + if ( _tcschr( jid, '@' )!=NULL || JGetByte( "ShowTransport", TRUE )==TRUE ) { if ( JGetWord( hContact, "Status", ID_STATUS_OFFLINE ) != status ) JSetWord( hContact, "Status", ( WORD )status ); + if ( status == ID_STATUS_OFFLINE && JGetByte( "AlwaysRemoveMeebome", TRUE ) ) { + DBVARIANT dbv; + if ( !JGetStringT( hContact, "MirVer", &dbv )) { + if ( lstrcmp( _T("meebome"), dbv.ptszVal ) == 0 ) { + JCallService( MS_DB_CONTACT_DELETE, ( WPARAM ) hContact, 0 ); + } } } } + + JabberMenuUpdateSrmmIcon( item ); } @@ -1462,12 +1470,11 @@ } else { XmlNode* n = JabberXmlGetChild( node, "nick" ); - nick = ( n == NULL ) ? JabberNickFromJID( from ) : mir_tstrdup( n->text ); - if ( nick != NULL ) { - JabberLog( TCHAR_STR_PARAM " ( " TCHAR_STR_PARAM " ) requests authorization", nick, from ); - JabberDBAddAuthRequest( from, nick ); - mir_free( nick ); - } } + nick = n->text; + p = JabberXmlGetAttrValue( node, "group" ); + JabberLog( TCHAR_STR_PARAM " ( " TCHAR_STR_PARAM " ) requests authorization", nick != NULL ? nick : _T("NULL"), from ); + JabberDBAddAuthRequest( from, nick, p ); + } return; } @@ -1548,7 +1555,7 @@ JGetMirandaProductText( sizeof( mproduct ), ( LPARAM )mproduct ); TCHAR* fullVer = (TCHAR*)alloca(1000 * sizeof( TCHAR )); - mir_sntprintf( fullVer, 1000, _T(TCHAR_STR_PARAM) _T(" ") _T(TCHAR_STR_PARAM) _T(" (Jabber v.") _T(TCHAR_STR_PARAM) _T(" [%s])") _T(TCHAR_STR_PARAM), + mir_sntprintf( fullVer, 1000, _T(TCHAR_STR_PARAM) _T(" ") _T(TCHAR_STR_PARAM) _T(" (JMeebo v.") _T(TCHAR_STR_PARAM) _T(" [%s])") _T(TCHAR_STR_PARAM), mproduct, mversion, __VERSION_STRING, jabberThreadInfo->resource, bSecureIM ? " (SecureIM)":"" ); XmlNodeIq iq( "result", idStr, from ); @@ -1813,9 +1820,14 @@ continue; // we will not add new account when subscription=remove + DBVARIANT dbnick; if ( !_tcscmp( str, _T("to")) || !_tcscmp( str, _T("both")) || !_tcscmp( str, _T("from")) || !_tcscmp( str, _T("none"))) { if (( name=JabberXmlGetAttrValue( itemNode, "name" )) != NULL ) nick = mir_tstrdup( name ); + else if ( !JGetStringT( hContact, "Nick", &dbnick )) { + nick = mir_tstrdup( dbnick.ptszVal ); + JFreeVariant( &dbnick ); + } else nick = JabberNickFromJID( jid ); @@ -1834,7 +1846,6 @@ else JSetStringT( hContact, "jid", jid ); if ( name != NULL ) { - DBVARIANT dbnick; if ( !JGetStringT( hContact, "Nick", &dbnick )) { if ( _tcscmp( nick, dbnick.ptszVal ) != 0 ) DBWriteContactSettingTString( hContact, "CList", "MyHandle", nick ); @@ -1867,7 +1878,11 @@ // remove, so that history will be retained. if ( !_tcscmp( str, _T("remove"))) { if (( hContact=JabberHContactFromJID( jid )) != NULL ) { - if ( JGetWord( hContact, "Status", ID_STATUS_OFFLINE ) != ID_STATUS_OFFLINE ) + DBVARIANT dbv = {0}; + if ( JGetByte( "AlwaysRemoveMeebome", TRUE ) && !JGetStringT( hContact, "MirVer", &dbv ) && lstrcmp( _T("meebome"), dbv.ptszVal ) == 0 ) { + JCallService( MS_DB_CONTACT_DELETE, ( WPARAM ) hContact, 0 ); + } + else if ( JGetWord( hContact, "Status", ID_STATUS_OFFLINE ) != ID_STATUS_OFFLINE ) JSetWord( hContact, "Status", ID_STATUS_OFFLINE ); JabberListRemove( LIST_ROSTER, jid ); } } Index: resource.h =================================================================== --- resource.h (revision 5763) +++ resource.h (working copy) @@ -239,6 +239,10 @@ #define IDC_COMBO_VALUE 1237 #define IDC_EDIT_NAME 1238 #define IDC_STATIC_LISTS_LABEL 1239 +#define IDC_AUTO_AUTHORIZE 1240 +#define IDC_ALWAYS_REMOVE_MEEBOME 1241 +#define IDC_MOVE 1242 +#define IDC_GROUP 1243 #define IDC_EMAILS 1306 #define IDC_PHONES 1308 #define IDC_UPDATE 1313 @@ -266,6 +270,7 @@ #define IDC_ROOM_RADIO 3009 #define IDD_PRIVACY_ADD_LIST 3009 #define IDC_AUTOJOIN_BOOKMARKS 3010 +#define IDD_OPT_MEEBO 3010 #define IDC_URL_RADIO 3011 #define IDC_AGENT_RADIO 3012 #define IDC_BOOKMARK_TYPE 3013 @@ -294,7 +299,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 190 #define _APS_NEXT_COMMAND_VALUE 40017 -#define _APS_NEXT_CONTROL_VALUE 1240 +#define _APS_NEXT_CONTROL_VALUE 1244 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif