summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/msn/msnaccount.cpp
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2014-03-29 00:54:51 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2014-03-29 00:54:51 +0900
commit0486034738b850c210b1389a8c3ae51a6b9fad23 (patch)
treeb1e3a4dbf9673b5e0031e8225e88f5dd490585a5 /kopete/protocols/msn/msnaccount.cpp
parent4bd7620e88d450995b78c201f9e7d9181f62ea6a (diff)
downloadtdenetwork-0486034738b850c210b1389a8c3ae51a6b9fad23.tar.gz
tdenetwork-0486034738b850c210b1389a8c3ae51a6b9fad23.zip
Removed MSN support across Kopete by removing the MSN protocol and the netmeeting plugin.
This resolves bug 1547.
Diffstat (limited to 'kopete/protocols/msn/msnaccount.cpp')
-rw-r--r--kopete/protocols/msn/msnaccount.cpp1499
1 files changed, 0 insertions, 1499 deletions
diff --git a/kopete/protocols/msn/msnaccount.cpp b/kopete/protocols/msn/msnaccount.cpp
deleted file mode 100644
index c987bf1d..00000000
--- a/kopete/protocols/msn/msnaccount.cpp
+++ /dev/null
@@ -1,1499 +0,0 @@
-/*
- msnaccount.h - Manages a single MSN account
-
- Copyright (c) 2003-2005 by Olivier Goffart <ogoffart@ kde.org>
- Copyright (c) 2003 by Martijn Klingens <klingens@kde.org>
- Copyright (c) 2005 by Michaƫl Larouche <michael.larouche@kdemail.net>
-
- Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org>
-
- *************************************************************************
- * *
- * 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. *
- * *
- *************************************************************************
-*/
-
-#include "msnaccount.h"
-
-#include <config.h>
-
-#include <tdeaction.h>
-#include <tdeconfig.h>
-#include <kdebug.h>
-#include <kinputdialog.h>
-#include <tdemessagebox.h>
-#include <tdepopupmenu.h>
-#include <kstandarddirs.h>
-#include <kmdcodec.h>
-#include <tdelocale.h>
-
-#include <tqfile.h>
-#include <tqregexp.h>
-#include <tqvalidator.h>
-#include <tqimage.h>
-
-#include "msncontact.h"
-#include "msnnotifysocket.h"
-#include "msnchatsession.h"
-#include "kopetecontactlist.h"
-#include "kopetegroup.h"
-#include "kopetemetacontact.h"
-#include "kopetepassword.h"
-#include "kopeteuiglobal.h"
-#include "kopeteglobal.h"
-#include "kopetechatsessionmanager.h"
-#include "contactaddednotifydialog.h"
-#include "kopeteutils.h"
-
-#include "sha1.h"
-
-
-#if !defined NDEBUG
-#include "msndebugrawcmddlg.h"
-#include <tdeglobal.h>
-#endif
-
-#if MSN_WEBCAM
-#include "avdevice/videodevicepool.h"
-#endif
-
-MSNAccount::MSNAccount( MSNProtocol *parent, const TQString& AccountID, const char *name )
- : Kopete::PasswordedAccount ( parent, AccountID.lower(), 0, name )
-{
- m_notifySocket = 0L;
- m_connectstatus = MSNProtocol::protocol()->NLN;
- m_addWizard_metaContact = 0L;
- m_newContactList=false;
-
- // Init the myself contact
- setMyself( new MSNContact( this, accountId(), Kopete::ContactList::self()->myself() ) );
- //myself()->setOnlineStatus( MSNProtocol::protocol()->FLN );
-
- TQObject::connect( Kopete::ContactList::self(), TQT_SIGNAL( groupRenamed( Kopete::Group *, const TQString & ) ),
- TQT_SLOT( slotKopeteGroupRenamed( Kopete::Group * ) ) );
- TQObject::connect( Kopete::ContactList::self(), TQT_SIGNAL( groupRemoved( Kopete::Group * ) ),
- TQT_SLOT( slotKopeteGroupRemoved( Kopete::Group * ) ) );
-
- TQObject::connect( Kopete::ContactList::self(), TQT_SIGNAL( globalIdentityChanged(const TQString&, const TQVariant& ) ), TQT_SLOT( slotGlobalIdentityChanged(const TQString&, const TQVariant& ) ));
-
- m_openInboxAction = new TDEAction( i18n( "Open Inbo&x..." ), "mail_generic", 0, this, TQT_SLOT( slotOpenInbox() ), this, "m_openInboxAction" );
- m_changeDNAction = new TDEAction( i18n( "&Change Display Name..." ), TQString(), 0, this, TQT_SLOT( slotChangePublicName() ), this, "renameAction" );
- m_startChatAction = new TDEAction( i18n( "&Start Chat..." ), "mail_generic", 0, this, TQT_SLOT( slotStartChat() ), this, "startChatAction" );
-
-
- TDEConfigGroup *config=configGroup();
-
- m_blockList = config->readListEntry( "blockList" ) ;
- m_allowList = config->readListEntry( "allowList" ) ;
- m_reverseList = config->readListEntry( "reverseList" ) ;
-
- // Load the avatar
- m_pictureFilename = locateLocal( "appdata", "msnpicture-"+ accountId().lower().replace(TQRegExp("[./~]"),"-") +".png" );
- resetPictureObject(true);
-
- static_cast<MSNContact *>( myself() )->setInfo( "PHH", config->readEntry("PHH") );
- static_cast<MSNContact *>( myself() )->setInfo( "PHM", config->readEntry("PHM") );
- static_cast<MSNContact *>( myself() )->setInfo( "PHW", config->readEntry("PHW") );
- //this is the display name
- static_cast<MSNContact *>( myself() )->setInfo( "MFN", config->readEntry("MFN") );
-
- //construct the group list
- //Before 2003-11-14 the MSN server allowed us to download the group list without downloading the whole contactlist, but it's not possible anymore
- TQPtrList<Kopete::Group> groupList = Kopete::ContactList::self()->groups();
- for ( Kopete::Group *g = groupList.first(); g; g = groupList.next() )
- {
- TQString groupGuid=g->pluginData( protocol(), accountId() + " id" );
- if ( !groupGuid.isEmpty() )
- m_groupList.insert( groupGuid , g );
- }
-
- // Set the client Id for the myself contact. It sets what MSN feature we support.
- m_clientId = MSNProtocol::MSNC4 | MSNProtocol::InkFormatGIF | MSNProtocol::SupportMultiPacketMessaging;
-
-#if MSN_WEBCAM
- Kopete::AV::VideoDevicePool::self()->scanDevices();
- if( Kopete::AV::VideoDevicePool::self()->hasDevices() )
- {
- m_clientId |= MSNProtocol::SupportWebcam;
- }
-#endif
-}
-
-
-TQString MSNAccount::serverName()
-{
- return configGroup()->readEntry( "serverName" , "messenger.hotmail.com" );
-}
-
-uint MSNAccount::serverPort()
-{
- return configGroup()->readNumEntry( "serverPort" , 1863 );
-}
-
-bool MSNAccount::useHttpMethod() const
-{
- return configGroup()->readBoolEntry( "useHttpMethod" , false );
-}
-
-TQString MSNAccount::myselfClientId() const
-{
- return TQString::number(m_clientId, 10);
-}
-
-void MSNAccount::connectWithPassword( const TQString &passwd )
-{
- m_newContactList=false;
- if ( isConnected() )
- {
- kdDebug( 14140 ) << k_funcinfo <<"Ignoring Connect request "
- << "(Already Connected)" << endl;
- return;
- }
-
- if ( m_notifySocket )
- {
- kdDebug( 14140 ) << k_funcinfo <<"Ignoring Connect request (Already connecting)" << endl;
- return;
- }
-
- m_password = passwd;
-
- if ( m_password.isNull() )
- {
- kdDebug( 14140 ) << k_funcinfo <<"Abort connection (null password)" << endl;
- return;
- }
-
-
- if ( contacts().count() <= 1 )
- {
- // Maybe the contactlist.xml has been removed, and the serial number not updated
- // ( the 1 is for the myself contact )
- configGroup()->writeEntry( "serial", 0 );
- }
-
- m_openInboxAction->setEnabled( false );
-
- createNotificationServer(serverName(), serverPort());
-}
-
-void MSNAccount::createNotificationServer( const TQString &host, uint port )
-{
- if(m_notifySocket) //we are switching from one to another notifysocket.
- {
- //remove every slots to that socket, so we won't delete receive signals
- // from the old socket thinking they are from the new one
- TQObject::disconnect( m_notifySocket , 0, this, 0 );
- m_notifySocket->deleteLater(); //be sure it will be deleted
- m_notifySocket=0L;
- }
-
- m_msgHandle.clear();
-
- myself()->setOnlineStatus( MSNProtocol::protocol()->CNT );
-
-
- m_notifySocket = new MSNNotifySocket( this, accountId() , m_password);
- m_notifySocket->setUseHttpMethod( useHttpMethod() );
-
- TQObject::connect( m_notifySocket, TQT_SIGNAL( groupAdded( const TQString&, const TQString& ) ),
- TQT_SLOT( slotGroupAdded( const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( groupRenamed( const TQString&, const TQString& ) ),
- TQT_SLOT( slotGroupRenamed( const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( groupListed( const TQString&, const TQString& ) ),
- TQT_SLOT( slotGroupAdded( const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( groupRemoved( const TQString& ) ),
- TQT_SLOT( slotGroupRemoved( const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( contactList(const TQString&, const TQString&, const TQString&, uint, const TQString& ) ),
- TQT_SLOT( slotContactListed(const TQString&, const TQString&, const TQString&, uint, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL(contactAdded(const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ),
- TQT_SLOT( slotContactAdded(const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( contactRemoved(const TQString&, const TQString&, const TQString&, const TQString& ) ),
- TQT_SLOT( slotContactRemoved(const TQString&, const TQString&, const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( statusChanged( const Kopete::OnlineStatus & ) ),
- TQT_SLOT( slotStatusChanged( const Kopete::OnlineStatus & ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( invitedToChat( const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ),
- TQT_SLOT( slotCreateChat( const TQString&, const TQString&, const TQString&, const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( startChat( const TQString&, const TQString& ) ),
- TQT_SLOT( slotCreateChat( const TQString&, const TQString& ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( socketClosed() ),
- TQT_SLOT( slotNotifySocketClosed() ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( newContactList() ),
- TQT_SLOT( slotNewContactList() ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( receivedNotificationServer(const TQString&, uint ) ),
- TQT_SLOT(createNotificationServer(const TQString&, uint ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( hotmailSeted( bool ) ),
- m_openInboxAction, TQT_SLOT( setEnabled( bool ) ) );
- TQObject::connect( m_notifySocket, TQT_SIGNAL( errorMessage(int, const TQString& ) ),
- TQT_SLOT( slotErrorMessageReceived(int, const TQString& ) ) );
-
- m_notifySocket->setStatus( m_connectstatus );
- m_notifySocket->connect(host, port);
-}
-
-void MSNAccount::disconnect()
-{
- if ( m_notifySocket )
- m_notifySocket->disconnect();
-}
-
-TDEActionMenu * MSNAccount::actionMenu()
-{
- TDEActionMenu *m_actionMenu=Kopete::Account::actionMenu();
- if ( isConnected() )
- {
- m_openInboxAction->setEnabled( true );
- m_startChatAction->setEnabled( true );
- m_changeDNAction->setEnabled( true );
- }
- else
- {
- m_openInboxAction->setEnabled( false );
- m_startChatAction->setEnabled( false );
- m_changeDNAction->setEnabled( false );
- }
-
- m_actionMenu->popupMenu()->insertSeparator();
-
- m_actionMenu->insert( m_changeDNAction );
- m_actionMenu->insert( m_startChatAction );
-
-// m_actionMenu->popupMenu()->insertSeparator();
-
- m_actionMenu->insert( m_openInboxAction );
-
-#if !defined NDEBUG
- TDEActionMenu *debugMenu = new TDEActionMenu( "Debug", m_actionMenu );
- debugMenu->insert( new TDEAction( i18n( "Send Raw C&ommand..." ), 0,
- this, TQT_SLOT( slotDebugRawCommand() ), debugMenu, "m_debugRawCommand" ) );
- m_actionMenu->popupMenu()->insertSeparator();
- m_actionMenu->insert( debugMenu );
-#endif
-
- return m_actionMenu;
-}
-
-MSNNotifySocket *MSNAccount::notifySocket()
-{
- return m_notifySocket;
-}
-
-
-void MSNAccount::setOnlineStatus( const Kopete::OnlineStatus &status , const TQString &reason)
-{
- kdDebug( 14140 ) << k_funcinfo << status.description() << endl;
-
- // HACK: When changing song, do don't anything while connected
- if( reason.contains("[Music]") && ( status == MSNProtocol::protocol()->UNK || status == MSNProtocol::protocol()->CNT ) )
- return;
-
- // Only send personal message when logged.
- if( m_notifySocket && m_notifySocket->isLogged() )
- {
- // Only update the personal/status message, don't change the online status
- // since it's the same.
- if( reason.contains("[Music]") )
- {
- TQString personalMessage = reason.section("[Music]", 1);
- setPersonalMessage( MSNProtocol::PersonalMessageMusic, personalMessage );
-
- // Don't send un-needed status change.
- return;
- }
- else
- {
- setPersonalMessage( MSNProtocol::PersonalMessageNormal, reason );
- }
- }
-
- if(status.status()== Kopete::OnlineStatus::Offline)
- disconnect();
- else if ( m_notifySocket )
- {
- m_notifySocket->setStatus( status );
- }
- else
- {
- m_connectstatus = status;
- connect();
- }
-
-
-}
-
-void MSNAccount::slotStartChat()
-{
-
- bool ok;
- TQString handle = KInputDialog::getText( i18n( "Start Chat - MSN Plugin" ),
- i18n( "Please enter the email address of the person with whom you want to chat:" ), TQString(), &ok ).lower();
- if ( ok )
- {
- if ( MSNProtocol::validContactId( handle ) )
- {
- if ( !contacts()[ handle ] )
- addContact( handle, handle, 0L, Kopete::Account::Temporary );
-
- contacts()[ handle ]->execute();
- }
- else
- {
- KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry,
- i18n( "<qt>You must enter a valid email address.</qt>" ), i18n( "MSN Plugin" ) );
- }
- }
-}
-
-void MSNAccount::slotDebugRawCommand()
-{
-#if !defined NDEBUG
- if ( !isConnected() )
- return;
-
- MSNDebugRawCmdDlg *dlg = new MSNDebugRawCmdDlg( 0L );
- int result = dlg->exec();
- if ( result == TQDialog::Accepted && m_notifySocket )
- {
- m_notifySocket->sendCommand( dlg->command(), dlg->params(),
- dlg->addId(), dlg->msg().replace( "\n", "\r\n" ).utf8() );
- }
- delete dlg;
-#endif
-}
-
-void MSNAccount::slotChangePublicName()
-{
- if ( !isConnected() )
- {
- return;
- //TODO: change it anyway, and sync at the next connection
- }
-
- bool ok;
- TQString name = KInputDialog::getText( i18n( "Change Display Name - MSN Plugin" ),
- i18n( "Enter the new display name by which you want to be visible to your friends on MSN:" ),
- myself()->property( Kopete::Global::Properties::self()->nickName()).value().toString(), &ok );
-
- if ( ok )
- {
- if ( name.length() > 387 )
- {
- KMessageBox::error( Kopete::UI::Global::mainWidget(),
- i18n( "<qt>The display name you entered is too long. Please use a shorter name.\n"
- "Your display name has <b>not</b> been changed.</qt>" ),
- i18n( "Change Display Name - MSN Plugin" ) );
- return;
- }
-
- setPublicName( name );
- }
-}
-
-
-void MSNAccount::slotOpenInbox()
-{
- if ( m_notifySocket )
- m_notifySocket->slotOpenInbox();
-}
-
-
-void MSNAccount::slotNotifySocketClosed()
-{
- kdDebug( 14140 ) << k_funcinfo << endl;
-
- Kopete::Account::DisconnectReason reason=(Kopete::Account::DisconnectReason)(m_notifySocket->disconnectReason());
- m_notifySocket->deleteLater();
- m_notifySocket = 0l;
- myself()->setOnlineStatus( MSNProtocol::protocol()->FLN );
- setAllContactsStatus( MSNProtocol::protocol()->FLN );
- disconnected(reason);
-
-
- if(reason == Kopete::Account::OtherClient)
- { //close all chat sessions, so new message will arive to the other client.
-
- TQValueList<Kopete::ChatSession*> sessions = Kopete::ChatSessionManager::self()->sessions();
- TQValueList<Kopete::ChatSession*>::Iterator it;
- for (it=sessions.begin() ; it != sessions.end() ; it++ )
- {
- MSNChatSession *msnCS = dynamic_cast<MSNChatSession *>( *it );
- if ( msnCS && msnCS->account() == this )
- {
- msnCS->slotCloseSession();
- }
- }
- }
-
-#if 0
- else if ( state == 0x10 ) // connection died unexpectedly
- {
- KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Error , i18n( "The connection with the MSN server was lost unexpectedly.\n"
- "If you cannot reconnect now, the server might be down. In that case, please try again later." ),
- i18n( "Connection Lost - MSN Plugin" ), KMessageBox::Notify );
- }
-#endif
- m_msgHandle.clear();
- // kdDebug( 14140 ) << "MSNAccount::slotNotifySocketClosed - done" << endl;
-}
-
-void MSNAccount::slotStatusChanged( const Kopete::OnlineStatus &status )
-{
-// kdDebug( 14140 ) << k_funcinfo << status.internalStatus() << endl;
- myself()->setOnlineStatus( status );
-
- if(m_newContactList)
- {
- m_newContactList=false;
-
- TQDictIterator<Kopete::Contact> it( contacts() );
- for ( ; it.current(); ++it )
- {
- MSNContact *c = static_cast<MSNContact *>( *it );
- if(c && c->isDeleted() && c->metaContact() && !c->metaContact()->isTemporary() && c!=myself())
- {
- if(c->serverGroups().isEmpty())
- { //the contact is new, add it on the server
- c->setOnlineStatus( MSNProtocol::protocol()->FLN );
- addContactServerside( c->contactId() , c->metaContact()->groups() );
- }
- else //the contact had been deleted, remove it.
- {
- c->deleteLater();
- }
- }
- }
- }
-}
-
-
-void MSNAccount::slotPersonalMessageChanged( const TQString& personalMessage )
-{
- TQString oldPersonalMessage=myself()->property(MSNProtocol::protocol()->propPersonalMessage).value().toString() ;
- if ( personalMessage != oldPersonalMessage )
- {
- myself()->setProperty( MSNProtocol::protocol()->propPersonalMessage, personalMessage );
- configGroup()->writeEntry( "personalMessage" , personalMessage );
- }
-}
-
-void MSNAccount::setPublicName( const TQString &publicName )
-{
- if ( m_notifySocket )
- {
- m_notifySocket->changePublicName( publicName, TQString() );
- }
-}
-
-void MSNAccount::setPersonalMessage( MSNProtocol::PersonalMessageType type, const TQString &personalMessage )
-{
- if ( m_notifySocket )
- {
- m_notifySocket->changePersonalMessage( type, personalMessage );
- }
- /* Eh, if we can't change the display name, don't let make the user think it has changed
- else if(type == MSNProtocol::PersonalMessageNormal) // Normal personalMessage, not a dynamic one that need formatting.
- {
- slotPersonalMessageChanged( personalMessage );
- }*/
-}
-
-void MSNAccount::slotGroupAdded( const TQString& groupName, const TQString &groupGuid )
-{
- if ( m_groupList.contains( groupGuid ) )
- {
- // Group can already be in the list since the idle timer does a 'List Groups'
- // command. Simply return, don't issue a warning.
- // kdDebug( 14140 ) << k_funcinfo << "Group " << groupName << " already in list, skipped." << endl;
- return;
- }
-
- //--------- Find the appropriate Kopete::Group, or create one ---------//
- TQPtrList<Kopete::Group> groupList = Kopete::ContactList::self()->groups();
- Kopete::Group *fallBack = 0L;
-
- //check if we have one in the old group list. if yes, update the id translate map.
- for(TQMap<TQString, Kopete::Group*>::Iterator it=m_oldGroupList.begin() ; it != m_oldGroupList.end() ; ++it )
- {
- Kopete::Group *g=it.data();
- if (g && g->pluginData( protocol(), accountId() + " displayName" ) == groupName &&
- g->pluginData( protocol(), accountId() + " id" ).isEmpty() )
- { //it has the same name! we got it. (and it is not yet an msn group)
- fallBack=g;
- /*if ( g->displayName() != groupName )
- {
- // The displayName was changed in Kopete while we were offline
- // FIXME: update the server right now
- }*/
- break;
- }
- }
-
- if(!fallBack)
- {
- //it's certenly a new group ! search if one already exist with the same displayname.
- for ( Kopete::Group *g = groupList.first(); g; g = groupList.next() )
- {
- /* --This has been replaced by the loop right before.
- if ( !g->pluginData( protocol(), accountId() + " id" ).isEmpty() )
- {
- if ( g->pluginData( protocol(), accountId() + " id" ).toUInt() == groupNumber )
- {
- m_groupList.insert( groupNumber, g );
- TQString oldGroupName;
- if ( g->pluginData( protocol(), accountId() + " displayName" ) != groupName )
- {
- // The displayName of the group has been modified by another client
- slotGroupRenamed( groupName, groupNumber );
- }
- return;
- }
- }
- else {*/
- if ( g->displayName() == groupName && (groupGuid.isEmpty()|| g->type()==Kopete::Group::Normal) &&
- g->pluginData( protocol(), accountId() + " id" ).isEmpty() )
- {
- fallBack = g;
- kdDebug( 14140 ) << k_funcinfo << "We didn't found the group " << groupName <<" in the old MSN group. But kopete has already one with the same name." << endl;
- break;
- }
- }
- }
-
- if ( !fallBack )
- {
- if( groupGuid.isEmpty() )
- { // The group #0 is an unremovable group. his default name is "~" ,
- // but the official client rename it i18n("others contact") at the first
- // connection.
- // In many case, the users don't use that group as a real group, or just as
- // a group to put all contact that are not sorted.
- fallBack = Kopete::Group::topLevel();
- }
- else
- {
- fallBack = new Kopete::Group( groupName );
- Kopete::ContactList::self()->addGroup( fallBack );
- kdDebug( 14140 ) << k_funcinfo << "We didn't found the group " << groupName <<" So we're creating a new one." << endl;
-
- }
- }
-
- fallBack->setPluginData( protocol(), accountId() + " id", groupGuid );
- fallBack->setPluginData( protocol(), accountId() + " displayName", groupName );
- m_groupList.insert( groupGuid, fallBack );
-
- // We have pending groups that we need add a contact to
- if ( tmp_addToNewGroup.contains(groupName) )
- {
- TQStringList list=tmp_addToNewGroup[groupName];
- for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it )
- {
- TQString contactId = *it;
- kdDebug( 14140 ) << k_funcinfo << "Adding to new group: " << contactId << endl;
- MSNContact *c = static_cast<MSNContact *>(contacts()[contactId]);
- if(c && c->hasProperty(MSNProtocol::protocol()->propGuid.key()) )
- notifySocket()->addContact( contactId, MSNProtocol::FL, TQString(), c->guid(), groupGuid );
- else
- {
- // If we get to here, we're currently adding a new contact, add the groupGUID to the groupList
- // to add when contact will be added to contactlist.
- if( tmp_addNewContactToGroup.contains( contactId ) )
- tmp_addNewContactToGroup[contactId].append(groupGuid);
- else
- tmp_addNewContactToGroup.insert(contactId, TQStringList(groupGuid) );
- }
- }
- tmp_addToNewGroup.remove(groupName);
- }
-}
-
-void MSNAccount::slotGroupRenamed( const TQString &groupGuid, const TQString& groupName )
-{
- if ( m_groupList.contains( groupGuid ) )
- {
- m_groupList[ groupGuid ]->setPluginData( protocol(), accountId() + " id", groupGuid );
- m_groupList[ groupGuid ]->setPluginData( protocol(), accountId() + " displayName", groupName );
- m_groupList[ groupGuid ]->setDisplayName( groupName );
- }
- else
- {
- slotGroupAdded( groupName, groupGuid );
- }
-}
-
-void MSNAccount::slotGroupRemoved( const TQString& groupGuid )
-{
- if ( m_groupList.contains( groupGuid ) )
- {
- m_groupList[ groupGuid ]->setPluginData( protocol(), TQMap<TQString,TQString>() );
- m_groupList.remove( groupGuid );
- }
-}
-
-void MSNAccount::addGroup( const TQString &groupName, const TQString& contactToAdd )
-{
- if ( !contactToAdd.isNull() )
- {
- if( tmp_addToNewGroup.contains(groupName) )
- {
- tmp_addToNewGroup[groupName].append(contactToAdd);
- //A group with the same name is about to be added,
- // we don't need to add a second group with the same name
- kdDebug( 14140 ) << k_funcinfo << "no need to re-add " << groupName << " for " << contactToAdd << endl;
- return;
- }
- else
- {
- tmp_addToNewGroup.insert(groupName,TQStringList(contactToAdd));
- kdDebug( 14140 ) << k_funcinfo << "preparing to add " << groupName << " for " << contactToAdd << endl;
- }
- }
-
- if ( m_notifySocket )
- m_notifySocket->addGroup( groupName );
-
-}
-
-void MSNAccount::slotKopeteGroupRenamed( Kopete::Group *g )
-{
- if ( notifySocket() && g->type() == Kopete::Group::Normal )
- {
- if ( !g->pluginData( protocol(), accountId() + " id" ).isEmpty() &&
- g->displayName() != g->pluginData( protocol(), accountId() + " displayName" ) &&
- m_groupList.contains( g->pluginData( protocol(), accountId() + " id" ) ) )
- {
- notifySocket()->renameGroup( g->displayName(), g->pluginData( protocol(), accountId() + " id" ) );
- }
- }
-}
-
-void MSNAccount::slotKopeteGroupRemoved( Kopete::Group *g )
-{
- //The old gorup list is only used whe syncing the contactlist.
- //We can assume the contactlist is already fully synced at this time.
- //The group g is maybe in the oldGroupList. We remove everithing since
- //we don't need it anymore, no need to search it
- m_oldGroupList.clear();
-
-
- if ( !g->pluginData( protocol(), accountId() + " id" ).isEmpty() )
- {
- TQString groupGuid = g->pluginData( protocol(), accountId() + " id" );
- if ( !m_groupList.contains( groupGuid ) )
- {
- // the group is maybe already removed in the server
- slotGroupRemoved( groupGuid );
- return;
- }
-
- //this is also done later, but he have to do it now!
- // (in slotGroupRemoved)
- m_groupList.remove(groupGuid);
-
- if ( groupGuid.isEmpty() )
- {
- // the group #0 can't be deleted
- // then we set it as the top-level group
- if ( g->type() == Kopete::Group::TopLevel )
- return;
-
- Kopete::Group::topLevel()->setPluginData( protocol(), accountId() + " id", "" );
- Kopete::Group::topLevel()->setPluginData( protocol(), accountId() + " displayName", g->pluginData( protocol(), accountId() + " displayName" ) );
- g->setPluginData( protocol(), accountId() + " id", TQString() ); // the group should be soon deleted, but make sure
-
- return;
- }
-
- if ( m_notifySocket )
- {
- bool still_have_contact=false;
- // if contact are contains only in the group we are removing, abort the
- TQDictIterator<Kopete::Contact> it( contacts() );
- for ( ; it.current(); ++it )
- {
- MSNContact *c = static_cast<MSNContact *>( it.current() );
- if ( c && c->serverGroups().contains( groupGuid ) )
- {
- /** don't do that becasue theses may already have been sent
- m_notifySocket->removeContact( c->contactId(), groupNumber, MSNProtocol::FL );
- */
- still_have_contact=true;
- break;
- }
- }
- if(!still_have_contact)
- m_notifySocket->removeGroup( groupGuid );
- }
- }
-}
-
-void MSNAccount::slotNewContactList()
-{
- m_oldGroupList=m_groupList;
- for(TQMap<TQString, Kopete::Group*>::Iterator it=m_oldGroupList.begin() ; it != m_oldGroupList.end() ; ++it )
- { //they are about to be changed
- if(it.data())
- it.data()->setPluginData( protocol(), accountId() + " id", TQString() );
- }
-
- m_allowList.clear();
- m_blockList.clear();
- m_reverseList.clear();
- m_groupList.clear();
- TDEConfigGroup *config=configGroup();
- config->writeEntry( "blockList" , TQString() ) ;
- config->writeEntry( "allowList" , TQString() );
- config->writeEntry( "reverseList" , TQString() );
-
- // clear all date information which will be received.
- // if the information is not anymore on the server, it will not be received
- TQDictIterator<Kopete::Contact> it( contacts() );
- for ( ; it.current(); ++it )
- {
- MSNContact *c = static_cast<MSNContact *>( *it );
- c->setBlocked( false );
- c->setAllowed( false );
- c->setReversed( false );
- c->setDeleted( true );
- c->setInfo( "PHH", TQString() );
- c->setInfo( "PHW", TQString() );
- c->setInfo( "PHM", TQString() );
- c->removeProperty( MSNProtocol::protocol()->propGuid );
- }
- m_newContactList=true;
-}
-
-void MSNAccount::slotContactListed( const TQString& handle, const TQString& publicName, const TQString &contactGuid, uint lists, const TQString& groups )
-{
- // On empty lists handle might be empty, ignore that
- // ignore also the myself contact.
- if ( handle.isEmpty() || handle==accountId())
- return;
-
- MSNContact *c = static_cast<MSNContact *>( contacts()[ handle ] );
-
- if ( lists & 1 ) // FL
- {
- TQStringList contactGroups = TQStringList::split( ",", groups, false );
- if ( c )
- {
- if( !c->metaContact() )
- {
- kdWarning( 14140 ) << k_funcinfo << "the contact " << c->contactId() << " has no meta contact" <<endl;
- Kopete::MetaContact *metaContact = new Kopete::MetaContact();
-
- c->setMetaContact(metaContact);
- Kopete::ContactList::self()->addMetaContact( metaContact );
- }
-
- // Contact exists, update data.
- // Merging difference between server contact list and Kopete::Contact's contact list into MetaContact's contact-list
- c->setOnlineStatus( MSNProtocol::protocol()->FLN );
- if(!publicName.isEmpty() && publicName!=handle)
- c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName );
- else
- c->removeProperty( Kopete::Global::Properties::self()->nickName() );
- c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid);
-
- const TQMap<TQString, Kopete::Group *> oldServerGroups = c->serverGroups();
- c->clearServerGroups();
- for ( TQStringList::ConstIterator it = contactGroups.begin(); it != contactGroups.end(); ++it )
- {
- TQString newServerGroupID = *it;
- if(m_groupList.contains(newServerGroupID))
- {
- Kopete::Group *newServerGroup=m_groupList[ newServerGroupID ] ;
- c->contactAddedToGroup( newServerGroupID, newServerGroup );
- if( !c->metaContact()->groups().contains(newServerGroup) )
- {
- // The contact has been added in a group by another client
- c->metaContact()->addToGroup( newServerGroup );
- }
- }
- }
-
- for ( TQMap<TQString, Kopete::Group *>::ConstIterator it = oldServerGroups.begin(); it != oldServerGroups.end(); ++it )
- {
- Kopete::Group *old_group=m_oldGroupList[it.key()];
- if(old_group)
- {
- TQString oldnewID=old_group->pluginData(protocol() , accountId() +" id");
- if ( !oldnewID.isEmpty() && contactGroups.contains( oldnewID ) )
- continue; //ok, it's correctn no need to do anything.
-
- c->metaContact()->removeFromGroup( old_group );
- }
- }
-
- c->setDeleted(false);
-
- // Update server if the contact has been moved to another group while MSN was offline
- c->sync();
- }
- else
- {
- Kopete::MetaContact *metaContact = new Kopete::MetaContact();
-
- c = new MSNContact( this, handle, metaContact );
- c->setDeleted(true); //we don't want to sync
- c->setOnlineStatus( MSNProtocol::protocol()->FLN );
- if(!publicName.isEmpty() && publicName!=handle)
- c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName );
- else
- c->removeProperty( Kopete::Global::Properties::self()->nickName() );
- c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid );
-
- for ( TQStringList::Iterator it = contactGroups.begin();
- it != contactGroups.end(); ++it )
- {
- TQString groupGuid = *it;
- if(m_groupList.contains(groupGuid))
- {
- c->contactAddedToGroup( groupGuid, m_groupList[ groupGuid ] );
- metaContact->addToGroup( m_groupList[ groupGuid ] );
- }
- }
- Kopete::ContactList::self()->addMetaContact( metaContact );
-
- c->setDeleted(false);
- }
- }
- else //the contact is _not_ in the FL, it has been removed
- {
- if(c)
- {
- c->setOnlineStatus( static_cast<MSNProtocol*>(protocol())->UNK );
- c->clearServerGroups();
- //TODO: display a message and suggest to remove the contact.
- // but i fear a simple messageBox QuestionYesNo here gives a nice crash.
- //delete ct;
- }
- }
- if ( lists & 2 )
- slotContactAdded( handle, "AL", publicName, TQString(), TQString() );
- else if(c)
- c->setAllowed(false);
- if ( lists & 4 )
- slotContactAdded( handle, "BL", publicName, TQString(), TQString() );
- else if(c)
- c->setBlocked(false);
- if ( lists & 8 )
- slotContactAdded( handle, "RL", publicName, TQString(), TQString() );
- else if(c)
- c->setReversed(false);
- if ( lists & 16 ) // This contact is on the pending list. Add to the reverse list and delete from the pending list
- {
- notifySocket()->addContact( handle, MSNProtocol::RL, TQString(), TQString(), TQString() );
- notifySocket()->removeContact( handle, MSNProtocol::PL, TQString(), TQString() );
- }
-}
-
-void MSNAccount::slotContactAdded( const TQString& handle, const TQString& list, const TQString& publicName, const TQString& contactGuid, const TQString &groupGuid )
-{
- if ( list == "FL" )
- {
- bool new_contact = false;
- if ( !contacts()[ handle ] )
- {
- new_contact = true;
-
- Kopete::MetaContact *m= m_addWizard_metaContact ? m_addWizard_metaContact : new Kopete::MetaContact();
-
- MSNContact *c = new MSNContact( this, handle, m );
- if(!publicName.isEmpty() && publicName!=handle)
- c->setProperty( Kopete::Global::Properties::self()->nickName() , publicName );
- else
- c->removeProperty( Kopete::Global::Properties::self()->nickName() );
- c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid );
- // Add the new contact to the group he belongs.
- if ( tmp_addNewContactToGroup.contains(handle) )
- {
- TQStringList list = tmp_addNewContactToGroup[handle];
- for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it )
- {
- TQString groupGuid = *it;
-
- // If the group didn't exist yet (yay for async operations), don't add the contact to the group
- // Let slotGroupAdded do it.
- if( m_groupList.contains(groupGuid) )
- {
- kdDebug( 14140 ) << k_funcinfo << "Adding " << handle << " to group: " << groupGuid << endl;
- notifySocket()->addContact( handle, MSNProtocol::FL, TQString(), contactGuid, groupGuid );
-
- c->contactAddedToGroup( groupGuid, m_groupList[ groupGuid ] );
-
- m->addToGroup( m_groupList[ groupGuid ] );
-
- }
- if ( !m_addWizard_metaContact )
- {
- Kopete::ContactList::self()->addMetaContact( m );
- }
- }
- tmp_addNewContactToGroup.remove(handle);
- }
-
- c->setOnlineStatus( MSNProtocol::protocol()->FLN );
-
- m_addWizard_metaContact = 0L;
- }
- if ( !new_contact )
- {
- // Contact has been added to a group
- MSNContact *c = findContactByGuid(contactGuid);
- if(c != 0L)
- {
- // Make sure that the contact has always his contactGUID.
- if( !c->hasProperty(MSNProtocol::protocol()->propGuid.key()) )
- c->setProperty( MSNProtocol::protocol()->propGuid, contactGuid );
-
- if ( c->onlineStatus() == MSNProtocol::protocol()->UNK )
- c->setOnlineStatus( MSNProtocol::protocol()->FLN );
-
- if ( c->metaContact() && c->metaContact()->isTemporary() )
- c->metaContact()->setTemporary( false, m_groupList.contains( groupGuid ) ? m_groupList[ groupGuid ] : 0L );
- else
- {
- if(m_groupList.contains(groupGuid))
- {
- if( c->metaContact() )
- c->metaContact()->addToGroup( m_groupList[groupGuid] );
- c->contactAddedToGroup( groupGuid, m_groupList[ groupGuid ] );
- }
- }
- }
- }
-
- if ( !handle.isEmpty() && !m_allowList.contains( handle ) && !m_blockList.contains( handle ) )
- {
- kdDebug(14140) << k_funcinfo << "Trying to add contact to AL. " << endl;
- notifySocket()->addContact(handle, MSNProtocol::AL, TQString(), TQString(), TQString() );
- }
- }
- else if ( list == "BL" )
- {
- if ( contacts()[ handle ] )
- static_cast<MSNContact *>( contacts()[ handle ] )->setBlocked( true );
- if ( !m_blockList.contains( handle ) )
- {
- m_blockList.append( handle );
- configGroup()->writeEntry( "blockList" , m_blockList ) ;
- }
- }
- else if ( list == "AL" )
- {
- if ( contacts()[ handle ] )
- static_cast<MSNContact *>( contacts()[ handle ] )->setAllowed( true );
- if ( !m_allowList.contains( handle ) )
- {
- m_allowList.append( handle );
- configGroup()->writeEntry( "allowList" , m_allowList ) ;
- }
- }
- else if ( list == "RL" )
- {
- // search for new Contacts
- Kopete::Contact *ct=contacts()[ handle ];
- if ( !ct || !ct->metaContact() || ct->metaContact()->isTemporary() )
- {
- // Users in the allow list or block list now never trigger the
- // 'new user' dialog, which makes it impossible to add those here.
- // Not necessarily bad, but the usability effects need more thought
- // before I declare it good :- )
- if ( !m_allowList.contains( handle ) && !m_blockList.contains( handle ) )
- {
- TQString nick; //in most case, the public name is not know
- if(publicName!=handle) // so we don't whos it if it is not know
- nick=publicName;
- Kopete::UI::ContactAddedNotifyDialog *dialog=
- new Kopete::UI::ContactAddedNotifyDialog( handle,nick,this,
- Kopete::UI::ContactAddedNotifyDialog::InfoButton );
- TQObject::connect(dialog,TQT_SIGNAL(applyClicked(const TQString&)),
- this,TQT_SLOT(slotContactAddedNotifyDialogClosed(const TQString& )));
- dialog->show();
- }
- }
- else
- {
- static_cast<MSNContact *>( ct )->setReversed( true );
- }
- m_reverseList.append( handle );
- configGroup()->writeEntry( "reverseList" , m_reverseList ) ;
- }
-}
-
-void MSNAccount::slotContactRemoved( const TQString& handle, const TQString& list, const TQString& contactGuid, const TQString& groupGuid )
-{
- kdDebug( 14140 ) << k_funcinfo << "handle: " << handle << " list: " << list << " contact-uid: " << contactGuid << endl;
- MSNContact *c=static_cast<MSNContact *>( contacts()[ handle ] );
- if ( list == "BL" )
- {
- m_blockList.remove( handle );
- configGroup()->writeEntry( "blockList" , m_blockList ) ;
- if ( !m_allowList.contains( handle ) )
- notifySocket()->addContact( handle, MSNProtocol::AL, TQString(), TQString(), TQString() );
-
- if(c)
- c->setBlocked( false );
- }
- else if ( list == "AL" )
- {
- m_allowList.remove( handle );
- configGroup()->writeEntry( "allowList" , m_allowList ) ;
- if ( !m_blockList.contains( handle ) )
- notifySocket()->addContact( handle, MSNProtocol::BL, TQString(), TQString(), TQString() );
-
- if(c)
- c->setAllowed( false );
- }
- else if ( list == "RL" )
- {
- m_reverseList.remove( handle );
- configGroup()->writeEntry( "reverseList" , m_reverseList ) ;
-
- if ( c )
- {
- // Contact is removed from the reverse list
- // only MSN can do this, so this is currently not supported
- c->setReversed( false );
- /*
- InfoWidget *info = new InfoWidget( 0 );
- info->title->setText( "<b>" + i18n( "Contact removed!" ) +"</b>" );
- TQString dummy;
- dummy = "<center><b>" + imContact->getPublicName() + "( " +imContact->getHandle() +" )</b></center><br>";
- dummy += i18n( "has removed you from his contact list!" ) + "<br>";
- dummy += i18n( "This contact is now removed from your contact list" );
- info->infoText->setText( dummy );
- info->setCaption( "KMerlin - Info" );
- info->show();
- */
- }
- }
- else if ( list == "FL" )
- {
- // The FL list only use the contact GUID, use the contact referenced by the GUID.
- MSNContact *contactRemoved = findContactByGuid(contactGuid);
- TQStringList groupGuidList;
- bool deleteContact = groupGuid.isEmpty() ? true : false; // Delete the contact when the group GUID is empty.
- // Remove the contact from the contact list for all the group he is a member.
- if( groupGuid.isEmpty() )
- {
- if(contactRemoved)
- {
- TQPtrList<Kopete::Group> groupList = contactRemoved->metaContact()->groups();
- for( TQPtrList<Kopete::Group>::Iterator it = groupList.begin(); it != groupList.end(); ++it )
- {
- Kopete::Group *group = *it;
- if ( !group->pluginData( protocol(), accountId() + " id" ).isEmpty() )
- {
- groupGuidList.append( group->pluginData( protocol(), accountId() + " id" ) );
- }
- }
- }
- }
- else
- {
- groupGuidList.append( groupGuid );
- }
-
- if( !groupGuidList.isEmpty() )
- {
- TQStringList::const_iterator stringIt;
- for( stringIt = groupGuidList.begin(); stringIt != groupGuidList.end(); ++stringIt )
- {
- // Contact is removed from the FL list, remove it from the group
- if(contactRemoved != 0L)
- contactRemoved->contactRemovedFromGroup( *stringIt );
-
- //check if the group is now empty to remove it
- if ( m_notifySocket )
- {
- bool still_have_contact=false;
- // if contact are contains only in the group we are removing, abort the
- TQDictIterator<Kopete::Contact> it( contacts() );
- for ( ; it.current(); ++it )
- {
- MSNContact *c2 = static_cast<MSNContact *>( it.current() );
- if ( c2->serverGroups().contains( *stringIt ) )
- {
- still_have_contact=true;
- break;
- }
- }
- if(!still_have_contact)
- m_notifySocket->removeGroup( *stringIt );
- }
- }
- }
- if(deleteContact && contactRemoved)
- {
- kdDebug(14140) << k_funcinfo << "Deleting the MSNContact " << contactRemoved->contactId() << endl;
- contactRemoved->deleteLater();
- }
- }
-}
-
-void MSNAccount::slotCreateChat( const TQString& address, const TQString& auth )
-{
- slotCreateChat( 0L, address, auth, m_msgHandle.first(), m_msgHandle.first() );
-}
-
-void MSNAccount::slotCreateChat( const TQString& ID, const TQString& address, const TQString& auth,
- const TQString& handle_, const TQString& publicName )
-{
- TQString handle = handle_.lower();
-
- if ( handle.isEmpty() )
- {
- // we have lost the handle?
- kdDebug(14140) << k_funcinfo << "Impossible to open a chat session, I forgot the contact to invite" <<endl;
- // forget it
- return;
- }
-
-// kdDebug( 14140 ) << k_funcinfo <<"Creating chat for " << handle << endl;
-
- if ( !contacts()[ handle ] )
- addContact( handle, publicName, 0L, Kopete::Account::Temporary );
-
- MSNContact *c = static_cast<MSNContact *>( contacts()[ handle ] );
-
- if ( c && myself() )
- {
- // we can't use simply c->manager(true) here to get the manager, because this will re-open
- // another chat session, and then, close this new one. We have to re-create the manager manualy.
- MSNChatSession *manager = dynamic_cast<MSNChatSession*>( c->manager( Kopete::Contact::CannotCreate ) );
- if(!manager)
- {
- Kopete::ContactPtrList chatmembers;
- chatmembers.append(c);
- manager = new MSNChatSession( protocol(), myself(), chatmembers );
- }
-
- manager->createChat( handle, address, auth, ID );
-
- /**
- * This code should open a chatwindow when a socket is open
- * It has been disabled because pidgin open switchboeard too often
- *
- * the solution is to open the window only when the contact start typing
- * see MSNChatSession::receivedTypingMsg
- *
-
- TDEGlobal::config()->setGroup( "MSN" );
- bool notifyNewChat = TDEGlobal::config()->readBoolEntry( "NotifyNewChat", false );
- if ( !ID.isEmpty() && notifyNewChat )
- {
- // this temporary message should open the window if they not exist
- TQString body = i18n( "%1 has started a chat with you" ).arg( c->metaContact()->displayName() );
- Kopete::Message tmpMsg = Kopete::Message( c, manager->members(), body, Kopete::Message::Internal, Kopete::Message::PlainText );
- manager->appendMessage( tmpMsg );
- }
- */
- }
-
- if(!m_msgHandle.isEmpty())
- m_msgHandle.pop_front();
-}
-
-void MSNAccount::slotStartChatSession( const TQString& handle )
-{
- // First create a message manager, because we might get an existing
- // manager back, in which case we likely also have an active switchboard
- // connection to reuse...
-
- MSNContact *c = static_cast<MSNContact *>( contacts()[ handle ] );
- // if ( isConnected() && c && myself() && handle != m_msnId )
- if ( m_notifySocket && c && myself() && handle != accountId() )
- {
- if ( !c->manager(Kopete::Contact::CannotCreate) || !static_cast<MSNChatSession *>( c->manager( Kopete::Contact::CanCreate ) )->service() )
- {
- m_msgHandle.prepend(handle);
- m_notifySocket->createChatSession();
- }
- }
-}
-
-void MSNAccount::slotContactAddedNotifyDialogClosed(const TQString& handle)
-{
- const Kopete::UI::ContactAddedNotifyDialog *dialog =
- dynamic_cast<const Kopete::UI::ContactAddedNotifyDialog *>(sender());
- if(!dialog || !m_notifySocket)
- return;
-
- if(dialog->added())
- {
- Kopete::MetaContact *mc=dialog->addContact();
- if(mc)
- { //if the contact has been added this way, it's because the other user added us.
- // don't forgot to set the reversed flag (Bug 114400)
- MSNContact *c=dynamic_cast<MSNContact*>(mc->contacts().first());
- if(c && c->contactId() == handle )
- {
- c->setReversed( true );
- }
- }
- }
-
- if ( !dialog->authorized() )
- {
- if ( m_allowList.contains( handle ) )
- m_notifySocket->removeContact( handle, MSNProtocol::AL, TQString(), TQString() );
- else if ( !m_blockList.contains( handle ) )
- m_notifySocket->addContact( handle, MSNProtocol::BL, TQString(), TQString(), TQString() );
- }
- else
- {
- if ( m_blockList.contains( handle ) )
- m_notifySocket->removeContact( handle, MSNProtocol::BL, TQString(), TQString() );
- else if ( !m_allowList.contains( handle ) )
- m_notifySocket->addContact( handle, MSNProtocol::AL, TQString(), TQString(), TQString() );
- }
-
-
-}
-
-void MSNAccount::slotGlobalIdentityChanged( const TQString &key, const TQVariant &value )
-{
- if( !configGroup()->readBoolEntry("ExcludeGlobalIdentity", false) )
- {
- if(key == Kopete::Global::Properties::self()->nickName().key())
- {
- TQString oldNick = myself()->property( Kopete::Global::Properties::self()->nickName()).value().toString();
- TQString newNick = value.toString();
-
- if(newNick != oldNick)
- {
- setPublicName( value.toString() );
- }
- }
- else if(key == Kopete::Global::Properties::self()->photo().key())
- {
- m_pictureFilename = value.toString();
- kdDebug( 14140 ) << k_funcinfo << m_pictureFilename << endl;
- resetPictureObject(false, true);
- }
- }
-}
-
-void MSNAccount::slotErrorMessageReceived( int type, const TQString &msg )
-{
- TQString caption = i18n( "MSN Plugin" );
-
- // Use different notification type based on the error context.
- switch(type)
- {
- case MSNSocket::ErrorConnectionLost:
- {
- Kopete::Utils::notifyConnectionLost( this, caption, msg );
- break;
- }
- case MSNSocket::ErrorConnectionError:
- {
- Kopete::Utils::notifyConnectionError( this, caption, msg );
- break;
- }
- case MSNSocket::ErrorCannotConnect:
- {
- Kopete::Utils::notifyCannotConnect( this );
- break;
- }
- case MSNSocket::ErrorInformation:
- {
- KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Information, msg, caption );
- break;
- }
- case MSNSocket::ErrorServerError:
- default:
- {
- Kopete::Utils::notifyServerError( this, caption, msg );
- break;
- }
- }
-}
-
-bool MSNAccount::createContact( const TQString &contactId, Kopete::MetaContact *metaContact )
-{
- if ( !metaContact->isTemporary() && m_notifySocket)
- {
- m_addWizard_metaContact = metaContact;
-
- addContactServerside(contactId, metaContact->groups());
-
- // FIXME: Find out if this contact was really added or not!
- return true;
- }
- else
- {
- // This is a temporary contact. ( a person who messaged us but is not on our conntact list.
- // We don't want to create it on the server.Just create the local contact object and add it
- // Or we are diconnected, and in that case, the contact will be added when connecting
- MSNContact *newContact = new MSNContact( this, contactId, metaContact );
- newContact->setDeleted(true);
- return true;
- }
-
-}
-
-void MSNAccount::addContactServerside(const TQString &contactId, TQPtrList<Kopete::Group> groupList)
-{
- // First of all, fill the temporary group list. The contact will be moved to his group(s).
- // When we receive back his contact GUID(required to move a contact between groups)
- for( Kopete::Group *group = groupList.first(); group; group = groupList.next() )
- {
- // TODO: It it time that libkopete generate a unique ID that contains protocols, account and contact id.
- TQString groupId = group->pluginData( protocol(), accountId() + " id" );
- // If the groupId is empty, that's mean the Kopete group is not on the MSN server.
- if( !groupId.isEmpty() )
- {
- // Something got corrupted on contactlist.xml
- if( !m_groupList.contains(groupId) )
- {
- // Clear the group plugin data.
- group->setPluginData( protocol() , accountId() + " id" , TQString());
- group->setPluginData( protocol() , accountId() + " displayName" , TQString());
- kdDebug( 14140 ) << k_funcinfo << " Group " << group->displayName() << " marked with id #" << groupId << " does not seems to be anymore on the server" << endl;
-
- // Add the group on MSN server, will fix the corruption.
- kdDebug(14140) << k_funcinfo << "Fixing group corruption, re-adding " << group->displayName() << "to the server." << endl;
- addGroup( group->displayName(), contactId);
- }
- else
- {
- // Add the group that the contact belong to add it when we will receive the contact GUID.
- if( tmp_addNewContactToGroup.contains( contactId ) )
- tmp_addNewContactToGroup[contactId].append(groupId);
- else
- tmp_addNewContactToGroup.insert(contactId, TQStringList(groupId) );
- }
- }
- else
- {
- if( !group->displayName().isEmpty() && group->type() == Kopete::Group::Normal )
- {
- kdDebug(14140) << k_funcinfo << "Group not on MSN server, add it" << endl;
- addGroup( group->displayName(), contactId );
- }
- }
- }
-
- // After add the contact to the top-level, it will be moved to required groups later.
- kdDebug( 14140 ) << k_funcinfo << "Add the contact on the server " << endl;
- m_notifySocket->addContact( contactId, MSNProtocol::FL, contactId, TQString(), TQString() );
-}
-
-MSNContact *MSNAccount::findContactByGuid(const TQString &contactGuid)
-{
- kdDebug(14140) << k_funcinfo << "Looking for " << contactGuid << endl;
- TQDictIterator<Kopete::Contact> it( contacts() );
- for ( ; it.current(); ++it )
- {
- MSNContact *c = dynamic_cast<MSNContact *>( it.current() );
-
- if(c && c->guid() == contactGuid )
- {
- kdDebug(14140) << k_funcinfo << "OK found a contact. " << endl;
- // Found the contact GUID
- return c;
- }
- }
-
- return 0L;
-}
-
-bool MSNAccount::isHotmail() const
-{
- if ( !m_openInboxAction )
- return false;
- return m_openInboxAction->isEnabled();
-}
-
-TQString MSNAccount::pictureUrl()
-{
- return m_pictureFilename;
-}
-
-void MSNAccount::setPictureUrl(const TQString &url)
-{
- m_pictureFilename = url;
-}
-
-TQString MSNAccount::pictureObject()
-{
- if(m_pictureObj.isNull())
- resetPictureObject(true); //silent=true to keep infinite loop away
- return m_pictureObj;
-}
-
-void MSNAccount::resetPictureObject(bool silent, bool force)
-{
- TQString old=m_pictureObj;
-
- if(!configGroup()->readBoolEntry("exportCustomPicture") && !force)
- {
- m_pictureObj="";
- myself()->removeProperty( Kopete::Global::Properties::self()->photo() );
- }
- else
- {
- // Check if the picture is a 96x96 image, if not scale, crop and save.
- TQImage picture(m_pictureFilename);
- if(picture.isNull())
- {
- m_pictureObj="";
- myself()->removeProperty( Kopete::Global::Properties::self()->photo() );
- }
- else
- {
- if(picture.width() != 96 || picture.height() != 96)
- {
- // Save to a new location in msnpictures.
- TQString newLocation( locateLocal( "appdata", "msnpictures/"+ KURL(m_pictureFilename).fileName().lower() ) );
-
- // Scale and crop the picture.
- picture = MSNProtocol::protocol()->scalePicture(picture);
-
- // Use the cropped/scaled image now.
- if(!picture.save(newLocation, "PNG"))
- {
- m_pictureObj="";
- myself()->removeProperty( Kopete::Global::Properties::self()->photo() );
- }
- m_pictureFilename = newLocation;
- }
- }
-
- TQFile pictFile( m_pictureFilename );
- if(!pictFile.open(IO_ReadOnly))
- {
- m_pictureObj="";
- myself()->removeProperty( Kopete::Global::Properties::self()->photo() );
- }
- else
- {
- TQByteArray ar=pictFile.readAll();
- TQString sha1d= TQString((KCodecs::base64Encode(SHA1::hash(ar))));
-
- TQString size=TQString::number( pictFile.size() );
- TQString all= "Creator"+accountId()+"Size"+size+"Type3Locationkopete.tmpFriendlyAAA=SHA1D"+ sha1d;
- m_pictureObj="<msnobj Creator=\"" + accountId() + "\" Size=\"" + size + "\" Type=\"3\" Location=\"kopete.tmp\" Friendly=\"AAA=\" SHA1D=\""+sha1d+"\" SHA1C=\""+ TQString(KCodecs::base64Encode(SHA1::hashString(all.utf8()))) +"\"/>";
- myself()->setProperty( Kopete::Global::Properties::self()->photo() , m_pictureFilename );
- }
- }
-
- if(old!=m_pictureObj && isConnected() && m_notifySocket && !silent)
- {
- //update the msn pict
- m_notifySocket->setStatus( myself()->onlineStatus() );
- }
-}
-
-#include "msnaccount.moc"
-
-// vim: set noet ts=4 sts=4 sw=4:
-
-