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();
159 if ( tagName == QString( "serverurl" ) )
161 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->serverUrl().toString() );
162 if ( e.hasChildNodes() )
164 e.replaceChild( t, e.firstChild() );
168 e.appendChild( e.firstChild() );
171 else if ( tagName == QString( "username" ) )
173 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->username() );
174 if ( e.hasChildNodes() )
176 e.replaceChild( t, e.firstChild() );
180 e.appendChild( e.firstChild() );
183 else if ( tagName == QString( "password" ) )
185 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->password() );
186 if ( e.hasChildNodes() )
188 e.replaceChild( t, e.firstChild() );
192 e.appendChild( e.firstChild() );
195 else if ( tagName == QString( "refreshinterval" ) )
197 QString s = QString( "%1" ).arg( iConnectionSettings->refreshInterval() );
198 QDomText t = node.ownerDocument().createTextNode( s );
199 e.replaceChild( t, e.firstChild() );
204 void Configuration::saveRooms( const QDomNode &aXML )
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);
223 QList<Room*>::iterator i;
224 for ( i = iRooms.begin(); i != iRooms.end(); ++i )
226 QDomElement tag = doc.createElement( "room" );
227 node.appendChild( tag );
229 // First room in the list is a dafault room
230 if ( i == iRooms.begin() )
232 tag.setAttribute( "default", "true" );
235 QDomElement ename = doc.createElement( "name" );
236 QDomText tname = node.ownerDocument().createTextNode(( *i )->name() );
237 ename.appendChild( tname );
238 tag.appendChild( ename );
240 QDomElement eaddress = doc.createElement( "address" );
241 QDomText taddress = node.ownerDocument().createTextNode(( *i )->address() );
242 eaddress.appendChild( taddress );
243 tag.appendChild( eaddress );
247 void Configuration::saveLanguageCode( const QDomNode &aXML )
249 QDomElement e = aXML.toElement();
250 e.setAttribute( "code", languageCode() );
253 void Configuration::saveStartupSettings( const QDomNode &aXML )
255 QDomElement e = aXML.toElement();
257 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
259 e = node.toElement();
260 QString tagName = e.tagName().toLower();
262 if ( tagName == QString( "powersaving" ) )
264 ( iStartupSettings->isPowersavingEnabled() ?
265 e.setAttribute( "enabled", "true" ) :
266 e.setAttribute( "enabled", "false" ) );
268 e.setAttribute( "on", iStartupSettings->turnOnAt().toString( "hh:mm" ) );
269 e.setAttribute( "off", iStartupSettings->turnOffAt().toString( "hh:mm" ) );
274 void Configuration::saveDisplaySettings( const QDomNode &aXML )
276 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
278 QDomElement e = node.toElement();
279 QString tagName = e.tagName().toLower();
281 if ( tagName == QString( "schedule" ) )
283 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
285 QDomElement scheduleElem = scheduleNode.toElement();
286 tagName = scheduleElem.tagName().toLower();
288 if ( tagName == QString( "week" ) )
290 scheduleElem.setAttribute( "days", iDisplaySettings->daysInSchedule() );
292 else if ( tagName == QString( "day" ) )
294 scheduleElem.setAttribute( "startsat", iDisplaySettings->dayStartsAt().toString( "hh:mm" ) );
295 scheduleElem.setAttribute( "endsat", iDisplaySettings->dayEndsAt().toString( "hh:mm" ) );
299 else if ( tagName == QString( "dateformat" ) )
301 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->dateFormat() );
302 e.replaceChild( t, e.firstChild() );
304 else if ( tagName == QString( "timeformat" ) )
306 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->timeFormat() );
307 e.replaceChild( t, e.firstChild() );
309 else if ( tagName == QString( "screensaver" ) )
311 QString s = QString( "%1" ).arg( iDisplaySettings->screensaver() );
312 QDomText t = node.ownerDocument().createTextNode( s );
313 e.replaceChild( t, e.firstChild() );
318 void Configuration::saveDateTimeSettings( const QDomNode &aXML )
320 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
322 QDomElement e = node.toElement();
323 QString tagName = e.tagName().toLower();
325 if ( tagName == QString( "dayofweek" ) )
327 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->switchDay() );
328 e.replaceChild( t, e.firstChild() );
330 else if( tagName == QString( "StandardTimeChangeMoment" ) )
332 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->STDDateTime().toString("ddMMyyyyhhmmss"));
333 e.replaceChild( t, e.firstChild() );
335 else if( tagName == QString( "DaylightSaveTimeChangeMoment" ) )
337 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->DSTDateTime().toString("ddMMyyyyhhmmss"));
338 e.replaceChild( t, e.firstChild() );
343 void Configuration::saveAdminPassword( const QDomNode &aXML )
345 QDomElement e = aXML.toElement();
346 e.setAttribute( "password", QString( adminPassword() ) );
350 Configuration* Configuration::readFromXML( const QString &aPath )
355 if ( !file.open( QIODevice::ReadOnly ) )
359 if ( !doc.setContent( &file ) )
366 QDomElement root = doc.documentElement();
367 // check if the file is the one we need
368 if ( root.tagName().toLower() != QString( "configuration" ) )
373 Configuration* conf = new Configuration();
375 conf->iAdminPassword = Configuration::readAdminPassword( root );
377 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
379 QDomElement e = node.toElement();
380 QString tagName = e.tagName().toLower();
382 if ( tagName == QString( "connection" ) )
384 conf->iConnectionSettings = Configuration::readConnectionSettings( node );
386 else if ( tagName == QString( "rooms" ) )
388 conf->iRooms = Configuration::readRooms( node );
390 else if ( tagName == QString( "language" ) )
392 conf->iLanguageCode = Configuration::readLanguageCode( node );
394 else if ( tagName == QString( "startup" ) )
396 conf->iStartupSettings = Configuration::readStartupSettings( node );
398 else if ( tagName == QString( "display" ) )
400 conf->iDisplaySettings = Configuration::readDisplaySettings( node );
402 else if ( tagName == QString( "daylight_saving_time" ) )
404 conf->iDateTimeSettings = Configuration::readDateTimeSettings(node);
411 ConnectionSettings* Configuration::readConnectionSettings( const QDomNode &aXML )
413 QString server, username, password;
414 unsigned int interval = Configuration::sDefaultInterval;
416 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
418 QDomElement e = node.toElement();
419 QString tagName = e.tagName().toLower();
421 if ( tagName == QString( "serverurl" ) )
425 else if ( tagName == QString( "username" ) )
429 else if ( tagName == QString( "password" ) )
433 else if ( tagName == QString( "refreshinterval" ) )
435 bool success = false;
436 unsigned int intervalTMP = e.text().toUInt( &success );
439 interval = intervalTMP;
444 return new ConnectionSettings( server, username, password, interval );
447 QList<Room*> Configuration::readRooms( const QDomNode &aXML )
451 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
453 QDomElement e = node.toElement();
454 QString tagName = e.tagName().toLower();
456 if ( tagName == QString( "room" ) )
458 QString name, address;
460 for ( QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode = roomNode.nextSibling() )
462 QDomElement roomElem = roomNode.toElement();
463 tagName = roomElem.tagName().toLower();
464 if ( tagName == QString( "name" ) )
466 name = roomElem.text();
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 );