c38647cccc432243518d1825633f3023ddb36673
[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
8 #include <QtDebug>
9 #include <QStringList>
10
11 DeviceManager::DeviceManager( StartupSettings *aSettings )
12 {
13         qDebug() << "DeviceManager::DeviceManager( StartupSettings * )";
14
15         iSettings = aSettings;
16         iSendErrorMessages = true;
17 }
18
19 DeviceManager::~DeviceManager()
20 {
21         qDebug() << "DeviceManager::~DeviceManager()";
22 }
23
24 void DeviceManager::initDeviceManager()
25 {
26         qDebug() << "DeviceManager::init()";
27         iDataStorage = new DeviceDataStorage();
28         connect( iDataStorage, SIGNAL( dataStorageInitFailed( DeviceManager::ErrorCode ) ),
29                         this, SLOT( errorSender( DeviceManager::ErrorCode ) ) );
30
31         iAlarmSender = new AlarmSender( iDataStorage );
32         connect( iAlarmSender, SIGNAL( alarmSendingFailed( DeviceManager::ErrorCode, const QString& ) ),
33                         this, SLOT( errorSender( DeviceManager::ErrorCode, const QString& ) ) );
34
35         iConfigurator = new DeviceConfigurator( iDataStorage );
36         connect( iConfigurator, SIGNAL( configuringError( DeviceManager::ErrorCode ) ),
37                         this, SLOT( errorSender( DeviceManager::ErrorCode ) ) );
38
39         if ( !iDataStorage->initDataStorage() || !setCurrentOperationMode() )
40                 iMode = EmptyMode;
41
42         iHWKeyListener = new HWKeyListener();
43         handleKeyPresses( true );
44 }
45
46 DeviceManager::OperationMode DeviceManager::currentOperationMode()
47 {
48         return iMode;
49 }
50
51 QString DeviceManager::operationModeToString( OperationMode aMode )
52 {
53         switch ( aMode )
54         {
55                 case KioskMode:
56                         return "Kiosk-mode";
57                 case StandAloneMode:
58                         return "Stand Alone-mode";
59                 default:
60                         return "";
61         }
62 }
63
64 void DeviceManager::changeMode( bool aChange )
65 {
66         qDebug() << "void DeviceManager::changeMode()";
67         if( !aChange ) {
68                 handleKeyPresses( true );
69                 return;
70         }
71         
72         switch ( iMode )
73         {
74                 case EmptyMode:
75                         // error occured. Mode cannot be changed
76                         errorSender( ModeNotFetched );
77                         handleKeyPresses( true );
78                         break;
79                 case StandAloneMode:
80
81                         // change to KioskMode
82                         emit changingMode( "Changing to Kiosk mode" );
83                         while( 1 );
84
85                         // check if auto turn on/off functionality enabled and send turn on/off alarm events to alarm daemon
86                         if ( iSettings->isPowersavingEnabled() )
87                         {
88                                 if ( !iAlarmSender->sendAlarms( iSettings->turnOnAt(), iSettings->turnOffAt() ) )
89                                 {
90                                         handleKeyPresses( true );
91                                         return; //this is critical so returning if no success
92                                 }
93                         }
94
95                         // - disable the certain hw keys (only "home"-hw-key at the moment)
96                         // - register init script to launch the application when ever the device is launched
97                         // - disable the screen "auto-switch-off" and "dimming"
98                         // - store info about the new operation mode
99                         if ( !iConfigurator->toggleHWKeys( false ) ||
100                                   !iConfigurator->toggleInitScript( true ) ||
101                                   !iConfigurator->toggleScreenSwitchOff( false ) ||
102                                   !this->storeOperationMode( KioskMode ) ||
103                                   !iConfigurator->restartDevice() )
104                         {
105
106                                 // we have to roll back if something fails
107                                 // of course rolling back may fail as well but it is impossible to catch
108                                 iSendErrorMessages = false;
109                                 iAlarmSender->removeAlarms();
110                                 iConfigurator->toggleHWKeys( true );
111                                 iConfigurator->toggleInitScript( false );
112                                 iConfigurator->toggleScreenSwitchOff( true );
113                                 iSendErrorMessages = true;
114                                 handleKeyPresses( true );
115                                 return;
116                         }
117                         break;
118
119                 case KioskMode:
120                         // change to StandAloneInProgress mode
121
122                         // - enable the certain hw keys (only "home"-hw-key at the moment)
123                         // - unregister the init script
124                         // - enable the screen "auto-switch-off" and "dimming"
125                         // - store info about the new operation mode
126                         if (    !iConfigurator->toggleHWKeys( true ) ||
127                                   !iConfigurator->toggleScreenSwitchOff( true ) ||
128                                   !this->storeOperationMode( StandAloneModeInProgress ) ||
129                                   !iAlarmSender->removeStoredAlarms() ||
130                                   !iConfigurator->restartDevice() )
131                         {
132                                 // we have to roll back if something fails
133                                 // of course rolling back may fail as well but it is impossible to catch
134                                 iSendErrorMessages = false;
135                                 iConfigurator->toggleHWKeys( false );
136                                 iConfigurator->toggleInitScript( true );
137                                 iConfigurator->toggleScreenSwitchOff( false );
138                                 this->storeOperationMode( KioskMode );
139                                 iSendErrorMessages = true;
140                                 handleKeyPresses( true );
141                                 return;
142                         }
143
144                         break;
145                 default: // StandAloneModeInProgress should never come in question
146                         break;
147         }
148 }
149
150 bool DeviceManager::setCurrentOperationMode()
151 {
152         qDebug() << "DeviceManager::currentOperationMode()";
153         QStringList modeResult;
154         if ( !iDataStorage->readData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeResult ) )
155         {
156                 errorSender( ModeNotFetched );
157                 return false;
158         }
159         else
160         {
161                 if ( !modeResult.empty() )
162                 {
163                         iMode = ( OperationMode )modeResult.at( 0 ).toInt();
164                         if ( iMode == StandAloneModeInProgress )
165                         {
166                                 if ( !finalizeStandAloneMode() )
167                                         iMode = EmptyMode;
168                                 else
169                                         iMode = StandAloneMode;
170                         }
171                 }
172                 else //this must be the first time, so no mode info saved yet
173                         iMode = StandAloneMode;
174         }
175         return true;
176 }
177
178 bool DeviceManager::storeOperationMode( OperationMode aMode )
179 {
180         qDebug() << "DeviceManager::storeOperationMode( const OperationMode & )";
181         QStringList modeStrList;
182         QString str;
183         modeStrList.append( str.append( QString( "%1" ).arg( aMode ) ) );
184         if ( !iDataStorage->storeData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeStrList ) )
185         {
186                 errorSender( ModeNotStored );
187                 return false;
188         }
189         return true;
190 }
191
192 bool DeviceManager::finalizeStandAloneMode()
193 {
194         qDebug() << "DeviceManager::finalizeStandAloneMode()";
195         if ( !storeOperationMode( StandAloneMode ) || !iConfigurator->toggleInitScript( false ) )
196                 return false;
197         return true;
198 }
199
200 void DeviceManager::handleKeyPresses( bool aHandle )
201 {
202         qDebug() << "DeviceManager::handleKeyPresses( bool )";
203         if ( !aHandle )
204                 disconnect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
205         else
206                 connect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
207 }
208
209 void DeviceManager::HWKeyFullScreenPressed()
210 {
211         qDebug() << "DeviceManager::HWKeyFullScreenPressed()";
212         
213         // no more key presses before this one is handled
214         handleKeyPresses( false );
215         
216         OperationMode nextMode;
217         switch ( iMode )
218         {
219                 case KioskMode:
220                         nextMode = StandAloneMode;
221                         break;
222                 case StandAloneMode:
223                         nextMode = KioskMode;
224                         break;
225                 default:
226                         nextMode = EmptyMode;
227                         break;
228         }
229         if ( nextMode != EmptyMode )
230                 emit changeModeOrdered( nextMode );
231         else
232                 handleKeyPresses( true );
233 }
234
235 void DeviceManager::errorSender( DeviceManager::ErrorCode aErrorCode, const QString &aAddInfo )
236 {
237         qDebug() << "DeviceManager::errorSender( ErrorCode, QString & )";
238         qDebug() << "DeviceManager::errorSender: aErrorCode == " << aErrorCode << " " << aAddInfo;
239         if ( !iSendErrorMessages )
240                 return;
241
242         emit error( ERROR_BASE + ( int )aErrorCode, aAddInfo ); 
243 }