/* This file is part of tdepim. Copyright (c) 2005 Will Stephenson This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include #include "clientiface_stub.h" #include "networkstatuscommon.h" #include "connectionmanager.h" // ConnectionManager's private parts class ConnectionManagerPrivate { public: // this holds the currently active state ConnectionManager::State m_state; ClientIface_stub * m_stub; bool m_userInitiatedOnly; }; // Connection manager itself ConnectionManager::ConnectionManager( TQObject * parent, const char * name ) : DCOPObject( "ConnectionManager" ),TQObject( parent, name ) { d = new ConnectionManagerPrivate; d->m_stub = new ClientIface_stub( kapp->dcopClient(), "kded", "networkstatus" ); connectDCOPSignal( "kded", "networkstatus", "statusChange(TQString,int)", "slotStatusChanged(TQString,int)", false ); d->m_userInitiatedOnly = false; initialise(); } ConnectionManager *ConnectionManager::s_self = 0L; ConnectionManager *ConnectionManager::self() { static KStaticDeleter deleter; if(!s_self) deleter.setObject( s_self, new ConnectionManager( 0, "connection_manager" ) ); return s_self; } void ConnectionManager::initialise() { // determine initial state and set the state object accordingly. d->m_state = Offline; updateStatus(); } void ConnectionManager::updateStatus() { /*NetworkStatus::EnumStatus daemonStatus = (NetworkStatus::EnumStatus)d->m_stub->status( TQString::null ); switch ( daemonStatus ) { case Offline: case OfflineFailed: case OfflineDisconnected: case ShuttingDown: if ( d->m_state == Online ) d->m_state = Pending; else d->m_state = Offline; break; case Establishing: case Online: d->m_state = Online; break; case NoNetworks: case Unreachable: d->m_state = Inactive; break; }*/ } ConnectionManager::~ConnectionManager() { delete d; } NetworkStatus::EnumStatus ConnectionManager::status( const TQString & host ) { if ( d->m_state == Inactive ) return NetworkStatus::NoNetworks; else return NetworkStatus::Offline; } NetworkStatus::EnumRequestResult ConnectionManager::requestConnection( TQWidget * mainWidget, const TQString & host, bool userInitiated ) { NetworkStatus::EnumRequestResult result; // if offline and the user has previously indicated they didn't want any new connections, suppress it if ( d->m_state == Offline && !userInitiated && d->m_userInitiatedOnly ) result = NetworkStatus::UserRefused; // if offline, ask the user whether this connection should be allowed if ( d->m_state == Offline ) { if ( askToConnect( mainWidget ) ) result = (NetworkStatus::EnumRequestResult)d->m_stub->request( host, userInitiated ); else result = NetworkStatus::UserRefused; } // otherwise, just ask for the connection else result = (NetworkStatus::EnumRequestResult)d->m_stub->request( host, userInitiated ); return result; } void ConnectionManager::relinquishConnection( const TQString & host ) { d->m_stub->relinquish( host ); } void ConnectionManager::slotStatusChanged( TQString host, int status ) { updateStatus(); // reset user initiated only flag if we are now online if ( d->m_state == Online ) d->m_userInitiatedOnly = false; emit statusChanged( host, (NetworkStatus::EnumStatus)status ); } bool ConnectionManager::askToConnect( TQWidget * mainWidget ) { i18n( "A network connection was disconnected. The application is now in offline mode. Do you want the application to resume network operations when the network is available again?" ); i18n( "This application is currently in offline mode. Do you want to connect?" ); i18n( "Message shown when a network connection failed. The placeholder contains the concrete description of the operation eg 'while performing this operation", "A network connection failed %1. Do you want to place the application in offline mode?" ); return ( KMessageBox::questionYesNo( mainWidget, i18n("This application is currently in offline mode. Do you want to connect in order to carry out this operation?"), i18n("Leave Offline Mode?"), i18n("Connect"), i18n("Do Not Connect"), TQString::fromLatin1("OfflineModeAlwaysGoOnline") ) == KMessageBox::Yes ); } #include "connectionmanager.moc"