Merge branch 'master' of https://git.maemo.org/projects/qtmeetings
[qtmeetings] / src / IO / DeviceControl / DeviceManager.cpp
1 #include "DeviceManager.h"
2 #include "AlarmSender.h"
3 #include "HWKeyListener.h"
4 #include "StartupSettings.h"
5 #include "DeviceDataStorage.h"
6 #include "DeviceConfigurator.h"
7 #include "OperationModeToggler.h"
8
9 #include <QtDebug>
10 #include <QStringList>
11
12 DeviceManager::DeviceManager( StartupSettings *aSettings ) :
13         iAlarmSender( 0 ),
14         iHWKeyListener( 0 ),
15         iSettings( 0 ),
16         iDataStorage( 0 ),
17         iConfigurator( 0 ),
18         iModeToggler( 0 )
19 {
20         qDebug() << "DeviceManager::DeviceManager( StartupSettings * )";
21
22         iSettings = aSettings;
23         iSendErrorMessages = true;
24 }
25
26 DeviceManager::~DeviceManager()
27 {
28         qDebug() << "DeviceManager::~DeviceManager()";
29         delete iDataStorage;
30         iDataStorage = 0;
31         delete iAlarmSender;
32         iAlarmSender = 0;
33         delete iConfigurator;
34         iConfigurator = 0;
35         delete iDataStorage;
36         iDataStorage = 0;
37         delete iHWKeyListener;
38         iHWKeyListener = 0;
39 }
40
41 void DeviceManager::initDeviceManager()
42 {
43         qDebug() << "DeviceManager::init()";
44         
45         qRegisterMetaType<DeviceManager::ErrorCode>("DeviceManager::ErrorCode");
46         
47         iDataStorage = new DeviceDataStorage();
48         connect( iDataStorage, SIGNAL( dataStorageInitFailed( DeviceManager::ErrorCode ) ),
49                         this, SLOT( errorSender( DeviceManager::ErrorCode ) ) );
50
51         iAlarmSender = new AlarmSender( iDataStorage );
52         connect( iAlarmSender, SIGNAL( alarmSendingFailed( DeviceManager::ErrorCode, const QString& ) ),
53                         this, SLOT( errorSender( DeviceManager::ErrorCode, const QString& ) ) );
54
55         iConfigurator = new DeviceConfigurator( iDataStorage );
56         connect( iConfigurator, SIGNAL( configuringError( DeviceManager::ErrorCode ) ),
57                         this, SLOT( errorSender( DeviceManager::ErrorCode ) ) );
58
59         if ( !iDataStorage->initDataStorage() || !setCurrentOperationMode() )
60                 iMode = EmptyMode;
61
62         iHWKeyListener = new HWKeyListener();
63         handleHWKeyPresses( true );
64 }
65
66 DeviceManager::OperationMode DeviceManager::currentOperationMode()
67 {
68         return iMode;
69 }
70
71 QString DeviceManager::operationModeToString( OperationMode aMode )
72 {
73         switch ( aMode )
74         {
75                 case KioskMode:
76                         return "Kiosk-mode";
77                 case StandAloneMode:
78                         return "Stand Alone-mode";
79                 default:
80                         return "";
81         }
82 }
83
84 void DeviceManager::changeMode()
85 {
86         qDebug() << "void DeviceManager::changeMode()";
87         if( iModeToggler == 0 ) {
88                 iModeToggler = new OperationModeToggler( iMode, iSettings, iAlarmSender, iConfigurator, iDataStorage );
89                 connect( iModeToggler, SIGNAL( finished() ), this, SLOT( modeChanged() ) );
90                 connect( iModeToggler, SIGNAL( error( DeviceManager::ErrorCode, const QString & ) ),
91                                 this, SLOT( errorSender( DeviceManager::ErrorCode, const QString & ) ) );
92                 connect( iModeToggler, SIGNAL( changingMode( const QString & ) ), this, SIGNAL( changingMode( const QString & ) ) );
93                 connect( iModeToggler, SIGNAL( toggleErrorSending( bool ) ), this, SLOT( toggleErrorSending( bool ) ) );
94                 iModeToggler->start();
95         }
96 }
97
98 bool DeviceManager::setCurrentOperationMode()
99 {
100         qDebug() << "DeviceManager::setCurrentOperationMode()";
101         QStringList modeResult;
102         if ( !iDataStorage->readData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeResult ) )
103         {
104                 errorSender( ModeNotFetched );
105                 return false;
106         }
107         else
108         {
109                 if ( !modeResult.empty() )
110                 {
111                         iMode = ( OperationMode )modeResult.at( 0 ).toInt();
112                         if ( iMode == StandAloneModeInProgress )
113                         {
114                                 if ( !finalizeStandAloneMode() )
115                                         iMode = EmptyMode;
116                                 else
117                                         iMode = StandAloneMode;
118                         }
119                 }
120                 else //this must be the first time, so no mode info saved yet
121                         iMode = StandAloneMode;
122         }
123         return true;
124 }
125
126 bool DeviceManager::finalizeStandAloneMode()
127 {
128         qDebug() << "DeviceManager::finalizeStandAloneMode()";
129         if ( !OperationModeToggler::storeOperationMode( StandAloneMode, iDataStorage ) || !iConfigurator->toggleInitScript( false ) ) {
130                 errorSender( DeviceManager::ModeNotStored );
131                 return false;
132         }
133         return true;
134 }
135
136 void DeviceManager::HWKeyFullScreenPressed()
137 {
138         qDebug() << "DeviceManager::HWKeyFullScreenPressed()";
139         handleHWKeyPresses( false );
140         // no more key presses before this one is handled
141         //handleKeyPresses( false );
142         OperationMode nextMode;
143         switch ( iMode ) {
144                 case KioskMode:
145                         nextMode = StandAloneMode;
146                         break;
147                 case StandAloneMode:
148                         nextMode = KioskMode;
149                         break;
150                 default:
151                         nextMode = EmptyMode;
152                         break;
153         }
154         if ( nextMode != EmptyMode )
155                 emit changeModeOrdered( nextMode );
156 }
157
158 void DeviceManager::errorSender( DeviceManager::ErrorCode aErrorCode, const QString &aAddInfo )
159 {
160         qDebug() << "DeviceManager::errorSender( ErrorCode, QString & )";
161         qDebug() << "DeviceManager::errorSender: aErrorCode == " << aErrorCode << " " << aAddInfo;
162         if ( !iSendErrorMessages )
163                 return;
164
165         emit error( ERROR_BASE + ( int )aErrorCode, aAddInfo ); 
166 }
167
168 void DeviceManager::toggleErrorSending( bool aToggle )
169 {
170         qDebug() << "DeviceManager::toggleErrorSending( bool )";
171         iSendErrorMessages = aToggle;
172 }
173
174 void DeviceManager::modeChanged()
175 {
176         qDebug() << "DeviceManager::modeChanged()";
177         if( iModeToggler != 0 ) {
178                 if ( iModeToggler->success() ) {//mode changing went well
179                         emit changingMode( "Restarting device" );
180                         sleep( 2 );
181                         iConfigurator->restartDevice();
182                 }
183                 else
184                         emit changeModeFailed();
185                 delete iModeToggler;
186                 iModeToggler = 0;
187         }
188         handleHWKeyPresses( true );
189 }
190
191 void DeviceManager::handleHWKeyPresses( bool aToggle )
192 {
193         qDebug() << "DeviceManager::handleHWKeyPresses( bool )";
194         if( aToggle )
195                 connect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
196         else
197                 disconnect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
198 }