1 #include "Configuration.h"
2 #include "ConnectionSettings.h"
3 #include "StartupSettings.h"
4 #include "DisplaySettings.h"
5 #include "DateTimeSettings.h"
7 #include <QDomDocument>
11 #include <QCryptographicHash>
15 Configuration * Configuration::sInstance = 0;
16 QString Configuration::sConfigurationPath = "/etc/QtMeetings.conf";
18 Configuration::Configuration() :
19 iConnectionSettings( 0 ),
20 iStartupSettings( 0 ),
21 iDisplaySettings( 0 ),
22 iDateTimeSettings( 0 )
26 Configuration::~Configuration()
28 delete iConnectionSettings;
29 delete iStartupSettings;
30 delete iDisplaySettings;
31 delete iDateTimeSettings;
32 while ( !iRooms.isEmpty() )
34 delete iRooms.takeFirst();
38 Configuration* Configuration::instance()
42 sInstance = readFromXML( sConfigurationPath );
45 qDebug() << "FATAL: Configuration cannot be read from:" << Configuration::sConfigurationPath;
51 ConnectionSettings* Configuration::connectionSettings()
53 return iConnectionSettings;
56 StartupSettings * Configuration::startupSettings()
58 return iStartupSettings;
61 DisplaySettings * Configuration::displaySettings()
63 return iDisplaySettings;
66 DateTimeSettings * Configuration::dateTimeSettings()
68 return iDateTimeSettings;
71 Room* Configuration::defaultRoom()
73 // default room is stored as the first element of the list
74 return ( iRooms.count() == 0 ) ? 0 : iRooms.at( 0 );
77 QString Configuration::languageCode()
82 QList<Room*> Configuration::rooms()
87 QByteArray Configuration::adminPassword()
89 return iAdminPassword;
92 void Configuration::save()
95 QFile file( sConfigurationPath );
97 if ( !file.open( QIODevice::ReadWrite ) )
102 if ( !doc.setContent( &file ) )
108 QDomElement root = doc.documentElement();
109 // Save all attributes to document
111 saveAdminPassword( root );
113 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
115 QDomElement e = node.toElement();
116 QString tagName = e.tagName().toLower();
118 if ( tagName == QString( "connection" ) )
120 saveConnectionSettings( node );
122 else if ( tagName == QString( "rooms" ) )
126 else if ( tagName == QString( "language" ) )
128 saveLanguageCode( node );
130 else if ( tagName == QString( "startup" ) )
132 saveStartupSettings( node );
134 else if ( tagName == QString( "display" ) )
136 saveDisplaySettings( node );
138 else if (tagName == QString( "daylight_saving_time" ) )
140 saveDateTimeSettings( node );
144 //! Empty the file from previous content and write again with new one
146 file.write( doc.toByteArray( 4 ) ); //! 4 as intent
152 void Configuration::saveConnectionSettings( const QDomNode &aXML )
154 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
156 QDomElement e = node.toElement();
157 QString tagName = e.tagName().toLower();
158 if ( tagName == QString( "serverurl" ) )
160 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->serverUrl().toString() );
161 if ( e.hasChildNodes() )
163 e.replaceChild( t, e.firstChild() );
167 e.appendChild( e.firstChild() );
170 else if ( tagName == QString( "username" ) )
172 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->username() );
173 if ( e.hasChildNodes() )
175 e.replaceChild( t, e.firstChild() );
179 e.appendChild( e.firstChild() );
182 else if ( tagName == QString( "password" ) )
184 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->password() );
185 if ( e.hasChildNodes() )
187 e.replaceChild( t, e.firstChild() );
191 e.appendChild( e.firstChild() );
194 else if ( tagName == QString( "refreshinterval" ) )
196 QString s = QString( "%1" ).arg( iConnectionSettings->refreshInterval() );
197 QDomText t = node.ownerDocument().createTextNode( s );
198 e.replaceChild( t, e.firstChild() );
203 void Configuration::saveRooms( const QDomNode &aXML )
205 //! List of rooms must be cleared and rewritten again
206 QDomDocument doc = aXML.ownerDocument();
207 QDomNode root = aXML;
209 // Remove child nodes...
210 int count = root.childNodes().count();
211 QDomNode node = root.firstChild();
213 for (int i = 0; i < count; i++)
215 qDebug() << "remove " << node.toElement().text();
216 next = node.nextSibling();
217 node = root.removeChild(node);
222 QList<Room*>::iterator i;
223 for ( i = iRooms.begin(); i != iRooms.end(); ++i )
225 QDomElement tag = doc.createElement( "room" );
226 node.appendChild( tag );
228 // First room in the list is a dafault room
229 if ( i == iRooms.begin() )
231 tag.setAttribute( "default", "true" );
234 QDomElement ename = doc.createElement( "name" );
235 QDomText tname = node.ownerDocument().createTextNode(( *i )->name() );
236 ename.appendChild( tname );
237 tag.appendChild( ename );
239 QDomElement eaddress = doc.createElement( "address" );
240 QDomText taddress = node.ownerDocument().createTextNode(( *i )->address() );
241 eaddress.appendChild( taddress );
242 tag.appendChild( eaddress );
246 void Configuration::saveLanguageCode( const QDomNode &aXML )
248 QDomElement e = aXML.toElement();
249 e.setAttribute( "code", languageCode() );
252 void Configuration::saveStartupSettings( const QDomNode &aXML )
254 QDomElement e = aXML.toElement();
256 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
258 e = node.toElement();
259 QString tagName = e.tagName().toLower();
261 if ( tagName == QString( "powersaving" ) )
263 ( iStartupSettings->isPowersavingEnabled() ?
264 e.setAttribute( "enabled", "true" ) :
265 e.setAttribute( "enabled", "false" ) );
267 e.setAttribute( "on", iStartupSettings->turnOnAt().toString( "hh:mm" ) );
268 e.setAttribute( "off", iStartupSettings->turnOffAt().toString( "hh:mm" ) );
273 void Configuration::saveDisplaySettings( const QDomNode &aXML )
275 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
277 QDomElement e = node.toElement();
278 QString tagName = e.tagName().toLower();
280 if ( tagName == QString( "schedule" ) )
282 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
284 QDomElement scheduleElem = scheduleNode.toElement();
285 tagName = scheduleElem.tagName().toLower();
287 if ( tagName == QString( "week" ) )
289 scheduleElem.setAttribute( "days", iDisplaySettings->daysInSchedule() );
291 else if ( tagName == QString( "day" ) )
293 scheduleElem.setAttribute( "startsat", iDisplaySettings->dayStartsAt().toString( "hh:mm" ) );
294 scheduleElem.setAttribute( "endsat", iDisplaySettings->dayEndsAt().toString( "hh:mm" ) );
298 else if ( tagName == QString( "dateformat" ) )
300 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->dateFormat() );
301 e.replaceChild( t, e.firstChild() );
303 else if ( tagName == QString( "timeformat" ) )
305 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->timeFormat() );
306 e.replaceChild( t, e.firstChild() );
308 else if ( tagName == QString( "screensaver" ) )
310 QString s = QString( "%1" ).arg( iDisplaySettings->screensaver() );
311 QDomText t = node.ownerDocument().createTextNode( s );
312 e.replaceChild( t, e.firstChild() );
317 void Configuration::saveDateTimeSettings( const QDomNode &aXML )
319 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
321 QDomElement e = node.toElement();
322 QString tagName = e.tagName().toLower();
324 if ( tagName == QString( "dayofweek" ) )
326 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->switchDay() );
327 e.replaceChild( t, e.firstChild() );
329 else if( tagName == QString( "StandardTimeChangeMoment" ) )
331 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->STDDateTime().toString("ddMMyyyyhhmmss"));
332 e.replaceChild( t, e.firstChild() );
334 else if( tagName == QString( "DaylightSaveTimeChangeMoment" ) )
336 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->DSTDateTime().toString("ddMMyyyyhhmmss"));
337 e.replaceChild( t, e.firstChild() );
342 void Configuration::saveAdminPassword( const QDomNode &aXML )
344 QDomElement e = aXML.toElement();
345 e.setAttribute( "password", QString( adminPassword() ) );
349 Configuration* Configuration::readFromXML( const QString &aPath )
354 if ( !file.open( QIODevice::ReadOnly ) )
358 if ( !doc.setContent( &file ) )
365 QDomElement root = doc.documentElement();
366 // check if the file is the one we need
367 if ( root.tagName().toLower() != QString( "configuration" ) )
372 Configuration* conf = new Configuration();
374 conf->iAdminPassword = Configuration::readAdminPassword( root );
376 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
378 QDomElement e = node.toElement();
379 QString tagName = e.tagName().toLower();
381 if ( tagName == QString( "connection" ) )
383 conf->iConnectionSettings = Configuration::readConnectionSettings( node );
385 else if ( tagName == QString( "rooms" ) )
387 conf->iRooms = Configuration::readRooms( node );
389 else if ( tagName == QString( "language" ) )
391 conf->iLanguageCode = Configuration::readLanguageCode( node );
393 else if ( tagName == QString( "startup" ) )
395 conf->iStartupSettings = Configuration::readStartupSettings( node );
397 else if ( tagName == QString( "display" ) )
399 conf->iDisplaySettings = Configuration::readDisplaySettings( node );
401 else if ( tagName == QString( "daylight_saving_time" ) )
403 conf->iDateTimeSettings = Configuration::readDateTimeSettings(node);
410 ConnectionSettings* Configuration::readConnectionSettings( const QDomNode &aXML )
412 QString server, username, password;
413 unsigned int interval = Configuration::sDefaultInterval;
415 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
417 QDomElement e = node.toElement();
418 QString tagName = e.tagName().toLower();
420 if ( tagName == QString( "serverurl" ) )
424 else if ( tagName == QString( "username" ) )
428 else if ( tagName == QString( "password" ) )
432 else if ( tagName == QString( "refreshinterval" ) )
434 bool success = false;
435 unsigned int intervalTMP = e.text().toUInt( &success );
438 interval = intervalTMP;
443 return new ConnectionSettings( server, username, password, interval );
446 QList<Room*> Configuration::readRooms( const QDomNode &aXML )
450 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
452 QDomElement e = node.toElement();
453 QString tagName = e.tagName().toLower();
455 if ( tagName == QString( "room" ) )
457 QString name, address;
459 for ( QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode = roomNode.nextSibling() )
461 QDomElement roomElem = roomNode.toElement();
462 tagName = roomElem.tagName().toLower();
463 if ( tagName == QString( "name" ) )
465 name = roomElem.text();
467 else if ( tagName == QString( "address" ) )
469 address = roomElem.text();
472 Room* room = new Room( name, address );
473 QString defaultAttr = e.attribute( "default" ).toLower();
474 if ( defaultAttr == QString( "true" ) )
476 rooms.insert( 0, room );
480 rooms.append( room );
488 QString Configuration::readLanguageCode( const QDomNode &aXML )
490 QDomElement e = aXML.toElement();
491 QString tagName = e.tagName().toLower();
493 if ( e.hasAttribute( "code" ) )
495 return e.attribute( "code" );
499 // default language is English
504 StartupSettings * Configuration::readStartupSettings( const QDomNode &aXML )
506 QDomElement e = aXML.toElement();
508 bool isPowersavingEnabled = false;
509 QTime turnOnAt, turnOffAt;
511 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
513 e = node.toElement();
514 QString tagName = e.tagName().toLower();
516 if ( tagName == QString( "powersaving" ) )
518 if ( e.hasAttribute( "enabled" ) &&
519 e.attribute( "enabled" ) == QString( "true" ) )
521 isPowersavingEnabled = true;
524 if ( e.hasAttribute( "on" ) )
526 QString on = e.attribute( "on" );
527 turnOnAt = QTime::fromString( on, "hh:mm" );
531 if ( e.hasAttribute( "off" ) )
533 QString off = e.attribute( "off" );
534 turnOffAt = QTime::fromString( off, "hh:mm" );
539 return new StartupSettings( isPowersavingEnabled, turnOnAt, turnOffAt );
542 DisplaySettings * Configuration::readDisplaySettings( const QDomNode &aXML )
544 DisplaySettings::DaysInSchedule daysInSchedule = DisplaySettings::WeekdaysInSchedule;
545 QTime dayStartsAt, dayEndsAt;
546 DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
547 DisplaySettings::TimeFormat timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
548 int screensaver = 1; //! Default value for screensaver wait time
550 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
552 QDomElement e = node.toElement();
553 QString tagName = e.tagName().toLower();
555 if ( tagName == QString( "schedule" ) )
557 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
559 QDomElement scheduleElem = scheduleNode.toElement();
560 tagName = scheduleElem.tagName().toLower();
562 if ( tagName == QString( "week" ) )
564 if ( scheduleElem.hasAttribute( "days" ) )
566 // default value is 5, only other supported possibility is 7
567 bool success = false;
568 unsigned int days = scheduleElem.attribute( "days" ).toUInt( &success );
569 daysInSchedule = ( success && days == 7 ) ? DisplaySettings::WholeWeekInSchedule : DisplaySettings::WeekdaysInSchedule;
573 else if ( tagName == QString( "day" ) )
575 if ( scheduleElem.hasAttribute( "startsat" ) )
577 QString time = scheduleElem.attribute( "startsat" );
578 dayStartsAt = QTime::fromString( time, "hh:mm" );
580 if ( scheduleElem.hasAttribute( "endsat" ) )
582 QString time = scheduleElem.attribute( "endsat" );
583 dayEndsAt = QTime::fromString( time, "hh:mm" );
589 else if ( tagName == QString( "dateformat" ) )
591 //! Not able to display long format anyway at the moment
593 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
594 dateformat = DisplaySettings::LongDateFormat;
596 dateformat = DisplaySettings::ShortDateFormat;
598 dateformat = DisplaySettings::ShortDateFormat;
600 else if ( tagName == QString( "timeformat" ) )
602 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
604 if ( e.text() == QObject::tr( "hh:mm ap" ) )
605 timeformat = DisplaySettings::TwelveHoursTimeFormat;
607 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
609 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
611 else if ( tagName == QString( "screensaver" ) )
613 bool success = false;
614 unsigned int screensaverTMP = e.text().toUInt( &success );
617 screensaver = screensaverTMP;
622 return new DisplaySettings( dateformat, timeformat, daysInSchedule, dayStartsAt, dayEndsAt, screensaver );
625 DateTimeSettings * Configuration::readDateTimeSettings( const QDomNode &aXML )
628 QDateTime standardTimeChangeMoment = QDateTime::fromString("05.10.2009 04:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
629 QDateTime daylightSaveTimeChangeMoment = QDateTime::fromString("01.04.2010 03:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
630 DateTimeSettings::weekDay dayOfWeek = DateTimeSettings::Sunday;
632 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
634 QDomElement e = node.toElement();
635 QString tagName = e.tagName().toLower();
637 if ( tagName == QString( "dayofweek" ) )
639 qDebug() << "Configuration::readDateTimeSettings: " +e.text();
641 bool success = false;
642 unsigned int weekDayTmp = e.text().toUInt( &success );
643 if( success && weekDayTmp < 7 )
645 dayOfWeek = (DateTimeSettings::weekDay)weekDayTmp;
648 else if( tagName == QString( "standardtimechangemoment" ) )
650 standardTimeChangeMoment = QDateTime::fromString(e.text(), "dd'.'MM'.'yyyy' 'hh:mm:ss");
651 qDebug() << "Configuration::readDateTimeSettings: " +standardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
653 else if( tagName == QString( "daylightsavetimechangemoment" ) )
655 daylightSaveTimeChangeMoment = QDateTime::fromString(e.text(), "dd'.'MM'.'yyyy' 'hh:mm:ss");
656 qDebug() << "Configuration::readDateTimeSettings: " +daylightSaveTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
660 return new DateTimeSettings(standardTimeChangeMoment, daylightSaveTimeChangeMoment, dayOfWeek);
663 QByteArray Configuration::readAdminPassword( const QDomNode &aXML )
665 QDomElement e = aXML.toElement();
666 QString tagName = e.tagName().toLower();
667 if ( e.hasAttribute( "password" ) )
669 QString pw = e.attribute( "password" );
670 // Check if the password is default uncrypted "admin"
671 if ( pw == QString( "admin" ) )
673 // uncrypted password needs to be encoded
674 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
675 hash->addData( pw.toUtf8() );
676 pw = QString( hash->result() );
679 return ( pw.toAscii() ).toHex();
688 void Configuration::setRooms( const QList<Room*> aRooms )
693 QString Configuration::hashPassword( const QString aPassword )
695 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
696 hash->addData( aPassword.toUtf8() );
697 QByteArray password = hash->result();
700 return QString( password );