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.
tdenetwork/kopete/protocols/gadu/gaduprotocol.cpp

244 lines
8.1 KiB

// -*- Mode: c++-mode; c-basic-offset: 2; indent-tabs-mode: t; tab-width: 2; -*-
//
// Copyright (C) 2003 Grzegorz Jaskiewicz <gj at pointblue.com.pl>
// Copyright (C) 2002-2003 Zack Rusin <zack@kde.org>
//
// gaduprotocol.cpp
//
// 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 program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
// 02110-1301, USA.
#include <kdebug.h>
#include <kgenericfactory.h>
#include <kconfig.h>
#include <libgadu.h>
#include "gaduaccount.h"
#include "gaducontact.h"
#include "gaduprotocol.h"
#include "gadueditaccount.h"
#include "gaduaddcontactpage.h"
#include "kopeteaccountmanager.h"
#include "kopeteaccount.h"
#include "kopetemetacontact.h"
#include "kopeteglobal.h"
#include "kopeteonlinestatusmanager.h"
typedef KGenericFactory<GaduProtocol> GaduProtocolFactory;
K_EXPORT_COMPONENT_FACTORY( kopete_gadu, KGenericFactory<GaduProtocol>( "kopete_gadu" ) )
GaduProtocol* GaduProtocol::protocolStatic_ = 0L;
GaduProtocol::GaduProtocol( TQObject* parent, const char* name, const TQStringList& )
:Kopete::Protocol( GaduProtocolFactory::instance(), parent, name ),
propFirstName(Kopete::Global::Properties::self()->firstName()),
propLastName(Kopete::Global::Properties::self()->lastName()),
propEmail(Kopete::Global::Properties::self()->emailAddress()),
propAwayMessage(Kopete::Global::Properties::self()->awayMessage()),
propPhoneNr(Kopete::Global::Properties::self()->privatePhone()),
defaultAccount_( 0 ),
gaduStatusBlocked_( Kopete::OnlineStatus::Away, GG_STATUS_BLOCKED, this, GG_STATUS_BLOCKED,
"gg_ignored", i18n( "Blocked" ) ),
gaduStatusOffline_( Kopete::OnlineStatus::Offline, GG_STATUS_NOT_AVAIL, this, GG_STATUS_NOT_AVAIL,
"gg_offline", i18n( "Offline" ) , i18n( "O&ffline" ) , Kopete::OnlineStatusManager::Offline ),
gaduStatusOfflineDescr_( Kopete::OnlineStatus::Offline, GG_STATUS_NOT_AVAIL_DESCR, this, GG_STATUS_NOT_AVAIL_DESCR,
TQStringList::split( '|', "contact_away_overlay|gg_description_overlay" ), i18n( "Offline" ), i18n( "A&way" ) , Kopete::OnlineStatusManager::Offline ),
gaduStatusBusy_(Kopete::OnlineStatus::Away, GG_STATUS_BUSY, this, GG_STATUS_BUSY,
"contact_away_overlay", i18n( "Busy" ) , i18n( "B&usy" ) , Kopete::OnlineStatusManager::Busy ),
gaduStatusBusyDescr_(Kopete::OnlineStatus::Away, GG_STATUS_BUSY_DESCR, this, GG_STATUS_BUSY_DESCR,
TQStringList::split( '|', "contact_away_overlay|gg_description_overlay" ), i18n( "Busy" ) , i18n( "B&usy" ) , Kopete::OnlineStatusManager::Idle ),
gaduStatusInvisible_( Kopete::OnlineStatus::Invisible, GG_STATUS_INVISIBLE, this, GG_STATUS_INVISIBLE,
"contact_invisible_overlay", i18n( "Invisible" ) , i18n( "I&nvisible" ) , Kopete::OnlineStatusManager::Invisible),
gaduStatusInvisibleDescr_(Kopete::OnlineStatus::Invisible, GG_STATUS_INVISIBLE_DESCR, this, GG_STATUS_INVISIBLE_DESCR,
TQStringList::split( '|', "contact_invisible_overlay|gg_description_overlay" ), i18n( "Invisible" ) , i18n( "I&nvisible" )),
gaduStatusAvail_(Kopete::OnlineStatus::Online, GG_STATUS_AVAIL, this, GG_STATUS_AVAIL,
TQString::null, i18n( "Online" ) , i18n( "&Online" ) , Kopete::OnlineStatusManager::Online ),
gaduStatusAvailDescr_(Kopete::OnlineStatus::Online, GG_STATUS_AVAIL_DESCR, this, GG_STATUS_AVAIL_DESCR,
"gg_description_overlay", i18n( "Online" ) , i18n( "&Online" )),
gaduConnecting_(Kopete::OnlineStatus::Offline, GG_STATUS_CONNECTING, this, GG_STATUS_CONNECTING,
"gg_con", i18n( "Connecting" ) )
{
if ( protocolStatic_ ) {
kdDebug(14100)<<"####"<<"GaduProtocol already initialized"<<endl;
}
else {
protocolStatic_ = this;
}
addAddressBookField( "messaging/gadu", Kopete::Plugin::MakeIndexField );
setCapabilities( Kopete::Protocol::RichFormatting | Kopete::Protocol::RichFgColor );
}
GaduProtocol::~GaduProtocol()
{
protocolStatic_ = 0L;
}
GaduProtocol*
GaduProtocol::protocol()
{
return protocolStatic_;
}
AddContactPage*
GaduProtocol::createAddContactWidget( TQWidget* parent, Kopete::Account* account )
{
return new GaduAddContactPage( static_cast<GaduAccount*>( account ), parent );
}
void
GaduProtocol::settingsChanged()
{
}
Kopete::Contact *
GaduProtocol::deserializeContact( Kopete::MetaContact* metaContact,
const TQMap<TQString, TQString>& serializedData,
const TQMap<TQString, TQString>& /* addressBookData */ )
{
const TQString aid = serializedData[ "accountId" ];
const TQString cid = serializedData[ "contactId" ];
const TQString dn = serializedData[ "displayName" ];
TQDict<Kopete::Account> daccounts = Kopete::AccountManager::self()->accounts( this );
Kopete::Account* account = daccounts[ aid ];
if (!account) {
account = createNewAccount(aid);
}
GaduAccount* gaccount = static_cast<GaduAccount *>( account );
GaduContact* contact = new GaduContact( cid.toUInt(), dn, account, metaContact );
contact->setParentIdentity( aid );
gaccount->addNotify( cid.toUInt() );
contact->setProperty( propEmail, serializedData["email"] );
contact->setProperty( propFirstName, serializedData["FirstName"] );
contact->setProperty( propLastName, serializedData["SecondName"] );
contact->setProperty( propPhoneNr, serializedData["telephone"] );
contact->setIgnored(serializedData["ignored"] == "true");
return contact;
}
uint
GaduProtocol::statusToWithDescription( Kopete::OnlineStatus status )
{
if ( status == gaduStatusOffline_ || status == gaduStatusOfflineDescr_ ) {
return GG_STATUS_NOT_AVAIL_DESCR;
}
if ( status == gaduStatusBusyDescr_ || status == gaduStatusBusy_ ){
return GG_STATUS_BUSY_DESCR;
}
if ( status == gaduStatusInvisibleDescr_ || status == gaduStatusInvisible_ ){
return GG_STATUS_INVISIBLE_DESCR;
}
return GG_STATUS_AVAIL_DESCR;
}
uint
GaduProtocol::statusToWithoutDescription( Kopete::OnlineStatus status )
{
if ( status == gaduStatusOffline_ || status == gaduStatusOfflineDescr_ ) {
return GG_STATUS_NOT_AVAIL;
}
if ( status == gaduStatusBusyDescr_ || status == gaduStatusBusy_ ){
return GG_STATUS_BUSY;
}
if ( status == gaduStatusInvisibleDescr_ || status == gaduStatusInvisible_ ){
return GG_STATUS_INVISIBLE;
}
return GG_STATUS_AVAIL;
}
bool
GaduProtocol::statusWithDescription( uint status )
{
switch( status ) {
case GG_STATUS_NOT_AVAIL:
case GG_STATUS_BUSY:
case GG_STATUS_INVISIBLE:
case GG_STATUS_AVAIL:
case GG_STATUS_CONNECTING:
case GG_STATUS_BLOCKED:
return false;
case GG_STATUS_INVISIBLE_DESCR:
case GG_STATUS_NOT_AVAIL_DESCR:
case GG_STATUS_BUSY_DESCR:
case GG_STATUS_AVAIL_DESCR:
return true;
}
return false;
}
Kopete::OnlineStatus
GaduProtocol::convertStatus( uint status ) const
{
switch( status ) {
case GG_STATUS_NOT_AVAIL:
return gaduStatusOffline_;
case GG_STATUS_NOT_AVAIL_DESCR:
return gaduStatusOfflineDescr_;
case GG_STATUS_BUSY:
return gaduStatusBusy_;
case GG_STATUS_BUSY_DESCR:
return gaduStatusBusyDescr_;
case GG_STATUS_INVISIBLE:
return gaduStatusInvisible_;
case GG_STATUS_INVISIBLE_DESCR:
return gaduStatusInvisibleDescr_;
case GG_STATUS_AVAIL:
return gaduStatusAvail_;
case GG_STATUS_AVAIL_DESCR:
return gaduStatusAvailDescr_;
case GG_STATUS_CONNECTING:
return gaduConnecting_;
case GG_STATUS_BLOCKED:
return gaduStatusBlocked_;
default:
return gaduStatusOffline_;
}
}
Kopete::Account*
GaduProtocol::createNewAccount( const TQString& accountId )
{
defaultAccount_ = new GaduAccount( this, accountId );
return defaultAccount_ ;
}
KopeteEditAccountWidget*
GaduProtocol::createEditAccountWidget( Kopete::Account* account, TQWidget* parent )
{
return( new GaduEditAccount( this, account, parent ) );
}
#include "gaduprotocol.moc"