Merge branch 'master' of https://git.maemo.org/projects/qtmeetings
[qtmeetings] / src / IO / DeviceControl / DeviceManager.cpp
index c38647c..518a7d3 100644 (file)
@@ -4,11 +4,18 @@
 #include "StartupSettings.h"
 #include "DeviceDataStorage.h"
 #include "DeviceConfigurator.h"
+#include "OperationModeToggler.h"
 
 #include <QtDebug>
 #include <QStringList>
 
-DeviceManager::DeviceManager( StartupSettings *aSettings )
+DeviceManager::DeviceManager( StartupSettings *aSettings ) :
+       iAlarmSender( 0 ),
+       iHWKeyListener( 0 ),
+       iSettings( 0 ),
+       iDataStorage( 0 ),
+       iConfigurator( 0 ),
+       iModeToggler( 0 )
 {
        qDebug() << "DeviceManager::DeviceManager( StartupSettings * )";
 
@@ -19,11 +26,24 @@ DeviceManager::DeviceManager( StartupSettings *aSettings )
 DeviceManager::~DeviceManager()
 {
        qDebug() << "DeviceManager::~DeviceManager()";
+       delete iDataStorage;
+       iDataStorage = 0;
+       delete iAlarmSender;
+       iAlarmSender = 0;
+       delete iConfigurator;
+       iConfigurator = 0;
+       delete iDataStorage;
+       iDataStorage = 0;
+       delete iHWKeyListener;
+       iHWKeyListener = 0;
 }
 
 void DeviceManager::initDeviceManager()
 {
        qDebug() << "DeviceManager::init()";
+       
+       qRegisterMetaType<DeviceManager::ErrorCode>("DeviceManager::ErrorCode");
+       
        iDataStorage = new DeviceDataStorage();
        connect( iDataStorage, SIGNAL( dataStorageInitFailed( DeviceManager::ErrorCode ) ),
                        this, SLOT( errorSender( DeviceManager::ErrorCode ) ) );
@@ -40,7 +60,7 @@ void DeviceManager::initDeviceManager()
                iMode = EmptyMode;
 
        iHWKeyListener = new HWKeyListener();
-       handleKeyPresses( true );
+       handleHWKeyPresses( true );
 }
 
 DeviceManager::OperationMode DeviceManager::currentOperationMode()
@@ -61,95 +81,23 @@ QString DeviceManager::operationModeToString( OperationMode aMode )
        }
 }
 
-void DeviceManager::changeMode( bool aChange )
+void DeviceManager::changeMode()
 {
        qDebug() << "void DeviceManager::changeMode()";
-       if( !aChange ) {
-               handleKeyPresses( true );
-               return;
-       }
-       
-       switch ( iMode )
-       {
-               case EmptyMode:
-                       // error occured. Mode cannot be changed
-                       errorSender( ModeNotFetched );
-                       handleKeyPresses( true );
-                       break;
-               case StandAloneMode:
-
-                       // change to KioskMode
-                       emit changingMode( "Changing to Kiosk mode" );
-                       while( 1 );
-
-                       // check if auto turn on/off functionality enabled and send turn on/off alarm events to alarm daemon
-                       if ( iSettings->isPowersavingEnabled() )
-                       {
-                               if ( !iAlarmSender->sendAlarms( iSettings->turnOnAt(), iSettings->turnOffAt() ) )
-                               {
-                                       handleKeyPresses( true );
-                                       return; //this is critical so returning if no success
-                               }
-                       }
-
-                       // - disable the certain hw keys (only "home"-hw-key at the moment)
-                       // - register init script to launch the application when ever the device is launched
-                       // - disable the screen "auto-switch-off" and "dimming"
-                       // - store info about the new operation mode
-                       if ( !iConfigurator->toggleHWKeys( false ) ||
-                                 !iConfigurator->toggleInitScript( true ) ||
-                                 !iConfigurator->toggleScreenSwitchOff( false ) ||
-                                 !this->storeOperationMode( KioskMode ) ||
-                                 !iConfigurator->restartDevice() )
-                       {
-
-                               // we have to roll back if something fails
-                               // of course rolling back may fail as well but it is impossible to catch
-                               iSendErrorMessages = false;
-                               iAlarmSender->removeAlarms();
-                               iConfigurator->toggleHWKeys( true );
-                               iConfigurator->toggleInitScript( false );
-                               iConfigurator->toggleScreenSwitchOff( true );
-                               iSendErrorMessages = true;
-                               handleKeyPresses( true );
-                               return;
-                       }
-                       break;
-
-               case KioskMode:
-                       // change to StandAloneInProgress mode
-
-                       // - enable the certain hw keys (only "home"-hw-key at the moment)
-                       // - unregister the init script
-                       // - enable the screen "auto-switch-off" and "dimming"
-                       // - store info about the new operation mode
-                       if (    !iConfigurator->toggleHWKeys( true ) ||
-                                 !iConfigurator->toggleScreenSwitchOff( true ) ||
-                                 !this->storeOperationMode( StandAloneModeInProgress ) ||
-                                 !iAlarmSender->removeStoredAlarms() ||
-                                 !iConfigurator->restartDevice() )
-                       {
-                               // we have to roll back if something fails
-                               // of course rolling back may fail as well but it is impossible to catch
-                               iSendErrorMessages = false;
-                               iConfigurator->toggleHWKeys( false );
-                               iConfigurator->toggleInitScript( true );
-                               iConfigurator->toggleScreenSwitchOff( false );
-                               this->storeOperationMode( KioskMode );
-                               iSendErrorMessages = true;
-                               handleKeyPresses( true );
-                               return;
-                       }
-
-                       break;
-               default: // StandAloneModeInProgress should never come in question
-                       break;
+       if( iModeToggler == 0 ) {
+               iModeToggler = new OperationModeToggler( iMode, iSettings, iAlarmSender, iConfigurator, iDataStorage );
+               connect( iModeToggler, SIGNAL( finished() ), this, SLOT( modeChanged() ) );
+               connect( iModeToggler, SIGNAL( error( DeviceManager::ErrorCode, const QString & ) ),
+                               this, SLOT( errorSender( DeviceManager::ErrorCode, const QString & ) ) );
+               connect( iModeToggler, SIGNAL( changingMode( const QString & ) ), this, SIGNAL( changingMode( const QString & ) ) );
+               connect( iModeToggler, SIGNAL( toggleErrorSending( bool ) ), this, SLOT( toggleErrorSending( bool ) ) );
+               iModeToggler->start();
        }
 }
 
 bool DeviceManager::setCurrentOperationMode()
 {
-       qDebug() << "DeviceManager::currentOperationMode()";
+       qDebug() << "DeviceManager::setCurrentOperationMode()";
        QStringList modeResult;
        if ( !iDataStorage->readData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeResult ) )
        {
@@ -175,47 +123,24 @@ bool DeviceManager::setCurrentOperationMode()
        return true;
 }
 
-bool DeviceManager::storeOperationMode( OperationMode aMode )
-{
-       qDebug() << "DeviceManager::storeOperationMode( const OperationMode & )";
-       QStringList modeStrList;
-       QString str;
-       modeStrList.append( str.append( QString( "%1" ).arg( aMode ) ) );
-       if ( !iDataStorage->storeData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeStrList ) )
-       {
-               errorSender( ModeNotStored );
-               return false;
-       }
-       return true;
-}
-
 bool DeviceManager::finalizeStandAloneMode()
 {
        qDebug() << "DeviceManager::finalizeStandAloneMode()";
-       if ( !storeOperationMode( StandAloneMode ) || !iConfigurator->toggleInitScript( false ) )
+       if ( !OperationModeToggler::storeOperationMode( StandAloneMode, iDataStorage ) || !iConfigurator->toggleInitScript( false ) ) {
+               errorSender( DeviceManager::ModeNotStored );
                return false;
+       }
        return true;
 }
 
-void DeviceManager::handleKeyPresses( bool aHandle )
-{
-       qDebug() << "DeviceManager::handleKeyPresses( bool )";
-       if ( !aHandle )
-               disconnect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
-       else
-               connect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
-}
-
 void DeviceManager::HWKeyFullScreenPressed()
 {
        qDebug() << "DeviceManager::HWKeyFullScreenPressed()";
-       
+       handleHWKeyPresses( false );
        // no more key presses before this one is handled
-       handleKeyPresses( false );
-       
+       //handleKeyPresses( false );
        OperationMode nextMode;
-       switch ( iMode )
-       {
+       switch ( iMode ) {
                case KioskMode:
                        nextMode = StandAloneMode;
                        break;
@@ -228,8 +153,6 @@ void DeviceManager::HWKeyFullScreenPressed()
        }
        if ( nextMode != EmptyMode )
                emit changeModeOrdered( nextMode );
-       else
-               handleKeyPresses( true );
 }
 
 void DeviceManager::errorSender( DeviceManager::ErrorCode aErrorCode, const QString &aAddInfo )
@@ -241,3 +164,35 @@ void DeviceManager::errorSender( DeviceManager::ErrorCode aErrorCode, const QStr
 
        emit error( ERROR_BASE + ( int )aErrorCode, aAddInfo ); 
 }
+
+void DeviceManager::toggleErrorSending( bool aToggle )
+{
+       qDebug() << "DeviceManager::toggleErrorSending( bool )";
+       iSendErrorMessages = aToggle;
+}
+
+void DeviceManager::modeChanged()
+{
+       qDebug() << "DeviceManager::modeChanged()";
+       if( iModeToggler != 0 ) {
+               if ( iModeToggler->success() ) {//mode changing went well
+                       emit changingMode( "Restarting device" );
+                       sleep( 2 );
+                       iConfigurator->restartDevice();
+               }
+               else
+                       emit changeModeFailed();
+               delete iModeToggler;
+               iModeToggler = 0;
+       }
+       handleHWKeyPresses( true );
+}
+
+void DeviceManager::handleHWKeyPresses( bool aToggle )
+{
+       qDebug() << "DeviceManager::handleHWKeyPresses( bool )";
+       if( aToggle )
+               connect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
+       else
+               disconnect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
+}