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 ),
20 iDisplaySettings( 0 ),
21 iDateTimeSettings( 0 )
25 Configuration::~Configuration()
27 delete iConnectionSettings;
28 delete iStartupSettings;
29 delete iDisplaySettings;
30 delete iDateTimeSettings;
31 while ( !iRooms.isEmpty() )
33 delete iRooms.takeFirst();
37 Configuration* Configuration::instance()
41 sInstance = readFromXML( sConfigurationPath );
44 qDebug() << "FATAL: Configuration cannot be read from:" << Configuration::sConfigurationPath;
50 ConnectionSettings* Configuration::connectionSettings()
52 return iConnectionSettings;
55 StartupSettings * Configuration::startupSettings()
57 return iStartupSettings;
60 DisplaySettings * Configuration::displaySettings()
62 return iDisplaySettings;
65 DateTimeSettings * Configuration::dateTimeSettings()
67 return iDateTimeSettings;
70 Room* Configuration::defaultRoom()
72 // default room is stored as the first element of the list
73 return ( iRooms.count() == 0 ) ? 0 : iRooms.at( 0 );
76 QString Configuration::languageCode()
81 QList<Room*> Configuration::rooms()
86 QByteArray Configuration::adminPassword()
88 return iAdminPassword;
91 void Configuration::save()
94 QFile file( sConfigurationPath );
96 if ( !file.open( QIODevice::ReadWrite ) )
101 if ( !doc.setContent( &file ) )
107 QDomElement root = doc.documentElement();
108 // Save all attributes to document
110 saveAdminPassword( root );
112 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
114 QDomElement e = node.toElement();
115 QString tagName = e.tagName().toLower();
117 if ( tagName == QString( "connection" ) )
119 saveConnectionSettings( node );
121 else if ( tagName == QString( "rooms" ) )
125 else if ( tagName == QString( "language" ) )
127 saveLanguageCode( node );
129 else if ( tagName == QString( "startup" ) )
131 saveStartupSettings( node );
133 else if ( tagName == QString( "display" ) )
135 saveDisplaySettings( node );
137 else if (tagName == QString( "datetime" ) )
139 saveDateTimeSettings( node );
143 //! Empty the file from previous content and write again with new one
145 file.write( doc.toByteArray( 4 ) ); //! 4 as intent
151 void Configuration::saveConnectionSettings( const QDomNode &aXML )
153 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
155 QDomElement e = node.toElement();
156 QString tagName = e.tagName().toLower();
158 if ( tagName == QString( "serverurl" ) )
160 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->serverUrl().toString() );
161 e.replaceChild( t, e.firstChild() );
163 else if ( tagName == QString( "username" ) )
165 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->username() );
166 e.replaceChild( t, e.firstChild() );
168 else if ( tagName == QString( "password" ) )
170 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->password() );
171 e.replaceChild( t, e.firstChild() );
173 else if ( tagName == QString( "refreshinterval" ) )
175 QString s = QString( "%1" ).arg( iConnectionSettings->refreshInterval() );
176 QDomText t = node.ownerDocument().createTextNode( s );
177 e.replaceChild( t, e.firstChild() );
182 void Configuration::saveRooms( const QDomNode &aXML )
184 //! List of rooms must be cleared and rewritten again
185 QDomDocument doc = aXML.ownerDocument();
186 QDomNode root = aXML;
188 // Remove child nodes...
189 int count = root.childNodes().count();
190 QDomNode node = root.firstChild();
192 for (int i=0; i<count; i++)
194 qDebug() << "remove " << node.toElement().text();
195 next = node.nextSibling();
196 node = root.removeChild(node);
200 QList<Room*>::iterator i;
201 for ( i = iRooms.begin(); i != iRooms.end(); ++i )
203 QDomElement tag = doc.createElement( "room" );
204 node.appendChild( tag );
206 // First room in the list is a dafault room
207 if ( i == iRooms.begin() )
209 tag.setAttribute( "default", "true" );
212 QDomElement ename = doc.createElement( "name" );
213 QDomText tname = node.ownerDocument().createTextNode(( *i )->name() );
214 ename.appendChild( tname );
215 tag.appendChild( ename );
217 QDomElement eaddress = doc.createElement( "address" );
218 QDomText taddress = node.ownerDocument().createTextNode(( *i )->address() );
219 eaddress.appendChild( taddress );
220 tag.appendChild( eaddress );
224 void Configuration::saveLanguageCode( const QDomNode &aXML )
226 QDomElement e = aXML.toElement();
227 e.setAttribute( "code", languageCode() );
230 void Configuration::saveStartupSettings( const QDomNode &aXML )
232 QDomElement e = aXML.toElement();
234 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
236 e = node.toElement();
237 QString tagName = e.tagName().toLower();
239 if ( tagName == QString( "powersaving" ) )
241 ( iStartupSettings->isPowersavingEnabled() ?
242 e.setAttribute( "enabled", "true" ) :
243 e.setAttribute( "enabled", "false" ) );
245 e.setAttribute( "on", iStartupSettings->turnOnAt().toString( "hh:mm" ) );
246 e.setAttribute( "off", iStartupSettings->turnOffAt().toString( "hh:mm" ) );
251 void Configuration::saveDisplaySettings( const QDomNode &aXML )
253 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
255 QDomElement e = node.toElement();
256 QString tagName = e.tagName().toLower();
258 if ( tagName == QString( "schedule" ) )
260 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
262 QDomElement scheduleElem = scheduleNode.toElement();
263 tagName = scheduleElem.tagName().toLower();
265 if ( tagName == QString( "week" ) )
267 scheduleElem.setAttribute( "days", iDisplaySettings->daysInSchedule() );
269 else if ( tagName == QString( "day" ) )
271 scheduleElem.setAttribute( "startsat", iDisplaySettings->dayStartsAt().toString( "hh:mm" ) );
272 scheduleElem.setAttribute( "endsat", iDisplaySettings->dayEndsAt().toString( "hh:mm" ) );
276 else if ( tagName == QString( "dateformat" ) )
278 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->dateFormat() );
279 e.replaceChild( t, e.firstChild() );
281 else if ( tagName == QString( "timeformat" ) )
283 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->timeFormat() );
284 e.replaceChild( t, e.firstChild() );
286 else if ( tagName == QString( "screensaver" ) )
288 QString s = QString( "%1" ).arg( iDisplaySettings->screensaver() );
289 QDomText t = node.ownerDocument().createTextNode( s );
290 e.replaceChild( t, e.firstChild() );
295 void Configuration::saveDateTimeSettings( const QDomNode &aXML )
297 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
299 QDomElement e = node.toElement();
300 QString tagName = e.tagName().toLower();
302 if ( tagName == QString( "dayofweek" ) )
304 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->iDayOfWeek);
305 e.replaceChild( t, e.firstChild() );
307 else if( tagName == QString( "StandardTimeChangeMoment" ) )
309 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->iStandardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss"));
310 e.replaceChild( t, e.firstChild() );
312 else if( tagName == QString( "DaylightSaveTimeChangeMoment" ) )
314 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->iDaylightSaveTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss"));
315 e.replaceChild( t, e.firstChild() );
320 void Configuration::saveAdminPassword( const QDomNode &aXML )
322 QDomElement e = aXML.toElement();
323 e.setAttribute( "password", QString( adminPassword() ) );
327 Configuration* Configuration::readFromXML( const QString &aPath )
332 if ( !file.open( QIODevice::ReadOnly ) )
336 if ( !doc.setContent( &file ) )
343 QDomElement root = doc.documentElement();
344 // check if the file is the one we need
345 if ( root.tagName().toLower() != QString( "configuration" ) )
350 Configuration* conf = new Configuration();
352 conf->iAdminPassword = Configuration::readAdminPassword( root );
354 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
356 QDomElement e = node.toElement();
357 QString tagName = e.tagName().toLower();
359 if ( tagName == QString( "connection" ) )
361 conf->iConnectionSettings = Configuration::readConnectionSettings( node );
363 else if ( tagName == QString( "rooms" ) )
365 conf->iRooms = Configuration::readRooms( node );
367 else if ( tagName == QString( "language" ) )
369 conf->iLanguageCode = Configuration::readLanguageCode( node );
371 else if ( tagName == QString( "startup" ) )
373 conf->iStartupSettings = Configuration::readStartupSettings( node );
375 else if ( tagName == QString( "display" ) )
377 conf->iDisplaySettings = Configuration::readDisplaySettings( node );
379 else if ( tagName == QString( "datetime" ) )
381 conf->iDateTimeSettings = Configuration::readDateTimeSettings(node);
388 ConnectionSettings* Configuration::readConnectionSettings( const QDomNode &aXML )
390 QString server, username, password;
391 unsigned int interval = Configuration::sDefaultInterval;
393 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
395 QDomElement e = node.toElement();
396 QString tagName = e.tagName().toLower();
398 if ( tagName == QString( "serverurl" ) )
402 else if ( tagName == QString( "username" ) )
406 else if ( tagName == QString( "password" ) )
410 else if ( tagName == QString( "refreshinterval" ) )
412 bool success = false;
413 unsigned int intervalTMP = e.text().toUInt( &success );
416 interval = intervalTMP;
421 return new ConnectionSettings( server, username, password, interval );
424 QList<Room*> Configuration::readRooms( const QDomNode &aXML )
428 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
430 QDomElement e = node.toElement();
431 QString tagName = e.tagName().toLower();
433 if ( tagName == QString( "room" ) )
435 QString name, address;
437 for ( QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode = roomNode.nextSibling() )
439 QDomElement roomElem = roomNode.toElement();
440 tagName = roomElem.tagName().toLower();
441 if ( tagName == QString( "name" ) )
443 name = roomElem.text();
445 else if ( tagName == QString( "address" ) )
447 address = roomElem.text();
450 Room* room = new Room( name, address );
451 QString defaultAttr = e.attribute( "default" ).toLower();
452 if ( defaultAttr == QString( "true" ) )
454 rooms.insert( 0, room );
458 rooms.append( room );
466 QString Configuration::readLanguageCode( const QDomNode &aXML )
468 QDomElement e = aXML.toElement();
469 QString tagName = e.tagName().toLower();
471 if ( e.hasAttribute( "code" ) )
473 return e.attribute( "code" );
477 // default language is English
482 StartupSettings * Configuration::readStartupSettings( const QDomNode &aXML )
484 QDomElement e = aXML.toElement();
486 bool isPowersavingEnabled = false;
487 QTime turnOnAt, turnOffAt;
489 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
491 e = node.toElement();
492 QString tagName = e.tagName().toLower();
494 if ( tagName == QString( "powersaving" ) )
496 if ( e.hasAttribute( "enabled" ) &&
497 e.attribute( "enabled" ) == QString( "true" ) )
499 isPowersavingEnabled = true;
502 if ( e.hasAttribute( "on" ) )
504 QString on = e.attribute( "on" );
505 turnOnAt = QTime::fromString( on, "hh:mm" );
509 if ( e.hasAttribute( "off" ) )
511 QString off = e.attribute( "off" );
512 turnOffAt = QTime::fromString( off, "hh:mm" );
517 return new StartupSettings( isPowersavingEnabled, turnOnAt, turnOffAt );
520 DisplaySettings * Configuration::readDisplaySettings( const QDomNode &aXML )
522 DisplaySettings::DaysInSchedule daysInSchedule = DisplaySettings::WeekdaysInSchedule;
523 QTime dayStartsAt, dayEndsAt;
524 DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
525 DisplaySettings::TimeFormat timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
526 int screensaver = 1; //! Default value for screensaver wait time
528 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
530 QDomElement e = node.toElement();
531 QString tagName = e.tagName().toLower();
533 if ( tagName == QString( "schedule" ) )
535 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
537 QDomElement scheduleElem = scheduleNode.toElement();
538 tagName = scheduleElem.tagName().toLower();
540 if ( tagName == QString( "week" ) )
542 if ( scheduleElem.hasAttribute( "days" ) )
544 // default value is 5, only other supported possibility is 7
545 bool success = false;
546 unsigned int days = scheduleElem.attribute( "days" ).toUInt( &success );
547 daysInSchedule = ( success && days == 7 ) ? DisplaySettings::WholeWeekInSchedule : DisplaySettings::WeekdaysInSchedule;
551 else if ( tagName == QString( "day" ) )
553 if ( scheduleElem.hasAttribute( "startsat" ) )
555 QString time = scheduleElem.attribute( "startsat" );
556 dayStartsAt = QTime::fromString( time, "hh:mm" );
558 if ( scheduleElem.hasAttribute( "endsat" ) )
560 QString time = scheduleElem.attribute( "endsat" );
561 dayEndsAt = QTime::fromString( time, "hh:mm" );
567 else if ( tagName == QString( "dateformat" ) )
569 //! Not able to display long format anyway at the moment
571 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
572 dateformat = DisplaySettings::LongDateFormat;
574 dateformat = DisplaySettings::ShortDateFormat;
576 dateformat = DisplaySettings::ShortDateFormat;
578 else if ( tagName == QString( "timeformat" ) )
580 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
582 if ( e.text() == QObject::tr( "hh:mm ap" ) )
583 timeformat = DisplaySettings::TwelveHoursTimeFormat;
585 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
587 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
589 else if ( tagName == QString( "screensaver" ) )
591 bool success = false;
592 unsigned int screensaverTMP = e.text().toUInt( &success );
595 screensaver = screensaverTMP;
600 return new DisplaySettings( dateformat, timeformat, daysInSchedule, dayStartsAt, dayEndsAt, screensaver );
603 DateTimeSettings * Configuration::readDateTimeSettings( const QDomNode &aXML )
605 QDateTime standardTimeChangeMoment;
606 QDateTime daylightSaveTimeChangeMoment;
609 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
611 QDomElement e = node.toElement();
612 QString tagName = e.tagName().toLower();
614 if ( tagName == QString( "dayofweek" ) )
616 dayOfWeek = e.text();
618 else if( tagName == QString( "StandardTimeChangeMoment" ) )
620 standardTimeChangeMoment.fromString(e.text(), "dd.MM.yyyy hh:mm:ss");
622 else if( tagName == QString( "DaylightSaveTimeChangeMoment" ) )
624 daylightSaveTimeChangeMoment.fromString(e.text(), "dd.MM.yyyy hh:mm:ss");
628 return new DateTimeSettings(standardTimeChangeMoment, daylightSaveTimeChangeMoment, dayOfWeek);
631 QByteArray Configuration::readAdminPassword( const QDomNode &aXML )
633 QDomElement e = aXML.toElement();
634 QString tagName = e.tagName().toLower();
635 if ( e.hasAttribute( "password" ) )
637 QString pw = e.attribute( "password" );
638 // Check if the password is default uncrypted "admin"
639 if ( pw == QString( "admin" ) )
641 // uncrypted password needs to be encoded
642 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
643 hash->addData( pw.toUtf8() );
644 pw = QString( hash->result() );
647 return ( pw.toAscii() ).toHex();
656 void Configuration::setRooms( const QList<Room*> aRooms )
661 QString Configuration::hashPassword( const QString aPassword )
663 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
664 hash->addData( aPassword.toUtf8() );
665 QByteArray password = hash->result();
668 return QString( password );