1 #include "Configuration.h"
2 #include "ConnectionSettings.h"
3 #include "StartupSettings.h"
4 #include "DisplaySettings.h"
6 #include <QDomDocument>
10 #include <QCryptographicHash>
14 Configuration * Configuration::sInstance = 0;
15 QString Configuration::sConfigurationPath = "/etc/QtMeetings.conf";
17 Configuration::Configuration() :
18 iConnectionSettings( 0 ),
19 iStartupSettings( 0 ),
24 Configuration::~Configuration()
26 delete iConnectionSettings;
27 delete iStartupSettings;
28 delete iDisplaySettings;
29 while ( !iRooms.isEmpty() )
31 delete iRooms.takeFirst();
35 Configuration* Configuration::instance()
39 sInstance = readFromXML( sConfigurationPath );
42 qDebug() << "FATAL: Configuration cannot be read from:" << Configuration::sConfigurationPath;
48 ConnectionSettings* Configuration::connectionSettings()
50 return iConnectionSettings;
53 StartupSettings * Configuration::startupSettings()
55 return iStartupSettings;
58 DisplaySettings * Configuration::displaySettings()
60 return iDisplaySettings;
63 Room* Configuration::defaultRoom()
65 // default room is stored as the first element of the list
66 return ( iRooms.count() == 0 ) ? 0 : iRooms.at( 0 );
69 QString Configuration::languageCode()
74 QList<Room*> Configuration::rooms()
79 QByteArray Configuration::adminPassword()
81 return iAdminPassword;
84 void Configuration::save()
87 QFile file( sConfigurationPath );
89 if ( !file.open( QIODevice::ReadWrite ) )
94 if ( !doc.setContent( &file ) )
100 QDomElement root = doc.documentElement();
101 // Save all attributes to document
103 saveAdminPassword( root );
105 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
107 QDomElement e = node.toElement();
108 QString tagName = e.tagName().toLower();
110 if ( tagName == QString( "connection" ) )
112 saveConnectionSettings( node );
114 else if ( tagName == QString( "rooms" ) )
118 else if ( tagName == QString( "language" ) )
120 saveLanguageCode( node );
122 else if ( tagName == QString( "startup" ) )
124 saveStartupSettings( node );
126 else if ( tagName == QString( "display" ) )
128 saveDisplaySettings( node );
132 //! Empty the file from previous content and write again with new one
134 file.write( doc.toByteArray( 4 ) ); //! 4 as intent
140 void Configuration::saveConnectionSettings( const QDomNode &aXML )
142 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
144 QDomElement e = node.toElement();
145 QString tagName = e.tagName().toLower();
147 if ( tagName == QString( "serverurl" ) )
149 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->serverUrl().toString() );
150 e.replaceChild( t, e.firstChild() );
152 else if ( tagName == QString( "username" ) )
154 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->username() );
155 e.replaceChild( t, e.firstChild() );
157 else if ( tagName == QString( "password" ) )
159 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->password() );
160 e.replaceChild( t, e.firstChild() );
162 else if ( tagName == QString( "refreshinterval" ) )
164 QString s = QString( "%1" ).arg( iConnectionSettings->refreshInterval() );
165 QDomText t = node.ownerDocument().createTextNode( s );
166 e.replaceChild( t, e.firstChild() );
171 void Configuration::saveRooms( const QDomNode &aXML )
173 //! List of rooms must be cleared and rewritten again
174 QDomDocument doc = aXML.ownerDocument();
175 QDomNode root = aXML;
177 // Remove child nodes...
178 int count = root.childNodes().count();
179 QDomNode node = root.firstChild();
181 for (int i=0; i<count; i++)
183 qDebug() << "remove " << node.toElement().text();
184 next = node.nextSibling();
185 node = root.removeChild(node);
189 QList<Room*>::iterator i;
190 for ( i = iRooms.begin(); i != iRooms.end(); ++i )
192 QDomElement tag = doc.createElement( "room" );
193 node.appendChild( tag );
195 // First room in the list is a dafault room
196 if ( i == iRooms.begin() )
198 tag.setAttribute( "default", "true" );
201 QDomElement ename = doc.createElement( "name" );
202 QDomText tname = node.ownerDocument().createTextNode(( *i )->name() );
203 ename.appendChild( tname );
204 tag.appendChild( ename );
206 QDomElement eaddress = doc.createElement( "address" );
207 QDomText taddress = node.ownerDocument().createTextNode(( *i )->address() );
208 eaddress.appendChild( taddress );
209 tag.appendChild( eaddress );
213 void Configuration::saveLanguageCode( const QDomNode &aXML )
215 QDomElement e = aXML.toElement();
216 e.setAttribute( "code", languageCode() );
219 void Configuration::saveStartupSettings( const QDomNode &aXML )
221 QDomElement e = aXML.toElement();
223 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
225 e = node.toElement();
226 QString tagName = e.tagName().toLower();
228 if ( tagName == QString( "powersaving" ) )
230 ( iStartupSettings->isPowersavingEnabled() ?
231 e.setAttribute( "enabled", "true" ) :
232 e.setAttribute( "enabled", "false" ) );
234 e.setAttribute( "on", iStartupSettings->turnOnAt().toString( "hh:mm" ) );
235 e.setAttribute( "off", iStartupSettings->turnOffAt().toString( "hh:mm" ) );
240 void Configuration::saveDisplaySettings( const QDomNode &aXML )
242 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
244 QDomElement e = node.toElement();
245 QString tagName = e.tagName().toLower();
247 if ( tagName == QString( "schedule" ) )
249 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
251 QDomElement scheduleElem = scheduleNode.toElement();
252 tagName = scheduleElem.tagName().toLower();
254 if ( tagName == QString( "week" ) )
256 scheduleElem.setAttribute( "days", iDisplaySettings->daysInSchedule() );
258 else if ( tagName == QString( "day" ) )
260 scheduleElem.setAttribute( "startsat", iDisplaySettings->dayStartsAt().toString( "hh:mm" ) );
261 scheduleElem.setAttribute( "endsat", iDisplaySettings->dayEndsAt().toString( "hh:mm" ) );
265 else if ( tagName == QString( "dateformat" ) )
267 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->dateFormat() );
268 e.replaceChild( t, e.firstChild() );
270 else if ( tagName == QString( "timeformat" ) )
272 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->timeFormat() );
273 e.replaceChild( t, e.firstChild() );
275 else if ( tagName == QString( "screensaver" ) )
277 QString s = QString( "%1" ).arg( iDisplaySettings->screensaver() );
278 QDomText t = node.ownerDocument().createTextNode( s );
279 e.replaceChild( t, e.firstChild() );
284 void Configuration::saveAdminPassword( const QDomNode &aXML )
286 QDomElement e = aXML.toElement();
287 e.setAttribute( "password", QString( adminPassword() ) );
291 Configuration* Configuration::readFromXML( const QString &aPath )
296 if ( !file.open( QIODevice::ReadOnly ) )
300 if ( !doc.setContent( &file ) )
307 QDomElement root = doc.documentElement();
308 // check if the file is the one we need
309 if ( root.tagName().toLower() != QString( "configuration" ) )
314 Configuration* conf = new Configuration();
316 conf->iAdminPassword = Configuration::readAdminPassword( root );
318 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
320 QDomElement e = node.toElement();
321 QString tagName = e.tagName().toLower();
323 if ( tagName == QString( "connection" ) )
325 conf->iConnectionSettings = Configuration::readConnectionSettings( node );
327 else if ( tagName == QString( "rooms" ) )
329 conf->iRooms = Configuration::readRooms( node );
331 else if ( tagName == QString( "language" ) )
333 conf->iLanguageCode = Configuration::readLanguageCode( node );
335 else if ( tagName == QString( "startup" ) )
337 conf->iStartupSettings = Configuration::readStartupSettings( node );
339 else if ( tagName == QString( "display" ) )
341 conf->iDisplaySettings = Configuration::readDisplaySettings( node );
348 ConnectionSettings* Configuration::readConnectionSettings( const QDomNode &aXML )
350 QString server, username, password;
351 unsigned int interval = Configuration::sDefaultInterval;
353 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
355 QDomElement e = node.toElement();
356 QString tagName = e.tagName().toLower();
358 if ( tagName == QString( "serverurl" ) )
362 else if ( tagName == QString( "username" ) )
366 else if ( tagName == QString( "password" ) )
370 else if ( tagName == QString( "refreshinterval" ) )
372 bool success = false;
373 unsigned int intervalTMP = e.text().toUInt( &success );
376 interval = intervalTMP;
381 return new ConnectionSettings( server, username, password, interval );
384 QList<Room*> Configuration::readRooms( const QDomNode &aXML )
388 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
390 QDomElement e = node.toElement();
391 QString tagName = e.tagName().toLower();
393 if ( tagName == QString( "room" ) )
395 QString name, address;
397 for ( QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode = roomNode.nextSibling() )
399 QDomElement roomElem = roomNode.toElement();
400 tagName = roomElem.tagName().toLower();
401 if ( tagName == QString( "name" ) )
403 name = roomElem.text();
405 else if ( tagName == QString( "address" ) )
407 address = roomElem.text();
410 Room* room = new Room( name, address );
411 QString defaultAttr = e.attribute( "default" ).toLower();
412 if ( defaultAttr == QString( "true" ) )
414 rooms.insert( 0, room );
418 rooms.append( room );
426 QString Configuration::readLanguageCode( const QDomNode &aXML )
428 QDomElement e = aXML.toElement();
429 QString tagName = e.tagName().toLower();
431 if ( e.hasAttribute( "code" ) )
433 return e.attribute( "code" );
437 // default language is English
442 StartupSettings * Configuration::readStartupSettings( const QDomNode &aXML )
444 QDomElement e = aXML.toElement();
446 bool isPowersavingEnabled = false;
447 QTime turnOnAt, turnOffAt;
449 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
451 e = node.toElement();
452 QString tagName = e.tagName().toLower();
454 if ( tagName == QString( "powersaving" ) )
456 if ( e.hasAttribute( "enabled" ) &&
457 e.attribute( "enabled" ) == QString( "true" ) )
459 isPowersavingEnabled = true;
462 if ( e.hasAttribute( "on" ) )
464 QString on = e.attribute( "on" );
465 turnOnAt = QTime::fromString( on, "hh:mm" );
469 if ( e.hasAttribute( "off" ) )
471 QString off = e.attribute( "off" );
472 turnOffAt = QTime::fromString( off, "hh:mm" );
477 return new StartupSettings( isPowersavingEnabled, turnOnAt, turnOffAt );
480 DisplaySettings * Configuration::readDisplaySettings( const QDomNode &aXML )
482 DisplaySettings::DaysInSchedule daysInSchedule;
483 QTime dayStartsAt, dayEndsAt;
484 DisplaySettings::DateFormat dateformat;
485 DisplaySettings::TimeFormat timeformat;
486 int screensaver = 1; //! Default value for screensaver wait time
488 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
490 QDomElement e = node.toElement();
491 QString tagName = e.tagName().toLower();
493 if ( tagName == QString( "schedule" ) )
495 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
497 QDomElement scheduleElem = scheduleNode.toElement();
498 tagName = scheduleElem.tagName().toLower();
500 if ( tagName == QString( "week" ) )
502 if ( scheduleElem.hasAttribute( "days" ) )
504 // default value is 5, only other supported possibility is 7
505 bool success = false;
506 unsigned int days = scheduleElem.attribute( "days" ).toUInt( &success );
507 daysInSchedule = ( success && days == 7 ) ? DisplaySettings::WholeWeekInSchedule : DisplaySettings::WeekdaysInSchedule;
511 else if ( tagName == QString( "day" ) )
513 if ( scheduleElem.hasAttribute( "startsat" ) )
515 QString time = scheduleElem.attribute( "startsat" );
516 dayStartsAt = QTime::fromString( time, "hh:mm" );
518 if ( scheduleElem.hasAttribute( "endsat" ) )
520 QString time = scheduleElem.attribute( "endsat" );
521 dayEndsAt = QTime::fromString( time, "hh:mm" );
527 else if ( tagName == QString( "dateformat" ) )
529 //! Not able to display long format anyway at the moment
531 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
532 dateformat = DisplaySettings::LongDateFormat;
534 dateformat = DisplaySettings::ShortDateFormat;
536 dateformat = DisplaySettings::ShortDateFormat;
538 else if ( tagName == QString( "timeformat" ) )
540 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
542 if ( e.text() == QObject::tr( "hh:mm ap" ) )
543 timeformat = DisplaySettings::TwelveHoursTimeFormat;
545 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
547 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
549 else if ( tagName == QString( "screensaver" ) )
551 bool success = false;
552 unsigned int screensaverTMP = e.text().toUInt( &success );
555 screensaver = screensaverTMP;
560 return new DisplaySettings( dateformat, timeformat, daysInSchedule, dayStartsAt, dayEndsAt, screensaver );
563 QByteArray Configuration::readAdminPassword( const QDomNode &aXML )
565 QDomElement e = aXML.toElement();
566 QString tagName = e.tagName().toLower();
567 if ( e.hasAttribute( "password" ) )
569 QString pw = e.attribute( "password" );
570 // Check if the password is default uncrypted "admin"
571 if ( pw == QString( "admin" ) )
573 // uncrypted password needs to be encoded
574 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
575 hash->addData( pw.toUtf8() );
576 pw = QString( hash->result() );
579 return ( pw.toAscii() ).toHex();
588 void Configuration::setRooms( const QList<Room*> aRooms )
593 QString Configuration::hashPassword( const QString aPassword )
595 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
596 hash->addData( aPassword.toUtf8() );
597 QByteArray password = hash->result();
600 return QString( password );