Enabled the error sending from Operation Mode changing. And corrected some possible...
[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, const QString & ) ),
85                         this, SLOT( errorSender( DeviceManager::ErrorCode, const QString & ) ) );
86         connect( iModeToggler, SIGNAL( changingMode( const QString & ) ), this, SIGNAL( changingMode( const QString & ) ) );
87         connect( iModeToggler, SIGNAL( toggleErrorSending( bool ) ), this, SLOT( toggleErrorSending( bool ) ) );
88         iModeToggler->start();
89 }
90
91 bool DeviceManager::setCurrentOperationMode()
92 {
93         qDebug() << "DeviceManager::currentOperationMode()";
94         QStringList modeResult;
95         if ( !iDataStorage->readData( iDataStorage->dataSectionToString( DeviceDataStorage::DeviceMode ), modeResult ) )
96         {
97                 errorSender( ModeNotFetched );
98                 return false;
99         }
100         else
101         {
102                 if ( !modeResult.empty() )
103                 {
104                         iMode = ( OperationMode )modeResult.at( 0 ).toInt();
105                         if ( iMode == StandAloneModeInProgress )
106                         {
107                                 if ( !finalizeStandAloneMode() )
108                                         iMode = EmptyMode;
109                                 else
110                                         iMode = StandAloneMode;
111                         }
112                 }
113                 else //this must be the first time, so no mode info saved yet
114                         iMode = StandAloneMode;
115         }
116         return true;
117 }
118
119 bool DeviceManager::finalizeStandAloneMode()
120 {
121         qDebug() << "DeviceManager::finalizeStandAloneMode()";
122         if ( !OperationModeToggler::storeOperationMode( StandAloneMode, iDataStorage ) || !iConfigurator->toggleInitScript( false ) ) {
123                 errorSender( DeviceManager::ModeNotStored );
124                 return false;
125         }
126         return true;
127 }
128
129 void DeviceManager::handleKeyPresses( bool aHandle )
130 {
131         qDebug() << "DeviceManager::handleKeyPresses( bool )";
132         if ( !aHandle )
133                 disconnect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
134         else
135                 connect( iHWKeyListener, SIGNAL( HWKeyFullScreenPressed() ), this, SLOT( HWKeyFullScreenPressed() ) );
136 }
137
138 void DeviceManager::HWKeyFullScreenPressed()
139 {
140         qDebug() << "DeviceManager::HWKeyFullScreenPressed()";
141         
142         // no more key presses before this one is handled
143         handleKeyPresses( false );
144         
145         OperationMode nextMode;
146         switch ( iMode )
147         {
148                 case KioskMode:
149                         nextMode = StandAloneMode;
150                         break;
151                 case StandAloneMode:
152                         nextMode = KioskMode;
153                         break;
154                 default:
155                         nextMode = EmptyMode;
156                         break;
157         }
158         if ( nextMode != EmptyMode )
159                 emit changeModeOrdered( nextMode );
160         else
161                 handleKeyPresses( true );
162 }
163
164 void DeviceManager::errorSender( DeviceManager::ErrorCode aErrorCode, const QString &aAddInfo )
165 {
166         qDebug() << "DeviceManager::errorSender( ErrorCode, QString & )";
167         qDebug() << "DeviceManager::errorSender: aErrorCode == " << aErrorCode << " " << aAddInfo;
168         if ( !iSendErrorMessages )
169                 return;
170
171         emit error( ERROR_BASE + ( int )aErrorCode, aAddInfo ); 
172 }
173
174 void DeviceManager::toggleErrorSending( bool aToggle )
175 {
176         qDebug() << "DeviceManager::toggleErrorSending( bool )";
177         iSendErrorMessages = aToggle;
178 }
179
180 void DeviceManager::modeChanged()
181 {
182         qDebug() << "DeviceManager::modeChanged()";
183         if( iModeToggler != 0 ) {
184                 if ( iModeToggler->success() ) //mode changing went well
185                         iConfigurator->restartDevice();
186                 else
187                         emit changeModeFailed();
188                 delete iModeToggler;
189                 iModeToggler = 0;
190         }
191         
192         //in case device restarting fails we just continue
193         handleKeyPresses( true );
194 }