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