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.
340 lines
12 KiB
340 lines
12 KiB
/*
|
|
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 class gives function that interact with kaddressbook.
|
|
begin: Fri 2004-07-23
|
|
copyright: (C) 2004 by John Tapsell
|
|
email: john@geola.co.uk
|
|
*/
|
|
|
|
#include "addressbook.h"
|
|
#include "../viewcontainer.h"
|
|
#include "../konversationmainwindow.h"
|
|
#include "../server.h"
|
|
#include "../channel.h"
|
|
#include "../konversationapplication.h"
|
|
|
|
#include <tqstringlist.h>
|
|
#include "tqwidget.h"
|
|
|
|
#include <tdelocale.h>
|
|
#include <tdemessagebox.h>
|
|
#include <tdeapplication.h>
|
|
#include <dcopclient.h>
|
|
#include <twin.h>
|
|
|
|
|
|
namespace Konversation
|
|
{
|
|
|
|
Addressbook *Addressbook::m_instance=0L;
|
|
|
|
Addressbook::Addressbook() : DCOPObject( "KIMIface")
|
|
{
|
|
addressBook = KABC::StdAddressBook::self(true);
|
|
m_ticket=NULL;
|
|
}
|
|
Addressbook::~Addressbook()
|
|
{
|
|
if (m_instance == this)
|
|
sd.setObject(m_instance, 0, false);
|
|
}
|
|
|
|
Addressbook *Addressbook::self()
|
|
{
|
|
if (!m_instance) { sd.setObject(m_instance, new Addressbook()); }
|
|
return m_instance;
|
|
}
|
|
|
|
TQStringList Addressbook::allContacts()
|
|
{
|
|
TQStringList contactUIDS;
|
|
for( KABC::AddressBook::Iterator it = addressBook->begin(); it != addressBook->end(); ++it )
|
|
if(hasAnyNicks(*it)) contactUIDS.append((*it).uid());
|
|
return contactUIDS;
|
|
}
|
|
//Produces a string list of all the irc nicks that are known.
|
|
TQStringList Addressbook::allContactsNicks()
|
|
{
|
|
TQStringList contacts;
|
|
for( KABC::AddressBook::Iterator it = addressBook->begin(); it != addressBook->end(); ++it )
|
|
contacts += TQStringList::split( TQChar( 0xE000 ), (*it).custom("messaging/irc", "All") );
|
|
return contacts;
|
|
}
|
|
|
|
TQStringList Addressbook::onlineContacts()
|
|
{
|
|
TQStringList contactUIDS;
|
|
for( KABC::AddressBook::Iterator it = addressBook->begin(); it != addressBook->end(); ++it )
|
|
if(isOnline(*it)) contactUIDS.append((*it).uid());
|
|
|
|
return contactUIDS;
|
|
}
|
|
TQStringList Addressbook::reachableContacts()
|
|
{
|
|
return onlineContacts();
|
|
}
|
|
TQStringList Addressbook::fileTransferContacts()
|
|
{
|
|
return onlineContacts();
|
|
}
|
|
bool Addressbook::isPresent(const TQString &uid)
|
|
{
|
|
return hasAnyNicks(addressBook->findByUid(uid));
|
|
}
|
|
TQString Addressbook::displayName(const TQString &uid)
|
|
{
|
|
return getBestNick(addressBook->findByUid(uid));
|
|
}
|
|
TQString Addressbook::presenceString(const TQString &uid)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::presenceString() called with an empty uid" << endl;
|
|
return TQString("Error");
|
|
}
|
|
switch( presenceStatus(uid))
|
|
{
|
|
case 0:
|
|
return "";
|
|
case 1:
|
|
return i18n("Offline");
|
|
case 2:
|
|
return i18n("Connecting"); //Shouldn't happen - not supported.
|
|
case 3:
|
|
return i18n("Away");
|
|
case 4:
|
|
return i18n("Online");
|
|
}
|
|
return TQString("Error");
|
|
}
|
|
int Addressbook::presenceStatus(const TQString &uid)
|
|
{
|
|
return presenceStatusByAddressee(addressBook->findByUid(uid));
|
|
}
|
|
|
|
bool Addressbook::canReceiveFiles(const TQString &uid)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::canReceiveFiles() called with empty uid" << endl;
|
|
return false;
|
|
}
|
|
int presence = presenceStatus(uid);
|
|
|
|
return (presence == 4) || (presence == 3);
|
|
}
|
|
bool Addressbook::canRespond(const TQString &uid)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::canRespond called with empty uid" << endl;
|
|
return false;
|
|
}
|
|
//this should return false if they are offline.
|
|
int result = presenceStatus(uid);
|
|
if(result == 3 || result == 4) return true;
|
|
return false;
|
|
}
|
|
TQString Addressbook::locate(const TQString &contactId, const TQString &protocol)
|
|
{
|
|
if(contactId.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::locate called with empty contactId" << endl;
|
|
return TQString();
|
|
}
|
|
if(protocol != "messaging/irc")
|
|
return TQString();
|
|
|
|
return getKABCAddresseeFromNick(contactId).uid();
|
|
}
|
|
TQPixmap Addressbook::icon(const TQString &uid)
|
|
{
|
|
|
|
Images* icons = KonversationApplication::instance()->images();
|
|
TQIconSet currentIcon;
|
|
if(!isPresent(uid))
|
|
return TQPixmap();
|
|
|
|
switch(presenceStatus(uid))
|
|
{
|
|
case 0: //Unknown
|
|
case 1: //Offline
|
|
case 2: //connecting - invalid for us?
|
|
currentIcon = icons->getKimproxyOffline();
|
|
break;
|
|
case 3: //Away
|
|
currentIcon = icons->getKimproxyAway();
|
|
break;
|
|
case 4: //Online
|
|
currentIcon = icons->getKimproxyOnline();
|
|
break;
|
|
default:
|
|
//error
|
|
kdDebug() << "Unknown status " << uid << endl;
|
|
return TQPixmap();
|
|
}
|
|
|
|
TQPixmap joinedIcon = currentIcon.pixmap(TQIconSet::Automatic, TQIconSet::Active, TQIconSet::On);
|
|
return joinedIcon;
|
|
}
|
|
TQString Addressbook::context(const TQString &uid)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::contact called with empty uid" << endl;
|
|
return TQString();
|
|
}
|
|
TQString context;
|
|
return context;
|
|
}
|
|
TQStringList Addressbook::protocols()
|
|
{
|
|
TQStringList protocols;
|
|
protocols.append("messaging/irc");
|
|
return protocols;
|
|
}
|
|
|
|
// ACTORS
|
|
/**
|
|
* Send a single message to the specified addressee
|
|
* Any response will be handled by the IM client as a normal
|
|
* conversation.
|
|
* @param uid the KABC uid you want to chat with.
|
|
* @param message the message to send them.
|
|
*/
|
|
void Addressbook::messageContact( const TQString &uid, const TQString& message )
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation for instant messaging, but did not specify any contact to send the message to. This is probably a bug in the other application."));
|
|
return;
|
|
}
|
|
KABC::Addressee addressee = addressBook->findByUid(uid);
|
|
if(addressee.isEmpty())
|
|
{
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation for instant messaging, but Konversation could not find the specified contact in the TDE address book."));
|
|
return;
|
|
}
|
|
NickInfoPtr nickInfo = getNickInfo(addressee);
|
|
if(!nickInfo)
|
|
{
|
|
TQString user = addressee.fullEmail();
|
|
if(!user.isEmpty()) user = " (" + user + ')';
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation for instant messaging, but the requested user%1 is not online.").arg(user));
|
|
return;
|
|
}
|
|
|
|
nickInfo->getServer()->dcopSay(nickInfo->getNickname(), message);
|
|
}
|
|
|
|
/**
|
|
* Open a chat to a contact, and optionally set some initial text
|
|
*/
|
|
void Addressbook::messageNewContact( const TQString &contactId, const TQString &/*protocol*/ ) {
|
|
if(contactId.isEmpty() )
|
|
{
|
|
kdDebug() << "Addressbook::messageNewContact called with empty contactid" << endl;
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation for instant messaging, but did not specify any contact to send the message to. This is probably a bug in the other application."));
|
|
return;
|
|
}
|
|
messageContact(contactId, TQString());
|
|
}
|
|
|
|
/**
|
|
* Start a chat session with the specified addressee
|
|
* @param uid the KABC uid you want to chat with.
|
|
*/
|
|
void Addressbook::chatWithContact( const TQString &uid )
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::chatWithContact called with empty uid" << endl;
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation for instant messaging, but did not specify any contact to send the message to. This is probably a bug in the other application."));
|
|
return;
|
|
}
|
|
messageContact(uid, TQString());
|
|
}
|
|
|
|
/**
|
|
* Send the file to the contact
|
|
* @param uid the KABC uid you are sending to.
|
|
* @param sourceURL a KURL to send.
|
|
* @param altFileName an alternate filename describing the file
|
|
* @param fileSize file size in bytes
|
|
*/
|
|
void Addressbook::sendFile(const TQString &uid, const KURL &sourceURL, const TQString &altFileName, uint fileSize)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation to send a file to a contact, but did not specify any contact to send the file to. This is probably a bug in the other application."));
|
|
return;
|
|
}
|
|
KABC::Addressee addressee = addressBook->findByUid(uid);
|
|
if(addressee.isEmpty())
|
|
{
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation to send a file to a contact, but Konversation could not find the specified contact in the TDE address book."));
|
|
return;
|
|
}
|
|
NickInfoPtr nickInfo = getNickInfo(addressee);
|
|
if(!nickInfo)
|
|
{
|
|
TQString user = addressee.fullEmail();
|
|
if(!user.isEmpty()) user = " (" + user + ')';
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation to send a file to a contact, but the requested user%1 is not currently online.").arg(user));
|
|
return;
|
|
}
|
|
nickInfo->getServer()->addDccSend(nickInfo->getNickname(), sourceURL, altFileName, fileSize);
|
|
TQWidget *widget = nickInfo->getServer()->getViewContainer()->getWindow();
|
|
KWin::demandAttention(widget->winId()); //If activeWindow request is denied, at least demand attention!
|
|
KWin::activateWindow(widget->winId()); //May or may not work, depending on focus stealing prevention.
|
|
|
|
}
|
|
|
|
// MUTATORS
|
|
// Contact list
|
|
/**
|
|
* Add a contact to the contact list
|
|
* @param contactId the protocol specific identifier for the contact, eg UIN for ICQ, screenname for AIM, nick for IRC.
|
|
* @param protocolId the protocol, eg one of "AIMProtocol", "MSNProtocol", "ICTQProtocol", ...
|
|
* @return whether the add succeeded. False may signal already present, protocol not supported, or add operation not supported.
|
|
*/
|
|
bool Addressbook::addContact( const TQString &/*contactId*/, const TQString &/*protocolId*/ ) {
|
|
focusAndShowErrorMessage(i18n("Another TDE application tried to use Konversation to add a contact. Konversation does support this."));
|
|
return false;
|
|
//Nicks are auto added if they are put in the addressbook - I don' think there is anything useful I can do.
|
|
}
|
|
|
|
void Addressbook::emitContactPresenceChanged(const TQString &uid, int presence)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
//This warning below is annoying. FIXME - disabled because it's too verbose
|
|
// kdDebug() << "Addressbook::emitContactPresenceChanged was called with empty uid" << endl;
|
|
return;
|
|
}
|
|
Q_ASSERT(kapp->dcopClient());
|
|
emit contactPresenceChanged(uid, kapp->dcopClient()->appId(), presence);
|
|
// kdDebug() << "Presence changed for uid " << uid << " to " << presence << endl;
|
|
}
|
|
|
|
void Addressbook::emitContactPresenceChanged(const TQString &uid)
|
|
{
|
|
if(uid.isEmpty())
|
|
{
|
|
kdDebug() << "Addressbook::emitContactPresenceChanged was called with empty uid" << endl;
|
|
return;
|
|
};
|
|
|
|
emitContactPresenceChanged(uid, presenceStatus(uid));
|
|
}
|
|
|
|
} //NAMESPACE
|
|
|
|
#include "addressbook.moc"
|