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.
222 lines
7.4 KiB
222 lines
7.4 KiB
/*
|
|
smpppdcsplugin.cpp
|
|
|
|
Copyright (c) 2002-2003 by Chris Howells <howells@kde.org>
|
|
Copyright (c) 2003 by Martijn Klingens <klingens@kde.org>
|
|
Copyright (c) 2004-2006 by Heiko Schaefer <heiko@rangun.de>
|
|
|
|
Kopete (c) 2002-2006 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; version 2 of the License. *
|
|
* *
|
|
*************************************************************************
|
|
*/
|
|
|
|
#include "onlineinquiry.h"
|
|
#include "smpppdcsplugin.h"
|
|
|
|
#include <qtimer.h>
|
|
|
|
#include <kdebug.h>
|
|
#include <kgenericfactory.h>
|
|
|
|
#include "kopeteprotocol.h"
|
|
#include "networkstatuscommon.h"
|
|
#include "kopetepluginmanager.h"
|
|
#include "kopeteaccountmanager.h"
|
|
|
|
#include "detectornetworkstatus.h"
|
|
#include "detectornetstat.h"
|
|
#include "detectorsmpppd.h"
|
|
#include "smpppdcsconfig.h"
|
|
|
|
typedef KGenericFactory<SMPPPDCSPlugin> SMPPPDCSPluginFactory;
|
|
K_EXPORT_COMPONENT_FACTORY(kopete_smpppdcs, SMPPPDCSPluginFactory("kopete_smpppdcs"))
|
|
|
|
SMPPPDCSPlugin::SMPPPDCSPlugin(QObject *parent, const char * name, const QStringList& /* args */)
|
|
: DCOPObject("SMPPPDCSIface"), Kopete::Plugin(SMPPPDCSPluginFactory::instance(), parent, name),
|
|
m_detectorSMPPPD(NULL), m_detectorNetstat(NULL), m_detectorNetworkStatus(NULL), m_timer(NULL),
|
|
m_onlineInquiry(NULL) {
|
|
|
|
kdDebug(14312) << k_funcinfo << endl;
|
|
|
|
m_pluginConnected = false;
|
|
|
|
m_onlineInquiry = new OnlineInquiry();
|
|
m_detectorSMPPPD = new DetectorSMPPPD(this);
|
|
m_detectorNetstat = new DetectorNetstat(this);
|
|
|
|
// experimental, not used yet
|
|
m_detectorNetworkStatus = new DetectorNetworkStatus(this);
|
|
|
|
// we wait for the allPluginsLoaded signal, to connect
|
|
// as early as possible after startup, but not before
|
|
// all accounts are ready
|
|
connect(Kopete::PluginManager::self(), SIGNAL(allPluginsLoaded()),
|
|
this, SLOT(allPluginsLoaded()));
|
|
|
|
// if kopete was already running and the plugin
|
|
// was loaded later, we check once after 15 secs
|
|
// if all other plugins have been loaded
|
|
QTimer::singleShot(15000, this, SLOT(allPluginsLoaded()));
|
|
}
|
|
|
|
SMPPPDCSPlugin::~SMPPPDCSPlugin() {
|
|
|
|
kdDebug(14312) << k_funcinfo << endl;
|
|
|
|
delete m_timer;
|
|
delete m_detectorSMPPPD;
|
|
delete m_detectorNetstat;
|
|
delete m_detectorNetworkStatus;
|
|
delete m_onlineInquiry;
|
|
}
|
|
|
|
void SMPPPDCSPlugin::allPluginsLoaded() {
|
|
|
|
if(Kopete::PluginManager::self()->isAllPluginsLoaded()) {
|
|
m_timer = new QTimer();
|
|
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotCheckStatus()));
|
|
|
|
if(SMPPPDCSConfig::self()->useSmpppd()) {
|
|
m_timer->start(30000);
|
|
} else {
|
|
// we use 1 min interval, because it reflects
|
|
// the old connectionstatus plugin behaviour
|
|
m_timer->start(60000);
|
|
}
|
|
|
|
slotCheckStatus();
|
|
}
|
|
}
|
|
|
|
bool SMPPPDCSPlugin::isOnline() const {
|
|
return m_onlineInquiry->isOnline(SMPPPDCSConfig::self()->useSmpppd());
|
|
}
|
|
|
|
void SMPPPDCSPlugin::slotCheckStatus() {
|
|
|
|
// reread config to get changes
|
|
SMPPPDCSConfig::self()->readConfig();
|
|
|
|
if(SMPPPDCSConfig::self()->useSmpppd()) {
|
|
m_detectorSMPPPD->checkStatus();
|
|
} else {
|
|
m_detectorNetstat->checkStatus();
|
|
}
|
|
}
|
|
|
|
void SMPPPDCSPlugin::setConnectedStatus( bool connected ) {
|
|
kdDebug(14312) << k_funcinfo << connected << endl;
|
|
|
|
// We have to handle a few cases here. First is the machine is connected, and the plugin thinks
|
|
// we're connected. Then we don't do anything. Next, we can have machine connected, but plugin thinks
|
|
// we're disconnected. Also, machine disconnected, plugin disconnected -- we
|
|
// don't do anything. Finally, we can have the machine disconnected, and the plugin thinks we're
|
|
// connected. This mechanism is required so that we don't keep calling the connect/disconnect functions
|
|
// constantly.
|
|
|
|
if ( connected && !m_pluginConnected ) {
|
|
// The machine is connected and plugin thinks we're disconnected
|
|
kdDebug(14312) << k_funcinfo << "Setting m_pluginConnected to true" << endl;
|
|
m_pluginConnected = true;
|
|
connectAllowed();
|
|
kdDebug(14312) << k_funcinfo << "We're connected" << endl;
|
|
} else if ( !connected && m_pluginConnected ) {
|
|
// The machine isn't connected and plugin thinks we're connected
|
|
kdDebug(14312) << k_funcinfo << "Setting m_pluginConnected to false" << endl;
|
|
m_pluginConnected = false;
|
|
disconnectAllowed();
|
|
kdDebug(14312) << k_funcinfo << "We're offline" << endl;
|
|
}
|
|
}
|
|
|
|
void SMPPPDCSPlugin::connectAllowed() {
|
|
|
|
QStringList list = SMPPPDCSConfig::self()->ignoredAccounts();
|
|
|
|
Kopete::AccountManager * m = Kopete::AccountManager::self();
|
|
for(QPtrListIterator<Kopete::Account> it(m->accounts())
|
|
;
|
|
it.current();
|
|
++it) {
|
|
|
|
#ifndef NDEBUG
|
|
if(it.current()->inherits("Kopete::ManagedConnectionAccount")) {
|
|
kdDebug(14312) << k_funcinfo << "Account " << it.current()->protocol()->pluginId() + "_" + it.current()->accountId() << " is an managed account!" << endl;
|
|
} else {
|
|
kdDebug(14312) << k_funcinfo << "Account " << it.current()->protocol()->pluginId() + "_" + it.current()->accountId() << " is an unmanaged account!" << endl;
|
|
}
|
|
#endif
|
|
|
|
if(!list.contains(it.current()->protocol()->pluginId() + "_" + it.current()->
|
|
accountId())) {
|
|
it.current()->connect();
|
|
}
|
|
}
|
|
}
|
|
|
|
void SMPPPDCSPlugin::disconnectAllowed() {
|
|
|
|
QStringList list = SMPPPDCSConfig::self()->ignoredAccounts();
|
|
|
|
Kopete::AccountManager * m = Kopete::AccountManager::self();
|
|
for(QPtrListIterator<Kopete::Account> it(m->accounts())
|
|
;
|
|
it.current();
|
|
++it) {
|
|
|
|
#ifndef NDEBUG
|
|
if(it.current()->inherits("Kopete::ManagedConnectionAccount")) {
|
|
kdDebug(14312) << k_funcinfo << "Account " << it.current()->protocol()->pluginId() + "_" + it.current()->accountId() << " is an managed account!" << endl;
|
|
} else {
|
|
kdDebug(14312) << k_funcinfo << "Account " << it.current()->protocol()->pluginId() + "_" + it.current()->accountId() << " is an unmanaged account!" << endl;
|
|
}
|
|
#endif
|
|
|
|
if(!list.contains(it.current()->protocol()->pluginId() + "_" + it.current()->accountId())) {
|
|
it.current()->disconnect();
|
|
}
|
|
}
|
|
}
|
|
|
|
QString SMPPPDCSPlugin::detectionMethod() const {
|
|
if(SMPPPDCSConfig::self()->useSmpppd()) {
|
|
return "smpppd";
|
|
} else {
|
|
return "netstat";
|
|
}
|
|
}
|
|
|
|
/*!
|
|
\fn SMPPPDCSPlugin::smpppdServerChanged(const QString& server)
|
|
*/
|
|
void SMPPPDCSPlugin::smpppdServerChanged(const QString& server) {
|
|
|
|
QString oldServer = SMPPPDCSConfig::self()->server().utf8();
|
|
|
|
if(oldServer != server) {
|
|
kdDebug(14312) << k_funcinfo << "Detected a server change" << endl;
|
|
m_detectorSMPPPD->smpppdServerChange();
|
|
}
|
|
}
|
|
|
|
void SMPPPDCSPlugin::aboutToUnload() {
|
|
|
|
kdDebug(14312) << k_funcinfo << endl;
|
|
|
|
if(m_timer) {
|
|
m_timer->stop();
|
|
}
|
|
|
|
emit readyForUnload();
|
|
}
|
|
|
|
#include "smpppdcsplugin.moc"
|
|
|
|
// vim: set noet ts=4 sts=4 sw=4:
|