/* connectionstatusplugin.cpp Copyright (c) 2002-2003 by Chris Howells Copyright (c) 2003 by Martijn Klingens Kopete (c) 2002-2003 by the Kopete developers ************************************************************************* * * * 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 "connectionstatusplugin.h" #include #include #include #include #include "kopeteaccountmanager.h" typedef KGenericFactory ConnectionStatusPluginFactory; K_EXPORT_COMPONENT_FACTORY( kopete_connectionstatus, ConnectionStatusPluginFactory( "kopete_connectionstatus" ) ) ConnectionStatusPlugin::ConnectionStatusPlugin( TQObject *parent, const char *name, const TQStringList& /* args */ ) : Kopete::Plugin( ConnectionStatusPluginFactory::instance(), parent, name ) { kdDebug( 14301 ) << k_funcinfo << endl; m_process = 0L; m_timer = new TQTimer(); connect( m_timer, TQ_SIGNAL( timeout() ), this, TQ_SLOT( slotCheckStatus() ) ); m_timer->start( 60000 ); m_pluginConnected = false; } ConnectionStatusPlugin::~ConnectionStatusPlugin() { kdDebug( 14301 ) << k_funcinfo << endl; delete m_timer; delete m_process; } void ConnectionStatusPlugin::slotCheckStatus() { kdDebug( 14301 ) << k_funcinfo << endl; if ( m_process ) { kdWarning( 14301 ) << k_funcinfo << "Previous netstat process is still running!" << endl << "Not starting new netstat. Perhaps your system is under heavy load?" << endl; return; } m_buffer = TQString(); // Use TDEProcess to run netstat -rn. We'll then parse the output of // netstat -rn in slotProcessStdout() to see if it mentions the // default gateway. If so, we're connected, if not, we're offline m_process = new TDEProcess; #if defined(__FreeBSD__) *m_process << "netstat" << "-rfinet"; #else *m_process << "netstat" << "-r"; #endif connect( m_process, TQ_SIGNAL( receivedStdout( TDEProcess *, char *, int ) ), this, TQ_SLOT( slotProcessStdout( TDEProcess *, char *, int ) ) ); connect( m_process, TQ_SIGNAL( processExited( TDEProcess * ) ), this, TQ_SLOT( slotProcessExited( TDEProcess * ) ) ); if ( !m_process->start( TDEProcess::NotifyOnExit, TDEProcess::Stdout ) ) { kdWarning( 14301 ) << k_funcinfo << "Unable to start netstat process!" << endl; delete m_process; m_process = 0L; } } void ConnectionStatusPlugin::slotProcessExited( TDEProcess *process ) { kdDebug( 14301 ) << m_buffer << endl; if ( process == m_process ) { setConnectedStatus( m_buffer.contains( "default" ) ); m_buffer = TQString(); delete m_process; m_process = 0L; } } void ConnectionStatusPlugin::slotProcessStdout( TDEProcess *, char *buffer, int buflen ) { // Look for a default gateway //kdDebug( 14301 ) << k_funcinfo << endl; m_buffer += TQString::fromLatin1( buffer, buflen ); //kdDebug( 14301 ) << qsBuffer << endl; } void ConnectionStatusPlugin::setConnectedStatus( bool connected ) { //kdDebug( 14301 ) << k_funcinfo << 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( 14301 ) << k_funcinfo << "Setting m_pluginConnected to true" << endl; m_pluginConnected = true; Kopete::AccountManager::self()->connectAll(); kdDebug( 14301 ) << k_funcinfo << "We're connected" << endl; } else if ( !connected && m_pluginConnected ) { // The machine isn't connected and plugin thinks we're connected kdDebug( 14301 ) << k_funcinfo << "Setting m_pluginConnected to false" << endl; m_pluginConnected = false; Kopete::AccountManager::self()->disconnectAll(); kdDebug( 14301 ) << k_funcinfo << "We're offline" << endl; } } #include "connectionstatusplugin.moc"