You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
396 lines
11 KiB
396 lines
11 KiB
/*
|
|
kimifaceimpl.cpp - Kopete DCOP Interface
|
|
|
|
Copyright (c) 2004 by Will Stephenson <lists@stevello.free-online.co.uk>
|
|
|
|
Kopete (c) 2002-2004 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 <tqstringlist.h>
|
|
|
|
#include <dcopclient.h>
|
|
#include <kapplication.h>
|
|
#include <kiconloader.h>
|
|
#include <klocale.h>
|
|
#include <kmessagebox.h>
|
|
#include <kplugininfo.h>
|
|
#include <kabc/addressbook.h>
|
|
#include <kabc/stdaddressbook.h>
|
|
|
|
#include "kopeteaccount.h"
|
|
#include "kopeteaccountmanager.h"
|
|
#include "kopetecontactlist.h"
|
|
#include "kopetechatsession.h"
|
|
#include "kopetemetacontact.h"
|
|
#include "kopeteprotocol.h"
|
|
#include "kopetepluginmanager.h"
|
|
#include "kopeteuiglobal.h"
|
|
#include "kopetecontact.h"
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include "kimifaceimpl.h"
|
|
|
|
KIMIfaceImpl::KIMIfaceImpl() : DCOPObject( "KIMIface" ), TQObject()
|
|
{
|
|
connect( Kopete::ContactList::self(),
|
|
TQT_SIGNAL( metaContactAdded( Kopete::MetaContact * ) ),
|
|
TQT_SLOT( slotMetaContactAdded( Kopete::MetaContact * ) ) );
|
|
}
|
|
|
|
KIMIfaceImpl::~KIMIfaceImpl()
|
|
{
|
|
}
|
|
|
|
TQStringList KIMIfaceImpl::allContacts()
|
|
{
|
|
TQStringList result;
|
|
TQPtrList<Kopete::MetaContact> list = Kopete::ContactList::self()->metaContacts();
|
|
TQPtrListIterator<Kopete::MetaContact> it( list );
|
|
for( ; it.current(); ++it )
|
|
{
|
|
if ( !it.current()->metaContactId().contains(':') )
|
|
result.append( it.current()->metaContactId() );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
TQStringList KIMIfaceImpl::reachableContacts()
|
|
{
|
|
TQStringList result;
|
|
TQPtrList<Kopete::MetaContact> list = Kopete::ContactList::self()->metaContacts();
|
|
TQPtrListIterator<Kopete::MetaContact> it( list );
|
|
for( ; it.current(); ++it )
|
|
{
|
|
if ( it.current()->isReachable() && !it.current()->metaContactId().contains(':') )
|
|
result.append( it.current()->metaContactId() );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
TQStringList KIMIfaceImpl::onlineContacts()
|
|
{
|
|
TQStringList result;
|
|
TQPtrList<Kopete::MetaContact> list = Kopete::ContactList::self()->metaContacts();
|
|
TQPtrListIterator<Kopete::MetaContact> it( list );
|
|
for( ; it.current(); ++it )
|
|
{
|
|
if ( it.current()->isOnline() && !it.current()->metaContactId().contains(':') )
|
|
result.append( it.current()->metaContactId() );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
TQStringList KIMIfaceImpl::fileTransferContacts()
|
|
{
|
|
TQStringList result;
|
|
TQPtrList<Kopete::MetaContact> list = Kopete::ContactList::self()->metaContacts();
|
|
TQPtrListIterator<Kopete::MetaContact> it( list );
|
|
for( ; it.current(); ++it )
|
|
{
|
|
if ( it.current()->canAcceptFiles() && !it.current()->metaContactId().contains(':') )
|
|
result.append( it.current()->metaContactId() );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool KIMIfaceImpl::isPresent( const TQString & uid )
|
|
{
|
|
Kopete::MetaContact *mc;
|
|
mc = Kopete::ContactList::self()->metaContact( uid );
|
|
|
|
return ( mc != 0 );
|
|
}
|
|
|
|
|
|
TQString KIMIfaceImpl::displayName( const TQString & uid )
|
|
{
|
|
Kopete::MetaContact *mc;
|
|
mc = Kopete::ContactList::self()->metaContact( uid );
|
|
TQString name;
|
|
if ( mc )
|
|
name = mc->displayName();
|
|
|
|
return name;
|
|
}
|
|
|
|
int KIMIfaceImpl::presencetqStatus( const TQString & uid )
|
|
{
|
|
//kdDebug( 14000 ) << k_funcinfo << endl;
|
|
int p = -1;
|
|
Kopete::MetaContact *m = Kopete::ContactList::self()->metaContact( uid );
|
|
if ( m )
|
|
{
|
|
Kopete::OnlineStatus status = m->status();
|
|
switch ( status.status() )
|
|
{
|
|
case Kopete::OnlineStatus::Unknown:
|
|
p = 0;
|
|
break;
|
|
case Kopete::OnlineStatus::Offline:
|
|
case Kopete::OnlineStatus::Invisible:
|
|
p = 1;
|
|
break;
|
|
case Kopete::OnlineStatus::Connecting:
|
|
p = 2;
|
|
break;
|
|
case Kopete::OnlineStatus::Away:
|
|
p = 3;
|
|
break;
|
|
case Kopete::OnlineStatus::Online:
|
|
p = 4;
|
|
break;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
|
|
TQString KIMIfaceImpl::presenceString( const TQString & uid )
|
|
{
|
|
//kdDebug( 14000 ) << "KIMIfaceImpl::presenceString" << endl;
|
|
TQString p;
|
|
Kopete::MetaContact *m = Kopete::ContactList::self()->metaContact( uid );
|
|
if ( m )
|
|
{
|
|
Kopete::OnlineStatus status = m->status();
|
|
p = status.description();
|
|
kdDebug( 14000 ) << "Got presence for " << uid << " : " << p.ascii() << endl;
|
|
}
|
|
else
|
|
{
|
|
kdDebug( 14000 ) << "Couldn't find MC: " << uid << endl;;
|
|
p = TQString();
|
|
}
|
|
return p;
|
|
}
|
|
|
|
bool KIMIfaceImpl::canReceiveFiles( const TQString & uid )
|
|
{
|
|
Kopete::MetaContact *mc;
|
|
mc = Kopete::ContactList::self()->metaContact( uid );
|
|
|
|
if ( mc )
|
|
return mc->canAcceptFiles();
|
|
else
|
|
return false;
|
|
}
|
|
|
|
bool KIMIfaceImpl::canRespond( const TQString & uid )
|
|
{
|
|
Kopete::MetaContact *mc;
|
|
mc = Kopete::ContactList::self()->metaContact( uid );
|
|
|
|
if ( mc )
|
|
{
|
|
TQPtrList<Kopete::Contact> list = mc->contacts();
|
|
TQPtrListIterator<Kopete::Contact> it( list );
|
|
Kopete::Contact *contact;
|
|
while ( ( contact = it.current() ) != 0 )
|
|
{
|
|
++it;
|
|
if ( contact->isOnline() && contact->protocol()->pluginId() != "SMSProtocol" )
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
TQString KIMIfaceImpl::locate( const TQString & contactId, const TQString & protocolId )
|
|
{
|
|
Kopete::MetaContact *mc = locateProtocolContact( contactId, protocolId );
|
|
if ( mc )
|
|
return mc->metaContactId();
|
|
else
|
|
return TQString();
|
|
}
|
|
|
|
Kopete::MetaContact * KIMIfaceImpl::locateProtocolContact( const TQString & contactId, const TQString & protocolId )
|
|
{
|
|
Kopete::MetaContact *mc = 0;
|
|
// find a matching protocol
|
|
Kopete::Protocol *protocol = dynamic_cast<Kopete::Protocol*>( Kopete::PluginManager::self()->plugin( protocolId ) );
|
|
|
|
if ( protocol )
|
|
{
|
|
// find its accounts
|
|
TQDict<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts( protocol );
|
|
TQDictIterator<Kopete::Account> it( accounts );
|
|
for( ; it.current(); ++it )
|
|
{
|
|
Kopete::Contact *c = Kopete::ContactList::self()->findContact( protocolId, it.currentKey(), contactId );
|
|
if (c)
|
|
{
|
|
mc=c->metaContact();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return mc;
|
|
}
|
|
|
|
TQPixmap KIMIfaceImpl::icon( const TQString & uid )
|
|
{
|
|
Kopete::MetaContact *m = Kopete::ContactList::self()->metaContact( uid );
|
|
TQPixmap p;
|
|
if ( m )
|
|
p = SmallIcon( m->statusIcon() );
|
|
return p;
|
|
}
|
|
|
|
TQString KIMIfaceImpl::context( const TQString & uid )
|
|
{
|
|
// TODO: support context
|
|
// shush warning
|
|
TQString myUid = uid;
|
|
|
|
return TQString();
|
|
}
|
|
|
|
TQStringList KIMIfaceImpl::protocols()
|
|
{
|
|
TQValueList<KPluginInfo *> protocols = Kopete::PluginManager::self()->availablePlugins( "Protocols" );
|
|
TQStringList protocolList;
|
|
for ( TQValueList<KPluginInfo *>::Iterator it = protocols.begin(); it != protocols.end(); ++it )
|
|
protocolList.append( (*it)->name() );
|
|
|
|
return protocolList;
|
|
}
|
|
|
|
void KIMIfaceImpl::messageContact( const TQString &uid, const TQString& messageText )
|
|
{
|
|
Kopete::MetaContact *m = Kopete::ContactList::self()->metaContact( uid );
|
|
if ( m )
|
|
{
|
|
Kopete::Contact * c = m->preferredContact();
|
|
Kopete::ChatSession * manager = c->manager(Kopete::Contact::CanCreate);
|
|
c->manager( Kopete::Contact::CanCreate )->view( true );
|
|
Kopete::Message msg = Kopete::Message( manager->myself(), manager->members(), messageText,
|
|
Kopete::Message::Outbound, Kopete::Message::PlainText);
|
|
manager->sendMessage( msg );
|
|
}
|
|
else
|
|
unknown( uid );
|
|
}
|
|
|
|
void KIMIfaceImpl::messageNewContact( const TQString &contactId, const TQString &protocol )
|
|
{
|
|
Kopete::MetaContact *mc = locateProtocolContact( contactId, protocol );
|
|
if ( mc )
|
|
mc->sendMessage();
|
|
}
|
|
|
|
void KIMIfaceImpl::chatWithContact( const TQString &uid )
|
|
{
|
|
Kopete::MetaContact *m = Kopete::ContactList::self()->metaContact( uid );
|
|
if ( m )
|
|
m->execute();
|
|
else
|
|
unknown( uid );
|
|
}
|
|
|
|
void KIMIfaceImpl::sendFile(const TQString &uid, const KURL &sourceURL,
|
|
const TQString &altFileName, uint fileSize)
|
|
{
|
|
Kopete::MetaContact *m = Kopete::ContactList::self()->metaContact( uid );
|
|
if ( m )
|
|
m->sendFile( sourceURL, altFileName, fileSize );
|
|
// else, prompt to create a new MC associated with UID
|
|
}
|
|
|
|
bool KIMIfaceImpl::addContact( const TQString &contactId, const TQString &protocolId )
|
|
{
|
|
// find a matching protocol
|
|
Kopete::Protocol *protocol = dynamic_cast<Kopete::Protocol*>( Kopete::PluginManager::self()->plugin( protocolId ) );
|
|
|
|
if ( protocol )
|
|
{
|
|
// find its accounts
|
|
TQDict<Kopete::Account> accounts = Kopete::AccountManager::self()->accounts( protocol );
|
|
TQDictIterator<Kopete::Account> it( accounts );
|
|
Kopete::Account *ac = it.toFirst();
|
|
if ( ac )
|
|
{
|
|
ac->addContact( contactId );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void KIMIfaceImpl::slotMetaContactAdded( Kopete::MetaContact *mc )
|
|
{
|
|
connect( mc, TQT_SIGNAL( onlineStatusChanged( Kopete::MetaContact *, Kopete::OnlineStatus::StatusType ) ),
|
|
TQT_SLOT( slotContactStatusChanged( Kopete::MetaContact * ) ) );
|
|
}
|
|
|
|
void KIMIfaceImpl::slotContactStatusChanged( Kopete::MetaContact *mc )
|
|
{
|
|
if ( !mc->metaContactId().contains( ':' ) )
|
|
{
|
|
int p = -1;
|
|
Kopete::OnlineStatus status = mc->status();
|
|
switch ( status.status() )
|
|
{
|
|
case Kopete::OnlineStatus::Unknown:
|
|
p = 0;
|
|
break;
|
|
case Kopete::OnlineStatus::Offline:
|
|
case Kopete::OnlineStatus::Invisible:
|
|
p = 1;
|
|
break;
|
|
case Kopete::OnlineStatus::Connecting:
|
|
p = 2;
|
|
break;
|
|
case Kopete::OnlineStatus::Away:
|
|
p = 3;
|
|
break;
|
|
case Kopete::OnlineStatus::Online:
|
|
p = 4;
|
|
break;
|
|
}
|
|
// tell anyone who's listening over DCOP
|
|
contactPresenceChanged( mc->metaContactId(), kapp->name(), p );
|
|
/* TQByteArray params;
|
|
TQDataStream stream(params, IO_WriteOnly);
|
|
stream << mc->metaContactId();
|
|
stream << kapp->name();
|
|
stream << p;
|
|
kapp->dcopClient()->emitDCOPSignal( "contactPresenceChanged( TQString, TQCString, int )", params );*/
|
|
}
|
|
}
|
|
|
|
void KIMIfaceImpl::unknown( const TQString &uid )
|
|
{
|
|
// warn the user that the KABC contact associated with this UID isn't known to kopete,
|
|
// either associate an existing contact with KABC or add a new one using the ACW.
|
|
KABC::AddressBook *bk = KABC::StdAddressBook::self( false );
|
|
KABC::Addressee addr = bk->findByUid( uid );
|
|
if ( addr.isEmpty() )
|
|
{
|
|
KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Sorry, i18n("Another KDE application tried to use Kopete for instant messaging, but Kopete could not find the specified contact in the KDE address book."), i18n( "Not Found in Address Book" ) );
|
|
}
|
|
else
|
|
{
|
|
TQString apology = i18n( "Translators: %1 is the name of a person taken from the KDE address book, who Kopete doesn't know about. Kopete must either be told that an existing contact in Kopete is this person, or add a new contact for them",
|
|
"<qt><p>The KDE Address Book has no instant messaging information for</p><p><b>%1</b>.</p><p>If he/she is already present in the Kopete contact list, indicate the correct addressbook entry in their properties.</p><p>Otherwise, add a new contact using the Add Contact wizard.</p></qt>" );
|
|
apology = apology.tqarg( addr.realName() );
|
|
KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Information, apology, i18n( "No Instant Messaging Address" ) );
|
|
}
|
|
}
|
|
|
|
#include "kimifaceimpl.moc"
|
|
|