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 e.replaceChild( t, e.firstChild() );
164 else if ( tagName == QString( "username" ) )
166 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->username() );
167 e.replaceChild( t, e.firstChild() );
169 else if ( tagName == QString( "password" ) )
171 QDomText t = node.ownerDocument().createTextNode( iConnectionSettings->password() );
172 e.replaceChild( t, e.firstChild() );
174 else if ( tagName == QString( "refreshinterval" ) )
176 QString s = QString( "%1" ).arg( iConnectionSettings->refreshInterval() );
177 QDomText t = node.ownerDocument().createTextNode( s );
178 e.replaceChild( t, e.firstChild() );
183 void Configuration::saveRooms( const QDomNode &aXML )
185 //! List of rooms must be cleared and rewritten again
186 QDomDocument doc = aXML.ownerDocument();
187 QDomNode root = aXML;
189 // Remove child nodes...
190 int count = root.childNodes().count();
191 QDomNode node = root.firstChild();
193 for (int i=0; i<count; i++)
195 qDebug() << "remove " << node.toElement().text();
196 next = node.nextSibling();
197 node = root.removeChild(node);
201 QList<Room*>::iterator i;
202 for ( i = iRooms.begin(); i != iRooms.end(); ++i )
204 QDomElement tag = doc.createElement( "room" );
205 node.appendChild( tag );
207 // First room in the list is a dafault room
208 if ( i == iRooms.begin() )
210 tag.setAttribute( "default", "true" );
213 QDomElement ename = doc.createElement( "name" );
214 QDomText tname = node.ownerDocument().createTextNode(( *i )->name() );
215 ename.appendChild( tname );
216 tag.appendChild( ename );
218 QDomElement eaddress = doc.createElement( "address" );
219 QDomText taddress = node.ownerDocument().createTextNode(( *i )->address() );
220 eaddress.appendChild( taddress );
221 tag.appendChild( eaddress );
225 void Configuration::saveLanguageCode( const QDomNode &aXML )
227 QDomElement e = aXML.toElement();
228 e.setAttribute( "code", languageCode() );
231 void Configuration::saveStartupSettings( const QDomNode &aXML )
233 QDomElement e = aXML.toElement();
235 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
237 e = node.toElement();
238 QString tagName = e.tagName().toLower();
240 if ( tagName == QString( "powersaving" ) )
242 ( iStartupSettings->isPowersavingEnabled() ?
243 e.setAttribute( "enabled", "true" ) :
244 e.setAttribute( "enabled", "false" ) );
246 e.setAttribute( "on", iStartupSettings->turnOnAt().toString( "hh:mm" ) );
247 e.setAttribute( "off", iStartupSettings->turnOffAt().toString( "hh:mm" ) );
252 void Configuration::saveDisplaySettings( const QDomNode &aXML )
254 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
256 QDomElement e = node.toElement();
257 QString tagName = e.tagName().toLower();
259 if ( tagName == QString( "schedule" ) )
261 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
263 QDomElement scheduleElem = scheduleNode.toElement();
264 tagName = scheduleElem.tagName().toLower();
266 if ( tagName == QString( "week" ) )
268 scheduleElem.setAttribute( "days", iDisplaySettings->daysInSchedule() );
270 else if ( tagName == QString( "day" ) )
272 scheduleElem.setAttribute( "startsat", iDisplaySettings->dayStartsAt().toString( "hh:mm" ) );
273 scheduleElem.setAttribute( "endsat", iDisplaySettings->dayEndsAt().toString( "hh:mm" ) );
277 else if ( tagName == QString( "dateformat" ) )
279 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->dateFormat() );
280 e.replaceChild( t, e.firstChild() );
282 else if ( tagName == QString( "timeformat" ) )
284 QDomText t = node.ownerDocument().createTextNode( iDisplaySettings->timeFormat() );
285 e.replaceChild( t, e.firstChild() );
287 else if ( tagName == QString( "screensaver" ) )
289 QString s = QString( "%1" ).arg( iDisplaySettings->screensaver() );
290 QDomText t = node.ownerDocument().createTextNode( s );
291 e.replaceChild( t, e.firstChild() );
296 void Configuration::saveDateTimeSettings( const QDomNode &aXML )
298 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
300 QDomElement e = node.toElement();
301 QString tagName = e.tagName().toLower();
303 if ( tagName == QString( "dayofweek" ) )
305 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->switchDay() );
306 e.replaceChild( t, e.firstChild() );
308 else if( tagName == QString( "StandardTimeChangeMoment" ) )
310 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->STDDateTime().toString("ddMMyyyyhhmmss"));
311 e.replaceChild( t, e.firstChild() );
313 else if( tagName == QString( "DaylightSaveTimeChangeMoment" ) )
315 QDomText t = node.ownerDocument().createTextNode( iDateTimeSettings->DSTDateTime().toString("ddMMyyyyhhmmss"));
316 e.replaceChild( t, e.firstChild() );
321 void Configuration::saveAdminPassword( const QDomNode &aXML )
323 QDomElement e = aXML.toElement();
324 e.setAttribute( "password", QString( adminPassword() ) );
328 Configuration* Configuration::readFromXML( const QString &aPath )
333 if ( !file.open( QIODevice::ReadOnly ) )
337 if ( !doc.setContent( &file ) )
344 QDomElement root = doc.documentElement();
345 // check if the file is the one we need
346 if ( root.tagName().toLower() != QString( "configuration" ) )
351 Configuration* conf = new Configuration();
353 conf->iAdminPassword = Configuration::readAdminPassword( root );
355 for ( QDomNode node = root.firstChild(); !node.isNull(); node = node.nextSibling() )
357 QDomElement e = node.toElement();
358 QString tagName = e.tagName().toLower();
360 if ( tagName == QString( "connection" ) )
362 conf->iConnectionSettings = Configuration::readConnectionSettings( node );
364 else if ( tagName == QString( "rooms" ) )
366 conf->iRooms = Configuration::readRooms( node );
368 else if ( tagName == QString( "language" ) )
370 conf->iLanguageCode = Configuration::readLanguageCode( node );
372 else if ( tagName == QString( "startup" ) )
374 conf->iStartupSettings = Configuration::readStartupSettings( node );
376 else if ( tagName == QString( "display" ) )
378 conf->iDisplaySettings = Configuration::readDisplaySettings( node );
380 else if ( tagName == QString( "daylight_saving_time" ) )
382 conf->iDateTimeSettings = Configuration::readDateTimeSettings(node);
389 ConnectionSettings* Configuration::readConnectionSettings( const QDomNode &aXML )
391 QString server, username, password;
392 unsigned int interval = Configuration::sDefaultInterval;
394 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
396 QDomElement e = node.toElement();
397 QString tagName = e.tagName().toLower();
399 if ( tagName == QString( "serverurl" ) )
403 else if ( tagName == QString( "username" ) )
407 else if ( tagName == QString( "password" ) )
411 else if ( tagName == QString( "refreshinterval" ) )
413 bool success = false;
414 unsigned int intervalTMP = e.text().toUInt( &success );
417 interval = intervalTMP;
422 return new ConnectionSettings( server, username, password, interval );
425 QList<Room*> Configuration::readRooms( const QDomNode &aXML )
429 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
431 QDomElement e = node.toElement();
432 QString tagName = e.tagName().toLower();
434 if ( tagName == QString( "room" ) )
436 QString name, address;
438 for ( QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode = roomNode.nextSibling() )
440 QDomElement roomElem = roomNode.toElement();
441 tagName = roomElem.tagName().toLower();
442 if ( tagName == QString( "name" ) )
444 name = roomElem.text();
446 else if ( tagName == QString( "address" ) )
448 address = roomElem.text();
451 Room* room = new Room( name, address );
452 QString defaultAttr = e.attribute( "default" ).toLower();
453 if ( defaultAttr == QString( "true" ) )
455 rooms.insert( 0, room );
459 rooms.append( room );
467 QString Configuration::readLanguageCode( const QDomNode &aXML )
469 QDomElement e = aXML.toElement();
470 QString tagName = e.tagName().toLower();
472 if ( e.hasAttribute( "code" ) )
474 return e.attribute( "code" );
478 // default language is English
483 StartupSettings * Configuration::readStartupSettings( const QDomNode &aXML )
485 QDomElement e = aXML.toElement();
487 bool isPowersavingEnabled = false;
488 QTime turnOnAt, turnOffAt;
490 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
492 e = node.toElement();
493 QString tagName = e.tagName().toLower();
495 if ( tagName == QString( "powersaving" ) )
497 if ( e.hasAttribute( "enabled" ) &&
498 e.attribute( "enabled" ) == QString( "true" ) )
500 isPowersavingEnabled = true;
503 if ( e.hasAttribute( "on" ) )
505 QString on = e.attribute( "on" );
506 turnOnAt = QTime::fromString( on, "hh:mm" );
510 if ( e.hasAttribute( "off" ) )
512 QString off = e.attribute( "off" );
513 turnOffAt = QTime::fromString( off, "hh:mm" );
518 return new StartupSettings( isPowersavingEnabled, turnOnAt, turnOffAt );
521 DisplaySettings * Configuration::readDisplaySettings( const QDomNode &aXML )
523 DisplaySettings::DaysInSchedule daysInSchedule = DisplaySettings::WeekdaysInSchedule;
524 QTime dayStartsAt, dayEndsAt;
525 DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
526 DisplaySettings::TimeFormat timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
527 int screensaver = 1; //! Default value for screensaver wait time
529 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
531 QDomElement e = node.toElement();
532 QString tagName = e.tagName().toLower();
534 if ( tagName == QString( "schedule" ) )
536 for ( QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode = scheduleNode.nextSibling() )
538 QDomElement scheduleElem = scheduleNode.toElement();
539 tagName = scheduleElem.tagName().toLower();
541 if ( tagName == QString( "week" ) )
543 if ( scheduleElem.hasAttribute( "days" ) )
545 // default value is 5, only other supported possibility is 7
546 bool success = false;
547 unsigned int days = scheduleElem.attribute( "days" ).toUInt( &success );
548 daysInSchedule = ( success && days == 7 ) ? DisplaySettings::WholeWeekInSchedule : DisplaySettings::WeekdaysInSchedule;
552 else if ( tagName == QString( "day" ) )
554 if ( scheduleElem.hasAttribute( "startsat" ) )
556 QString time = scheduleElem.attribute( "startsat" );
557 dayStartsAt = QTime::fromString( time, "hh:mm" );
559 if ( scheduleElem.hasAttribute( "endsat" ) )
561 QString time = scheduleElem.attribute( "endsat" );
562 dayEndsAt = QTime::fromString( time, "hh:mm" );
568 else if ( tagName == QString( "dateformat" ) )
570 //! Not able to display long format anyway at the moment
572 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
573 dateformat = DisplaySettings::LongDateFormat;
575 dateformat = DisplaySettings::ShortDateFormat;
577 dateformat = DisplaySettings::ShortDateFormat;
579 else if ( tagName == QString( "timeformat" ) )
581 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
583 if ( e.text() == QObject::tr( "hh:mm ap" ) )
584 timeformat = DisplaySettings::TwelveHoursTimeFormat;
586 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
588 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
590 else if ( tagName == QString( "screensaver" ) )
592 bool success = false;
593 unsigned int screensaverTMP = e.text().toUInt( &success );
596 screensaver = screensaverTMP;
601 return new DisplaySettings( dateformat, timeformat, daysInSchedule, dayStartsAt, dayEndsAt, screensaver );
604 DateTimeSettings * Configuration::readDateTimeSettings( const QDomNode &aXML )
607 QDateTime standardTimeChangeMoment = QDateTime::fromString("05.10.2009 04:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
608 QDateTime daylightSaveTimeChangeMoment = QDateTime::fromString("01.04.2010 03:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
609 DateTimeSettings::weekDay dayOfWeek = DateTimeSettings::Sunday;
611 for ( QDomNode node = aXML.firstChild(); !node.isNull(); node = node.nextSibling() )
613 QDomElement e = node.toElement();
614 QString tagName = e.tagName().toLower();
616 if ( tagName == QString( "dayofweek" ) )
618 qDebug() << "Configuration::readDateTimeSettings: " +e.text();
620 bool success = false;
621 unsigned int weekDayTmp = e.text().toUInt( &success );
622 if( success && weekDayTmp >= 0 && weekDayTmp < 7)
624 dayOfWeek = (DateTimeSettings::weekDay)weekDayTmp;
627 else if( tagName == QString( "standardtimechangemoment" ) )
629 standardTimeChangeMoment = QDateTime::fromString(e.text(), "dd'.'MM'.'yyyy' 'hh:mm:ss");
630 qDebug() << "Configuration::readDateTimeSettings: " +standardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
632 else if( tagName == QString( "daylightsavetimechangemoment" ) )
634 daylightSaveTimeChangeMoment = QDateTime::fromString(e.text(), "dd'.'MM'.'yyyy' 'hh:mm:ss");
635 qDebug() << "Configuration::readDateTimeSettings: " +daylightSaveTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
639 return new DateTimeSettings(standardTimeChangeMoment, daylightSaveTimeChangeMoment, dayOfWeek);
642 QByteArray Configuration::readAdminPassword( const QDomNode &aXML )
644 QDomElement e = aXML.toElement();
645 QString tagName = e.tagName().toLower();
646 if ( e.hasAttribute( "password" ) )
648 QString pw = e.attribute( "password" );
649 // Check if the password is default uncrypted "admin"
650 if ( pw == QString( "admin" ) )
652 // uncrypted password needs to be encoded
653 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
654 hash->addData( pw.toUtf8() );
655 pw = QString( hash->result() );
658 return ( pw.toAscii() ).toHex();
667 void Configuration::setRooms( const QList<Room*> aRooms )
672 QString Configuration::hashPassword( const QString aPassword )
674 QCryptographicHash *hash = new QCryptographicHash( QCryptographicHash::Md5 );
675 hash->addData( aPassword.toUtf8() );
676 QByteArray password = hash->result();
679 return QString( password );