#include #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 = Inactive; updateStatus(); } void ConnectionManager::updateStatus() { NetworkStatus::EnumStatus daemonStatus = (NetworkStatus::EnumStatus)d->m_stub->status( TQString() ); kdDebug() << k_funcinfo << endl; switch ( daemonStatus ) { case NetworkStatus::Offline: case NetworkStatus::OfflineFailed: case NetworkStatus::OfflineDisconnected: case NetworkStatus::ShuttingDown: if ( d->m_state == Online ) { kdDebug() << "STATE IS PENDING" << endl; d->m_state = Pending; } else { kdDebug() << "STATE IS OFFLINE" << endl; d->m_state = Offline; } break; case NetworkStatus::Establishing: case NetworkStatus::Online: kdDebug() << "STATE IS ONLINE" << endl; d->m_state = Online; break; case NetworkStatus::NoNetworks: case NetworkStatus::Unreachable: kdDebug() << "STATE IS INACTIVE" << endl; d->m_state = Inactive; break; } } ConnectionManager::~ConnectionManager() { delete d; } NetworkStatus::EnumStatus ConnectionManager::status( const TQString & host ) { // need also to check that the daemon hasn't died updateStatus(); if ( d->m_state == Pending ) return NetworkStatus::Offline; if ( d->m_state == Online ) return NetworkStatus::Online; if ( d->m_state == Offline ) return NetworkStatus::Offline; return NetworkStatus::NoNetworks; } NetworkStatus::EnumRequestResult ConnectionManager::requestConnection( TQWidget * mainWidget, const TQString & host, bool userInitiated ) { kdDebug() << k_funcinfo << endl; 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::Connected; 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 ) { kdDebug() << k_funcinfo << endl; 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?" ); 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("Stay Offline"), TQString::fromLatin1("OfflineModeAlwaysGoOnline") ) == KMessageBox::Yes ); } #include "connectionmanager.moc"