int CJabberProto::OnContactDeleted( WPARAM wParam, LPARAM ) { if( !m_bJabberOnline ) // should never happen return 0; DBVARIANT dbv; if ( !JGetStringT(( HANDLE ) wParam, JGetByte( (HANDLE ) wParam, "ChatRoom", 0 )?(char*)"ChatRoomID":(char*)"jid", &dbv )) { if ( ListExist( LIST_ROSTER, dbv.ptszVal )) { if ( !_tcschr( dbv.ptszVal, _T( '@' ))) { TCHAR szStrippedJid[JABBER_MAX_JID_LEN]; JabberStripJid( m_ThreadInfo->fullJID, szStrippedJid, SIZEOF(szStrippedJid) ); TCHAR *szDog = _tcschr( szStrippedJid, _T('@')); if ( szDog && _tcsicmp( szDog + 1, dbv.ptszVal )) m_ThreadInfo->send( XmlNodeIq( _T("set"), SerialNext(), dbv.ptszVal ) << XQUERY( _T(JABBER_FEAT_REGISTER)) << XCHILD( _T("remove"))); } // Remove from roster, server also handles the presence unsubscription process. m_ThreadInfo->send( XmlNodeIq( _T("set"), SerialNext()) << XQUERY( _T(JABBER_FEAT_IQ_ROSTER)) << XCHILD( _T("item")) << XATTR( _T("jid"), dbv.ptszVal ) << XATTR( _T("subscription"), _T("remove"))); } JFreeVariant( &dbv ); } return 0; }
int JabberMenuTransportResolve( WPARAM wParam, LPARAM lParam ) { HANDLE hContact = ( HANDLE )wParam; if ( !JGetByte( hContact, "IsTransport", 0 )) return 0; DBVARIANT jid; if ( !JGetStringT( hContact, "jid", &jid )) { JabberResolveTransportNicks( jid.ptszVal ); JFreeVariant( &jid ); } return 0; }
int JabberMenuConvertChatContact( WPARAM wParam, LPARAM lParam ) { BYTE bIsChatRoom = (BYTE)JGetByte( (HANDLE ) wParam, "ChatRoom", 0 ); if ((bIsChatRoom == GCW_CHATROOM) || bIsChatRoom == 0 ) { DBVARIANT dbv; if ( !JGetStringT( (HANDLE ) wParam, (bIsChatRoom == GCW_CHATROOM)?(char*)"ChatRoomID":(char*)"jid", &dbv )) { JDeleteSetting( (HANDLE ) wParam, (bIsChatRoom == GCW_CHATROOM)?"ChatRoomID":"jid"); JSetStringT( (HANDLE ) wParam, (bIsChatRoom != GCW_CHATROOM)?"ChatRoomID":"jid", dbv.ptszVal); JFreeVariant( &dbv ); JSetByte((HANDLE ) wParam, "ChatRoom", (bIsChatRoom == GCW_CHATROOM)?0:GCW_CHATROOM); } } return 0; }
void JabberGetAvatarFileName( HANDLE hContact, char* pszDest, int cbLen ) { JCallService( MS_DB_GETPROFILEPATH, cbLen, LPARAM( pszDest )); int tPathLen = strlen( pszDest ); tPathLen += mir_snprintf( pszDest + tPathLen, MAX_PATH - tPathLen, "\\Jabber\\" ); CreateDirectoryA( pszDest, NULL ); char* szFileType; switch( JGetByte( hContact, "AvatarType", PA_FORMAT_PNG )) { case PA_FORMAT_JPEG: szFileType = "jpg"; break; case PA_FORMAT_GIF: szFileType = "gif"; break; case PA_FORMAT_BMP: szFileType = "bmp"; break; case PA_FORMAT_PNG: szFileType = "png"; break; default: szFileType = "bin"; } if ( hContact != NULL ) { char str[ 256 ]; DBVARIANT dbv; if ( !JGetStringUtf( hContact, "jid", &dbv )) { strncpy( str, dbv.pszVal, sizeof str ); str[ sizeof(str)-1 ] = 0; JFreeVariant( &dbv ); } else ltoa(( long )hContact, str, 10 ); char* hash = JabberSha1( str ); mir_snprintf( pszDest + tPathLen, MAX_PATH - tPathLen, "%s.%s", hash, szFileType ); mir_free( hash ); } else if ( jabberThreadInfo != NULL ) { mir_snprintf( pszDest + tPathLen, MAX_PATH - tPathLen, TCHAR_STR_PARAM"@%s avatar.%s", jabberThreadInfo->username, jabberThreadInfo->server, szFileType ); } else { DBVARIANT dbv1, dbv2; BOOL res1 = DBGetContactSetting( NULL, jabberProtoName, "LoginName", &dbv1 ); BOOL res2 = DBGetContactSetting( NULL, jabberProtoName, "LoginServer", &dbv2 ); mir_snprintf( pszDest + tPathLen, MAX_PATH - tPathLen, "%s@%s avatar.%s", res1 ? "noname" : dbv1.pszVal, res2 ? jabberProtoName : dbv2.pszVal, szFileType ); if (!res1) JFreeVariant( &dbv1 ); if (!res2) JFreeVariant( &dbv2 ); } }
void JabberGroupchatProcessInvite( TCHAR* roomJid, TCHAR* from, TCHAR* reason, TCHAR* password ) { if ( roomJid == NULL ) return; if ( JGetByte( "AutoAcceptMUC", FALSE ) == FALSE ) { JABBER_GROUPCHAT_INVITE_INFO* inviteInfo = ( JABBER_GROUPCHAT_INVITE_INFO * ) mir_alloc( sizeof( JABBER_GROUPCHAT_INVITE_INFO )); inviteInfo->roomJid = mir_tstrdup( roomJid ); inviteInfo->from = mir_tstrdup( from ); inviteInfo->reason = mir_tstrdup( reason ); inviteInfo->password = mir_tstrdup( password ); mir_forkthread(( pThreadFunc )JabberGroupchatInviteAcceptThread, inviteInfo ); } else { TCHAR* myNick = JabberNickFromJID( jabberJID ); JabberAcceptGroupchatInvite( roomJid, myNick, password ); mir_free( myNick ); } }
int JabberMenuRosterAdd( WPARAM wParam, LPARAM lParam ) { DBVARIANT dbv; if ( !wParam ) return 0; // we do not add ourself to the roster. (buggy situation - should not happen) if ( !JGetStringT( ( HANDLE ) wParam, "ChatRoomID", &dbv )) { TCHAR *roomID = mir_tstrdup(dbv.ptszVal); JFreeVariant( &dbv ); if ( JabberListGetItemPtr( LIST_ROSTER, roomID ) == NULL ) { TCHAR *nick = 0; TCHAR *group = 0; if ( !DBGetContactSettingTString( ( HANDLE ) wParam, "CList", "Group", &dbv ) ) { group = mir_tstrdup(dbv.ptszVal); JFreeVariant( &dbv ); } if ( !JGetStringT( ( HANDLE ) wParam, "Nick", &dbv ) ) { nick = mir_tstrdup(dbv.ptszVal); JFreeVariant( &dbv ); } JabberAddContactToRoster(roomID, nick, group, SUB_NONE); if ( JGetByte( "AddRoster2Bookmarks", TRUE ) == TRUE ) { JABBER_LIST_ITEM* item = NULL; item = JabberListGetItemPtr(LIST_BOOKMARK, roomID); if (!item) { item = ( JABBER_LIST_ITEM* )mir_alloc( sizeof( JABBER_LIST_ITEM )); ZeroMemory( item, sizeof( JABBER_LIST_ITEM )); item->jid = mir_tstrdup(roomID); item->name = mir_tstrdup(nick); if ( !JGetStringT( ( HANDLE ) wParam, "MyNick", &dbv ) ) { item->nick = mir_tstrdup(dbv.ptszVal); JFreeVariant( &dbv ); } JabberAddEditBookmark(NULL, (LPARAM) item); mir_free(item); } } if (nick) mir_free(nick); if (nick) mir_free(group); } mir_free(roomID); } return 0; }
void JabberResolveTransportNicks( TCHAR* jid ) { // Set all contacts to offline HANDLE hContact = jabberThreadInfo->resolveContact; if ( hContact == NULL ) hContact = ( HANDLE ) JCallService( MS_DB_CONTACT_FINDFIRST, 0, 0 ); for ( ; hContact != NULL; hContact = ( HANDLE )JCallService( MS_DB_CONTACT_FINDNEXT, ( WPARAM ) hContact, 0 )) { char* szProto = ( char* )JCallService( MS_PROTO_GETCONTACTBASEPROTO, ( WPARAM ) hContact, 0 ); if ( lstrcmpA( szProto, jabberProtoName )) continue; if ( !JGetByte( hContact, "IsTransported", 0 )) continue; DBVARIANT dbv, nick; if ( JGetStringT( hContact, "jid", &dbv )) continue; if ( JGetStringT( hContact, "Nick", &nick )) { JFreeVariant( &dbv ); continue; } TCHAR* p = _tcschr( dbv.ptszVal, '@' ); if ( p ) { *p = 0; if ( !lstrcmp( jid, p+1 ) && !lstrcmp( dbv.ptszVal, nick.ptszVal )) { *p = '@'; jabberThreadInfo->resolveID = JabberSendGetVcard( dbv.ptszVal ); jabberThreadInfo->resolveContact = hContact; JFreeVariant( &dbv ); JFreeVariant( &nick ); return; } } JFreeVariant( &dbv ); JFreeVariant( &nick ); } jabberThreadInfo->resolveID = -1; jabberThreadInfo->resolveContact = NULL; }
int JabberMenuTransportLogin( WPARAM wParam, LPARAM lParam ) { HANDLE hContact = ( HANDLE )wParam; if ( !JGetByte( hContact, "IsTransport", 0 )) return 0; DBVARIANT jid; if ( JGetStringT( hContact, "jid", &jid )) return 0; JABBER_LIST_ITEM* item = JabberListGetItemPtr( LIST_ROSTER, jid.ptszVal ); if ( item != NULL ) { XmlNode p( "presence" ); p.addAttr( "to", item->jid ); if ( item->status == ID_STATUS_ONLINE ) p.addAttr( "type", "unavailable" ); JabberSend( jabberThreadInfo->s, p ); } JFreeVariant( &jid ); return 0; }
int JGetAdvancedStatusIcon(WPARAM wParam, LPARAM lParam) { HANDLE hContact=(HANDLE) wParam; DBVARIANT dbv={0}; char * Transport=NULL; int res=-1; int iID=-1; if (!hContact) return -1; if (!JGetByte(hContact,"IsTransported",0)) return -1; if (JGetStringUtf(hContact,"Transport",&dbv)) return -1; iID=GetTransportProtoID(dbv.pszVal); if (iID>=0) { WORD Status=ID_STATUS_OFFLINE; Status = JGetWord(hContact,"Status",ID_STATUS_OFFLINE); if (Status<ID_STATUS_OFFLINE) Status = ID_STATUS_OFFLINE; else if (Status>ID_STATUS_INVISIBLE) Status = ID_STATUS_ONLINE; res = GetTransportStatusIconIndex(iID,Status); } DBFreeVariant(&dbv); return res; }
int JabberMenuPrebuildContactMenu( WPARAM wParam, LPARAM lParam ) { sttEnableMenuItem( hMenuRequestAuth, FALSE ); sttEnableMenuItem( hMenuGrantAuth, FALSE ); sttEnableMenuItem( hMenuRevokeAuth, FALSE ); sttEnableMenuItem( hMenuJoinLeave, FALSE ); sttEnableMenuItem( hMenuCommands, FALSE ); sttEnableMenuItem( hMenuConvert, FALSE ); sttEnableMenuItem( hMenuRosterAdd, FALSE ); sttEnableMenuItem( hMenuLogin, FALSE ); sttEnableMenuItem( hMenuVisitGMail, FALSE ); sttEnableMenuItem( hMenuRefresh, FALSE ); sttEnableMenuItem( hMenuAddBookmark, FALSE ); HANDLE hContact; if (( hContact=( HANDLE )wParam ) == NULL ) return 0; else { DBVARIANT dbv; if ( !JGetStringT( hContact, "FakeContact", &dbv )) { if (!_tcsicmp( dbv.ptszVal, _T("GMAIL"))){ sttEnableMenuItem( hMenuVisitGMail, TRUE ); return 0; } JFreeVariant( &dbv ); } } BYTE bIsChatRoom = (BYTE)JGetByte( hContact, "ChatRoom", 0 ); BYTE bIsTransport = (BYTE)JGetByte( hContact, "IsTransport", 0 ); if ((bIsChatRoom == GCW_CHATROOM) || bIsChatRoom == 0 ) { DBVARIANT dbv; if ( !JGetStringT( hContact, bIsChatRoom?(char*)"ChatRoomID":(char*)"jid", &dbv )) { JFreeVariant( &dbv ); CLISTMENUITEM clmi = { 0 }; sttEnableMenuItem( hMenuConvert, TRUE ); clmi.cbSize = sizeof( clmi ); clmi.pszName = (char *)(bIsChatRoom ? "&Convert to Contact" : "&Convert to Chat Room"); clmi.flags = CMIM_NAME | CMIM_FLAGS; JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuConvert, ( LPARAM )&clmi ); } } if (!jabberOnline) return 0; if ( bIsChatRoom ) { DBVARIANT dbv; if ( !JGetStringT( hContact, "ChatRoomID", &dbv )) { if ( JabberListGetItemPtr( LIST_ROSTER, dbv.ptszVal ) == NULL ) sttEnableMenuItem( hMenuRosterAdd, TRUE ); if ( JabberListGetItemPtr( LIST_BOOKMARK, dbv.ptszVal ) == NULL ) if ( jabberThreadInfo && jabberThreadInfo->caps & CAPS_BOOKMARK ) sttEnableMenuItem( hMenuAddBookmark, TRUE ); JFreeVariant( &dbv ); } } if ( bIsChatRoom == GCW_CHATROOM ) { CLISTMENUITEM clmi = { 0 }; clmi.cbSize = sizeof( clmi ); clmi.pszName = (char *)(( JGetWord( hContact, "Status", 0 ) == ID_STATUS_ONLINE ) ? "&Leave" : "&Join"); clmi.flags = CMIM_NAME | CMIM_FLAGS; JCallService( MS_CLIST_MODIFYMENUITEM, ( WPARAM )hMenuJoinLeave, ( LPARAM )&clmi ); return 0; } if ( bIsTransport ) { sttEnableMenuItem( hMenuLogin, TRUE ); sttEnableMenuItem( hMenuRefresh, TRUE ); } DBVARIANT dbv; if ( !JGetStringT( hContact, "jid", &dbv )) { JABBER_LIST_ITEM * item; item=JabberListGetItemPtr( LIST_ROSTER, dbv.ptszVal ); if ( !bIsTransport || (( item != NULL ) && (item->cap & AGENT_CAP_ADHOC) ) ) { sttEnableMenuItem( hMenuCommands, TRUE ); } else sttEnableMenuItem( hMenuCommands, FALSE ); JFreeVariant( &dbv ); } if ( !JGetStringT( hContact, "jid", &dbv )) { JABBER_LIST_ITEM* item = JabberListGetItemPtr( LIST_ROSTER, dbv.ptszVal ); JFreeVariant( &dbv ); if ( item != NULL ) { BOOL bCtrlPressed = ( GetKeyState( VK_CONTROL)&0x8000 ) != 0; sttEnableMenuItem( hMenuRequestAuth, item->subscription == SUB_FROM || item->subscription == SUB_NONE || bCtrlPressed ); sttEnableMenuItem( hMenuGrantAuth, item->subscription == SUB_TO || item->subscription == SUB_NONE || bCtrlPressed ); sttEnableMenuItem( hMenuRevokeAuth, item->subscription == SUB_FROM || item->subscription == SUB_BOTH || bCtrlPressed ); sttEnableMenuItem( hMenuCommands, (!bIsChatRoom && (!bIsTransport || (item->cap & AGENT_CAP_ADHOC))) ); return 0; } } return 0; }