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.childNodes().length() == 0 )
167 e.replaceChild( t, e.firstChild() );
170 else if ( tagName == QString( "username" ) )
172 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->username() );
173 if ( e.childNodes().length() == 0 )
179 e.replaceChild( t, e.firstChild() );
182 else if ( tagName == QString( "password" ) )
184 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->password() );
185 if ( e.childNodes().length() == 0 )
191 e.replaceChild( t, 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 qDebug() << "saveRooms";
206 //! List of rooms must be cleared and rewritten again
207 QDomDocument doc = aXML.ownerDocument();
208 QDomNode root = aXML;
210 // Remove child nodes...
211 int count = root.childNodes().count();
212 QDomNode node = root.firstChild();
214 for (int i = 0; i < count; i++)
216 qDebug() << "remove " << node.toElement().text();
217 next = node.nextSibling();
218 node = root.removeChild(node);
221 QList<Room*>::iterator i;
222 for ( i = iRooms.begin(); i != iRooms.end(); ++i )
224 QDomElement tag = doc.createElement( "room" );
225 qDebug() << "write room: " << ( *i )->name() << " to node " << node.toElement().tagName();
226 root.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();
466 qDebug() << "got room: " << name;
468 else if ( tagName == QString( "address" ) )
470 address = roomElem.text();
473 Room* room = new Room( name, address );
474 QString defaultAttr = e.attribute( "default" ).toLower();
475 if ( defaultAttr == QString( "true" ) )
477 rooms.insert( 0, room );
481 rooms.append( room );
489 QString Configuration::readLanguageCode( const QDomNode &aXML )
491 QDomElement e = aXML.toElement();
492 QString tagName = e.tagName().toLower();
494 if ( e.hasAttribute( "code" ) )
496 return e.attribute( "code" );
500 // default language is English
505 StartupSettings * Configuration::readStartupSettings( const QDomNode &aXML )
507 QDomElement e = aXML.toElement();
509 bool isPowersavingEnabled = false;
510 QTime turnOnAt, turnOffAt;
512 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
514 e = node.toElement();
515 QString tagName = e.tagName().toLower();
517 if ( tagName == QString( "powersaving" ) )
519 if ( e.hasAttribute( "enabled" ) &&
520 e.attribute( "enabled" ) == QString( "true" ) )
522 isPowersavingEnabled = true;
525 if ( e.hasAttribute( "on" ) )
527 QString on = e.attribute( "on" );
528 turnOnAt = QTime::fromString( on, "hh:mm" );
532 if ( e.hasAttribute( "off" ) )
534 QString off = e.attribute( "off" );
535 turnOffAt = QTime::fromString( off, "hh:mm" );
540 return new StartupSettings( isPowersavingEnabled, turnOnAt, turnOffAt );
543 DisplaySettings * Configuration::readDisplaySettings( const QDomNode &aXML )
545 DisplaySettings::DaysInSchedule daysInSchedule = DisplaySettings::WeekdaysInSchedule;
546 QTime dayStartsAt, dayEndsAt;
547 DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
548 DisplaySettings::TimeFormat timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
549 int screensaver = 1; //! Default value for screensaver wait time
551 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
553 QDomElement e = node.toElement();
554 QString tagName = e.tagName().toLower();
556 if ( tagName == QString( "schedule" ) )
558 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
560 QDomElement scheduleElem = scheduleNode.toElement();
561 tagName = scheduleElem.tagName().toLower();
563 if ( tagName == QString( "week" ) )
565 if ( scheduleElem.hasAttribute( "days" ) )
567 // default value is 5, only other supported possibility is 7
568 bool success = false;
569 unsigned int days = scheduleElem.attribute( "days" ).toUInt( &success );
570 daysInSchedule = ( success && days == 7 ) ? DisplaySettings::WholeWeekInSchedule : DisplaySettings::WeekdaysInSchedule;
574 else if ( tagName == QString( "day" ) )
576 if ( scheduleElem.hasAttribute( "startsat" ) )
578 QString time = scheduleElem.attribute( "startsat" );
579 dayStartsAt = QTime::fromString( time, "hh:mm" );
581 if ( scheduleElem.hasAttribute( "endsat" ) )
583 QString time = scheduleElem.attribute( "endsat" );
584 dayEndsAt = QTime::fromString( time, "hh:mm" );
590 else if ( tagName == QString( "dateformat" ) )
592 //! Not able to display long format anyway at the moment
594 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
595 dateformat = DisplaySettings::LongDateFormat;
597 dateformat = DisplaySettings::ShortDateFormat;
599 dateformat = DisplaySettings::ShortDateFormat;
601 else if ( tagName == QString( "timeformat" ) )
603 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
605 if ( e.text() == QObject::tr( "hh:mm ap" ) )
606 timeformat = DisplaySettings::TwelveHoursTimeFormat;
608 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
610 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
612 else if ( tagName == QString( "screensaver" ) )
614 bool success = false;
615 unsigned int screensaverTMP = e.text().toUInt( &success );
618 screensaver = screensaverTMP;
623 return new DisplaySettings( dateformat, timeformat, daysInSchedule, dayStartsAt, dayEndsAt, screensaver );
626 DateTimeSettings * Configuration::readDateTimeSettings( const QDomNode &aXML )
629 QDateTime standardTimeChangeMoment = QDateTime::fromString("05.10.2009 04:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
630 QDateTime daylightSaveTimeChangeMoment = QDateTime::fromString("01.04.2010 03:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
631 DateTimeSettings::weekDay dayOfWeek = DateTimeSettings::Sunday;
633 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
635 QDomElement e = node.toElement();
636 QString tagName = e.tagName().toLower();
638 if ( tagName == QString( "dayofweek" ) )
640 qDebug() << "Configuration::readDateTimeSettings: " +e.text();
642 bool success = false;
643 unsigned int weekDayTmp = e.text().toUInt( &success );
644 if( success && weekDayTmp < 7 )
646 dayOfWeek = (DateTimeSettings::weekDay)weekDayTmp;
649 else if( tagName == QString( "standardtimechangemoment" ) )
651 standardTimeChangeMoment = QDateTime::fromString(e.text(), "dd'.'MM'.'yyyy' 'hh:mm:ss");
652 qDebug() << "Configuration::readDateTimeSettings: " +standardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
654 else if( tagName == QString( "daylightsavetimechangemoment" ) )
656 daylightSaveTimeChangeMoment = QDateTime::fromString(e.text(), "dd'.'MM'.'yyyy' 'hh:mm:ss");
657 qDebug() << "Configuration::readDateTimeSettings: " +daylightSaveTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
661 return new DateTimeSettings(standardTimeChangeMoment, daylightSaveTimeChangeMoment, dayOfWeek);
664 QByteArray Configuration::readAdminPassword( const QDomNode &aXML )
666 QDomElement e = aXML.toElement();
667 QString tagName = e.tagName().toLower();
668 if ( e.hasAttribute( "password" ) )
670 QString pw = e.attribute( "password" );
671 // Check if the password is default uncrypted "admin"
672 if ( pw == QString( "admin" ) )
674 // uncrypted password needs to be encoded
675 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
676 hash->addData( pw.toUtf8() );
677 pw = QString( hash->result() );
680 return ( pw.toAscii() ).toHex();
689 void Configuration::setRooms( const QList<Room*> aRooms )
694 QString Configuration::hashPassword( const QString aPassword )
696 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
697 hash->addData( aPassword.toUtf8() );
698 QByteArray password = hash->result();
701 return QString( password );