qtmeetings sources to Maemo garage
[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
83                         // check if auto turn on/off functionality enabled and send turn on/off alarm events to alarm daemon
84                         if ( iSettings->isPowersavingEnabled() )
85                         {
86                                 if ( !iAlarmSender->sendAlarms( iSettings->turnOnAt(), iSettings->turnOffAt() ) )
87                                 {
88                                         handleKeyPresses( true );
89                                         return; //this is critical so returning if no success
90                                 }
91                         }
92
93                         // - disable the certain hw keys (only "home"-hw-key at the moment)
94                         // - register init script to launch the application when ever the device is launched
95                         // - disable the screen "auto-switch-off" and "dimming"
96                         // - store info about the new operation mode
97                         if ( !iConfigurator->toggleHWKeys( false ) ||
98                                   !iConfigurator->toggleInitScript( true ) ||
99                                   !iConfigurator->toggleScreenSwitchOff( false ) ||
100                                   !this->storeOperationMode( KioskMode ) ||
101                                   !iConfigurator->restartDevice() )
102                         {
103
104                                 // we have to roll back if something fails
105                                 // of course rolling back may fail as well but it is impossible to catch
106                                 iSendErrorMessages = false;
107                                 iAlarmSender->removeAlarms();
108                                 iConfigurator->toggleHWKeys( true );
109                                 iConfigurator->toggleInitScript( false );
110                                 iConfigurator->toggleScreenSwitchOff( true );
111                                 iSendErrorMessages = true;
112                                 handleKeyPresses( true );
113                                 return;
114                         }
115                         break;
116
117                 case KioskMode:
118                         // change to StandAloneInProgress mode
119
120                         // - enable the certain hw keys (only "home"-hw-key at the moment)
121                         // - unregister the init script
122                         // - enable the screen "auto-switch-off" and "dimming"
123                         // - store info about the new operation mode
124                         if (    !iConfigurator->toggleHWKeys( true ) ||
125                                   !iConfigurator->toggleScreenSwitchOff( true ) ||
126                                   !this->storeOperationMode( StandAloneModeInProgress ) ||
127                                   !iAlarmSender->removeStoredAlarms() ||
128                                   !iConfigurator->restartDevice() )
129                         {
130                                 // we have to roll back if something fails
131                                 // of course rolling back may fail as well but it is impossible to catch
132                                 iSendErrorMessages = false;
133                                 iConfigurator->toggleHWKeys( false );
134                                 iConfigurator->toggleInitScript( true );
135                                 iConfigurator->toggleScreenSwitchOff( false );
136                                 this->storeOperationMode( KioskMode );
137                                 iSendErrorMessages = true;
138                                 handleKeyPresses( true );
139                                 return;
140                         }
141
142                         break;
143                 default: // StandAloneModeInProgress should never come in question
144                         break;
145         }
146 }
147
148 bool DeviceManager::setCurrentOperationMode()
149 {
150         qDebug() << "DeviceManager::currentOperationMode()";
151         QStringList modeResult;
152         if ( !iDataStorage->readData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeResult ) )
153         {
154                 errorSender( ModeNotFetched );
155                 return false;
156         }
157         else
158         {
159                 if ( !modeResult.empty() )
160                 {
161                         iMode = ( OperationMode )modeResult.at( 0 ).toInt();
162                         if ( iMode == StandAloneModeInProgress )
163                         {
164                                 if ( !finalizeStandAloneMode() )
165                                         iMode = EmptyMode;
166                                 else
167                                         iMode = StandAloneMode;
168                         }
169                 }
170                 else //this must be the first time, so no mode info saved yet
171                         iMode = StandAloneMode;
172         }
173         return true;
174 }
175
176 bool DeviceManager::storeOperationMode( OperationMode aMode )
177 {
178         qDebug() << "DeviceManager::storeOperationMode( const OperationMode & )";
179         QStringList modeStrList;
180         QString str;
181         modeStrList.append( str.append( QString( "%1" ).arg( aMode ) ) );
182         if ( !iDataStorage->storeData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeStrList ) )
183         {
184                 errorSender( ModeNotStored );
185                 return false;
186         }
187         return true;
188 }
189
190 bool DeviceManager::finalizeStandAloneMode()
191 {
192         qDebug() << "DeviceManager::finalizeStandAloneMode()";
193         if ( !storeOperationMode( StandAloneMode ) || !iConfigurator->toggleInitScript( false ) )
194                 return false;
195         return true;
196 }
197
198 void DeviceManager::handleKeyPresses( bool aHandle )
199 {
200         qDebug() << "DeviceManager::handleKeyPresses( bool )";
201         if ( !aHandle )
202                 disconnect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
203         else
204                 connect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
205 }
206
207 void DeviceManager::HWKeyFullScreenPressed()
208 {
209         qDebug() << "DeviceManager::HWKeyFullScreenPressed()";
210         
211         // no more key presses before this one is handled
212         handleKeyPresses( false );
213         
214         OperationMode nextMode;
215         switch ( iMode )
216         {
217                 case KioskMode:
218                         nextMode = StandAloneMode;
219                         break;
220                 case StandAloneMode:
221                         nextMode = KioskMode;
222                         break;
223                 default:
224                         nextMode = EmptyMode;
225                         break;
226         }
227         if ( nextMode != EmptyMode )
228                 emit changeModeOrdered( nextMode );
229         else
230                 handleKeyPresses( true );
231 }
232
233 void DeviceManager::errorSender( DeviceManager::ErrorCode aErrorCode, const QString &aAddInfo )
234 {
235         qDebug() << "DeviceManager::errorSender( ErrorCode, QString & )";
236         qDebug() << "DeviceManager::errorSender: aErrorCode == " << aErrorCode << " " << aAddInfo;
237         if ( !iSendErrorMessages )
238                 return;
239
240         emit error( ERROR_BASE + ( int )aErrorCode, aAddInfo ); 
241 }