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>
17 Configuration * Configuration::sInstance = 0;
18 QString Configuration::sConfigurationPath = "/etc/QtMeetings.conf";
20 Configuration::Configuration() :
21 iConnectionSettings(0), iStartupSettings(0), iDisplaySettings(0),
22 iDateTimeSettings(0) {
25 Configuration::~Configuration() {
26 delete iConnectionSettings;
27 delete iStartupSettings;
28 delete iDisplaySettings;
29 delete iDateTimeSettings;
30 while (!iRooms.isEmpty()) {
31 delete iRooms.takeFirst();
35 Configuration* Configuration::instance() {
38 sInstance = new Configuration();
39 sInstance->readFromXML(sConfigurationPath);
41 qDebug() << "FATAL: Configuration cannot be read from:"
42 << Configuration::sConfigurationPath;
48 /*ConnectionSettings* Configuration::connectionSettings()
50 return iConnectionSettings;
53 StartupSettings * Configuration::startupSettings() {
54 return iStartupSettings;
57 DisplaySettings * Configuration::displaySettings() {
58 return iDisplaySettings;
61 DateTimeSettings * Configuration::dateTimeSettings() {
62 return iDateTimeSettings;
65 Room* Configuration::defaultRoom() {
66 // default room is stored as the first element of the list
67 return (iRooms.count() == 0) ? 0 : iRooms.at(0);
70 QString Configuration::languageCode() {
74 QList<Room*> Configuration::rooms() {
78 QByteArray Configuration::adminPassword() {
79 return iAdminPassword;
81 QUrl Configuration::getServerUrl() {
82 return iConnectionSettings->serverUrl();
85 QString Configuration::getUsername() {
86 return iConnectionSettings->username();
88 QString Configuration::getPassword() {
89 return iConnectionSettings->password();
92 unsigned int Configuration::getRefreshinterval() {
93 return iConnectionSettings->refreshInterval();
96 void Configuration::setServerUrl(QUrl serverUrl) {
97 iConnectionSettings->setServerUrl(serverUrl);
99 void Configuration::setUsername(QString username) {
100 iConnectionSettings->setUsername(username);
102 void Configuration::setPassword(QString password) {
103 iConnectionSettings->setPassword(password);
105 void Configuration::setRefreshinterval(unsigned int refreshinterval) {
106 iConnectionSettings->setRefreshInterval(refreshinterval);
109 void Configuration::save() {
111 QFile file(sConfigurationPath);
112 if (!file.open(QIODevice::ReadWrite)) {
116 if (!doc.setContent(&file)) {
121 QDomElement root = doc.documentElement();
122 // Save all attributes to document
124 saveAdminPassword(root);
126 for (QDomNode node = root.firstChild(); !node.isNull(); node
127 = node.nextSibling()) {
128 QDomElement e = node.toElement();
129 QString tagName = e.tagName().toLower();
130 if (tagName == QString("connection")) {
131 saveConnectionSettings(node);
132 } else if (tagName == QString("rooms")) {
134 } else if (tagName == QString("language")) {
135 saveLanguageCode(node);
136 } else if (tagName == QString("startup")) {
137 saveStartupSettings(node);
138 } else if (tagName == QString("display")) {
139 saveDisplaySettings(node);
140 } else if (tagName == QString("daylight_saving_time")) {
141 saveDateTimeSettings(node);
145 //! Empty the file from previous content and write again with new one
147 file.write(doc.toByteArray(4)); //! 4 as intent
150 emit configurationChanged();
153 void Configuration::saveConnectionSettings(const QDomNode &aXML) {
154 QDomElement e = aXML.firstChild().toElement();
155 QString tagName = e.tagName().toLower();
157 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
158 = node.nextSibling()) {
159 QDomElement e = node.toElement();
160 QString tagName = e.tagName().toLower();
162 if (tagName == QString("serverurl")) {
163 QDomText t = node.ownerDocument().createTextNode(
164 iConnectionSettings->serverUrl().toString());
165 if (e.hasChildNodes()) {
167 e.replaceChild(t, e.firstChild());
171 } else if (tagName == QString("username")) {
172 QDomText t = node.ownerDocument().createTextNode(
173 iConnectionSettings->username());
174 if (e.hasChildNodes()) {
175 e.replaceChild(t, e.firstChild());
180 } else if (tagName == QString("password")) {
181 QDomText t = node.ownerDocument().createTextNode(
182 iConnectionSettings->password());
183 if (e.hasChildNodes()) {
184 e.replaceChild(t, e.firstChild());
188 } else if (tagName == QString("refreshinterval")) {
189 QString s = QString("%1").arg(
190 iConnectionSettings->refreshInterval());
191 QDomText t = node.ownerDocument().createTextNode(s);
192 e.replaceChild(t, e.firstChild());
197 void Configuration::saveRooms(const QDomNode &aXML) {
198 //! List of rooms must be cleared and rewritten again
199 QDomDocument doc = aXML.ownerDocument();
200 QDomNode root = aXML;
202 // Remove child nodes...
203 int count = root.childNodes().count();
204 QDomNode node = root.firstChild();
206 for (int i = 0; i < count; i++) {
207 qDebug() << "remove " << node.toElement().text();
208 next = node.nextSibling();
209 node = root.removeChild(node);
214 QList<Room*>::iterator i;
215 for (i = iRooms.begin(); i != iRooms.end(); ++i) {
216 QDomElement tag = doc.createElement("room");
217 node.appendChild(tag);
219 // First room in the list is a dafault room
220 if (i == iRooms.begin()) {
221 tag.setAttribute("default", "true");
224 QDomElement ename = doc.createElement("name");
225 QDomText tname = node.ownerDocument().createTextNode((*i)->name());
226 ename.appendChild(tname);
227 tag.appendChild(ename);
229 QDomElement eaddress = doc.createElement("address");
231 node.ownerDocument().createTextNode((*i)->address());
232 eaddress.appendChild(taddress);
233 tag.appendChild(eaddress);
237 void Configuration::saveLanguageCode(const QDomNode &aXML) {
238 QDomElement e = aXML.toElement();
239 e.setAttribute("code", languageCode());
242 void Configuration::saveStartupSettings(const QDomNode &aXML) {
243 QDomElement e = aXML.toElement();
245 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
246 = node.nextSibling()) {
247 e = node.toElement();
248 QString tagName = e.tagName().toLower();
250 if (tagName == QString("powersaving")) {
251 (iStartupSettings->isPowersavingEnabled() ? e.setAttribute(
252 "enabled", "true") : e.setAttribute("enabled", "false"));
254 e.setAttribute("on", iStartupSettings->turnOnAt().toString("hh:mm"));
255 e.setAttribute("off", iStartupSettings->turnOffAt().toString(
261 void Configuration::saveDisplaySettings(const QDomNode &aXML) {
262 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
263 = node.nextSibling()) {
264 QDomElement e = node.toElement();
265 QString tagName = e.tagName().toLower();
267 if (tagName == QString("schedule")) {
268 for (QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode
269 = scheduleNode.nextSibling()) {
270 QDomElement scheduleElem = scheduleNode.toElement();
271 tagName = scheduleElem.tagName().toLower();
273 if (tagName == QString("week")) {
274 scheduleElem.setAttribute("days",
275 iDisplaySettings->daysInSchedule());
276 } else if (tagName == QString("day")) {
277 scheduleElem.setAttribute("startsat",
278 iDisplaySettings->dayStartsAt().toString("hh:mm"));
279 scheduleElem.setAttribute("endsat",
280 iDisplaySettings->dayEndsAt().toString("hh:mm"));
284 else if (tagName == QString("dateformat")) {
285 QDomText t = node.ownerDocument().createTextNode(
286 iDisplaySettings->dateFormat());
287 e.replaceChild(t, e.firstChild());
288 } else if (tagName == QString("timeformat")) {
289 QDomText t = node.ownerDocument().createTextNode(
290 iDisplaySettings->timeFormat());
291 e.replaceChild(t, e.firstChild());
292 } else if (tagName == QString("screensaver")) {
293 QString s = QString("%1").arg(iDisplaySettings->screensaver());
294 QDomText t = node.ownerDocument().createTextNode(s);
295 e.replaceChild(t, e.firstChild());
300 void Configuration::saveDateTimeSettings(const QDomNode &aXML) {
301 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
302 = node.nextSibling()) {
303 QDomElement e = node.toElement();
304 QString tagName = e.tagName().toLower();
306 if (tagName == QString("dayofweek")) {
307 QDomText t = node.ownerDocument().createTextNode(
308 iDateTimeSettings->switchDay());
309 e.replaceChild(t, e.firstChild());
310 } else if (tagName == QString("StandardTimeChangeMoment")) {
312 node.ownerDocument().createTextNode(
313 iDateTimeSettings->STDDateTime().toString(
315 e.replaceChild(t, e.firstChild());
316 } else if (tagName == QString("DaylightSaveTimeChangeMoment")) {
318 node.ownerDocument().createTextNode(
319 iDateTimeSettings->DSTDateTime().toString(
321 e.replaceChild(t, e.firstChild());
326 void Configuration::saveAdminPassword(const QDomNode &aXML) {
327 QDomElement e = aXML.toElement();
328 e.setAttribute("password", QString(adminPassword()));
331 void Configuration::readFromXML(const QString &aPath) {
335 if (!file.open(QIODevice::ReadOnly)) {
338 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")) {
350 iAdminPassword = /*Configuration::*/readAdminPassword(root);
352 for (QDomNode node = root.firstChild(); !node.isNull(); node
353 = node.nextSibling()) {
354 QDomElement e = node.toElement();
355 QString tagName = e.tagName().toLower();
357 if (tagName == QString("connection")) {
358 iConnectionSettings = readConnectionSettings(node);
360 } else if (tagName == QString("rooms")) {
361 iRooms = readRooms(node);
362 } else if (tagName == QString("language")) {
363 iLanguageCode = readLanguageCode(node);
364 } else if (tagName == QString("startup")) {
365 iStartupSettings = readStartupSettings(node);
366 } else if (tagName == QString("display")) {
367 iDisplaySettings = readDisplaySettings(node);
368 } else if (tagName == QString("daylight_saving_time")) {
369 iDateTimeSettings = /*Configuration::*/readDateTimeSettings(node);
374 ConnectionSettings* Configuration::readConnectionSettings(const QDomNode &aXML) {
375 QString server, username, password;
376 unsigned int interval = Configuration::sDefaultInterval;
378 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
379 = node.nextSibling()) {
380 QDomElement e = node.toElement();
381 QString tagName = e.tagName().toLower();
383 if (tagName == QString("serverurl")) {
385 } else if (tagName == QString("username")) {
387 } else if (tagName == QString("password")) {
389 } else if (tagName == QString("refreshinterval")) {
390 bool success = false;
391 unsigned int intervalTMP = e.text().toUInt(&success);
393 interval = intervalTMP;
398 return new ConnectionSettings(server, username, password, interval);
401 QList<Room*> Configuration::readRooms(const QDomNode &aXML) {
404 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
405 = node.nextSibling()) {
406 QDomElement e = node.toElement();
407 QString tagName = e.tagName().toLower();
409 if (tagName == QString("room")) {
410 QString name, address;
412 for (QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode
413 = roomNode.nextSibling()) {
414 QDomElement roomElem = roomNode.toElement();
415 tagName = roomElem.tagName().toLower();
416 if (tagName == QString("name")) {
417 name = roomElem.text();
418 } else if (tagName == QString("address")) {
419 address = roomElem.text();
422 Room* room = new Room(name, address);
423 QString defaultAttr = e.attribute("default").toLower();
424 if (defaultAttr == QString("true")) {
425 rooms.insert(0, room);
435 QString Configuration::readLanguageCode(const QDomNode &aXML) {
436 QDomElement e = aXML.toElement();
437 QString tagName = e.tagName().toLower();
439 if (e.hasAttribute("code")) {
440 return e.attribute("code");
442 // default language is English
447 StartupSettings * Configuration::readStartupSettings(const QDomNode &aXML) {
448 QDomElement e = aXML.toElement();
450 bool isPowersavingEnabled = false;
451 QTime turnOnAt, turnOffAt;
453 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
454 = node.nextSibling()) {
455 e = node.toElement();
456 QString tagName = e.tagName().toLower();
458 if (tagName == QString("powersaving")) {
459 if (e.hasAttribute("enabled") && e.attribute("enabled") == QString(
461 isPowersavingEnabled = true;
464 if (e.hasAttribute("on")) {
465 QString on = e.attribute("on");
466 turnOnAt = QTime::fromString(on, "hh:mm");
470 if (e.hasAttribute("off")) {
471 QString off = e.attribute("off");
472 turnOffAt = QTime::fromString(off, "hh:mm");
477 return new StartupSettings(isPowersavingEnabled, turnOnAt, turnOffAt);
480 DisplaySettings * Configuration::readDisplaySettings(const QDomNode &aXML) {
481 DisplaySettings::DaysInSchedule daysInSchedule =
482 DisplaySettings::WeekdaysInSchedule;
483 QTime dayStartsAt, dayEndsAt;
484 DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
485 DisplaySettings::TimeFormat timeformat =
486 DisplaySettings::TwentyFourHoursTimeFormat;
487 int screensaver = 1; //! Default value for screensaver wait time
489 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
490 = node.nextSibling()) {
491 QDomElement e = node.toElement();
492 QString tagName = e.tagName().toLower();
494 if (tagName == QString("schedule")) {
495 for (QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode
496 = scheduleNode.nextSibling()) {
497 QDomElement scheduleElem = scheduleNode.toElement();
498 tagName = scheduleElem.tagName().toLower();
500 if (tagName == QString("week")) {
501 if (scheduleElem.hasAttribute("days")) {
502 // default value is 5, only other supported possibility is 7
503 bool success = false;
505 scheduleElem.attribute("days").toUInt(&success);
507 = (success && days == 7) ? DisplaySettings::WholeWeekInSchedule
508 : DisplaySettings::WeekdaysInSchedule;
511 } else if (tagName == QString("day")) {
512 if (scheduleElem.hasAttribute("startsat")) {
513 QString time = scheduleElem.attribute("startsat");
514 dayStartsAt = QTime::fromString(time, "hh:mm");
516 if (scheduleElem.hasAttribute("endsat")) {
517 QString time = scheduleElem.attribute("endsat");
518 dayEndsAt = QTime::fromString(time, "hh:mm");
524 else if (tagName == QString("dateformat")) {
525 //! Not able to display long format anyway at the moment
527 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
528 dateformat = DisplaySettings::LongDateFormat;
530 dateformat = DisplaySettings::ShortDateFormat;
532 dateformat = DisplaySettings::ShortDateFormat;
533 } else if (tagName == QString("timeformat")) {
534 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
536 if ( e.text() == QObject::tr( "hh:mm ap" ) )
537 timeformat = DisplaySettings::TwelveHoursTimeFormat;
539 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
541 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
542 } else if (tagName == QString("screensaver")) {
543 bool success = false;
544 unsigned int screensaverTMP = e.text().toUInt(&success);
546 screensaver = screensaverTMP;
551 return new DisplaySettings(dateformat, timeformat, daysInSchedule,
552 dayStartsAt, dayEndsAt, screensaver);
555 DateTimeSettings * Configuration::readDateTimeSettings(const QDomNode &aXML) {
557 QDateTime standardTimeChangeMoment = QDateTime::fromString(
558 "05.10.2009 04:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
559 QDateTime daylightSaveTimeChangeMoment = QDateTime::fromString(
560 "01.04.2010 03:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
561 DateTimeSettings::weekDay dayOfWeek = DateTimeSettings::Sunday;
563 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
564 = node.nextSibling()) {
565 QDomElement e = node.toElement();
566 QString tagName = e.tagName().toLower();
568 if (tagName == QString("dayofweek")) {
569 qDebug() << "Configuration::readDateTimeSettings: " + e.text();
571 bool success = false;
572 unsigned int weekDayTmp = e.text().toUInt(&success);
573 if (success && weekDayTmp < 7) {
574 dayOfWeek = (DateTimeSettings::weekDay) weekDayTmp;
576 } else if (tagName == QString("standardtimechangemoment")) {
577 standardTimeChangeMoment = QDateTime::fromString(e.text(),
578 "dd'.'MM'.'yyyy' 'hh:mm:ss");
579 qDebug() << "Configuration::readDateTimeSettings: "
580 + standardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
581 } else if (tagName == QString("daylightsavetimechangemoment")) {
582 daylightSaveTimeChangeMoment = QDateTime::fromString(e.text(),
583 "dd'.'MM'.'yyyy' 'hh:mm:ss");
584 qDebug() << "Configuration::readDateTimeSettings: "
585 + daylightSaveTimeChangeMoment.toString(
586 "dd.MM.yyyy hh:mm:ss");
590 return new DateTimeSettings(standardTimeChangeMoment,
591 daylightSaveTimeChangeMoment, dayOfWeek);
594 QByteArray Configuration::readAdminPassword(const QDomNode &aXML) {
595 QDomElement e = aXML.toElement();
596 QString tagName = e.tagName().toLower();
597 if (e.hasAttribute("password")) {
598 QString pw = e.attribute("password");
599 // Check if the password is default uncrypted "admin"
601 int x = QString::compare(pw, "admin", Qt::CaseInsensitive); // x == 0
604 // uncrypted password needs to be encoded
605 QCryptographicHash *hash = new QCryptographicHash(
606 QCryptographicHash::Md5);
607 hash->addData(pw.toUtf8());
608 pw = QString(hash->result());
610 return (pw.toAscii()).toHex();
613 return (pw.toAscii());
620 void Configuration::setRooms(const QList<Room*> aRooms) {
624 QString Configuration::hashPassword(const QString aPassword) {
625 QCryptographicHash *hash = new QCryptographicHash(QCryptographicHash::Md5);
626 hash->addData(aPassword.toUtf8());
627 QByteArray password = hash->result();
630 return QString(password);