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),
23 iShowConfidentialMeetingDetails(false)
27 Configuration::~Configuration() {
28 delete iConnectionSettings;
29 delete iStartupSettings;
30 delete iDisplaySettings;
31 delete iDateTimeSettings;
32 while (!iRooms.isEmpty()) {
33 delete iRooms.takeFirst();
37 Configuration* Configuration::instance() {
40 sInstance = new Configuration();
41 sInstance->readFromXML(sConfigurationPath);
43 qDebug() << "FATAL: Configuration cannot be read from:"
44 << Configuration::sConfigurationPath;
50 /*ConnectionSettings* Configuration::connectionSettings()
52 return iConnectionSettings;
55 StartupSettings * Configuration::startupSettings() {
56 return iStartupSettings;
59 DisplaySettings * Configuration::displaySettings() {
60 return iDisplaySettings;
63 DateTimeSettings * Configuration::dateTimeSettings() {
64 return iDateTimeSettings;
67 Room* Configuration::defaultRoom() {
68 // default room is stored as the first element of the list
69 return (iRooms.count() == 0) ? 0 : iRooms.at(0);
72 QString Configuration::languageCode() {
76 QList<Room*> Configuration::rooms() {
80 QByteArray Configuration::adminPassword() {
81 return iAdminPassword;
83 QUrl Configuration::getServerUrl() {
84 return iConnectionSettings->serverUrl();
87 QString Configuration::getUsername() {
88 return iConnectionSettings->username();
90 QString Configuration::getPassword() {
91 return iConnectionSettings->password();
94 unsigned int Configuration::getRefreshinterval() {
95 return iConnectionSettings->refreshInterval();
98 void Configuration::setServerUrl(QUrl serverUrl) {
99 iConnectionSettings->setServerUrl(serverUrl);
101 void Configuration::setUsername(QString username) {
102 iConnectionSettings->setUsername(username);
104 void Configuration::setPassword(QString password) {
105 iConnectionSettings->setPassword(password);
107 void Configuration::setRefreshinterval(unsigned int refreshinterval) {
108 iConnectionSettings->setRefreshInterval(refreshinterval);
111 void Configuration::save() {
113 QFile file(sConfigurationPath);
114 if (!file.open(QIODevice::ReadWrite)) {
118 if (!doc.setContent(&file)) {
123 QDomElement root = doc.documentElement();
124 // Save all attributes to document
126 saveAdminPassword(root);
128 bool confidentialMeetingDetailsElementMissing = true;
130 for (QDomNode node = root.firstChild(); !node.isNull(); node
131 = node.nextSibling()) {
132 QDomElement e = node.toElement();
133 QString tagName = e.tagName().toLower();
134 if (tagName == QString("connection")) {
135 saveConnectionSettings(node);
136 } else if (tagName == QString("rooms")) {
138 } else if (tagName == QString("language")) {
139 saveLanguageCode(node);
140 } else if (tagName == QString("startup")) {
141 saveStartupSettings(node);
142 } else if (tagName == QString("display")) {
143 saveDisplaySettings(node);
144 } else if (tagName == QString("daylight_saving_time")) {
145 saveDateTimeSettings(node);
146 } else if (tagName == QString("privacy")) {
147 confidentialMeetingDetailsElementMissing = false;
148 savePrivacySettings(node);
152 if( confidentialMeetingDetailsElementMissing )
154 QDomElement e = root.ownerDocument().createElement("privacy");
155 savePrivacySettings(e);
159 //! Empty the file from previous content and write again with new one
161 file.write(doc.toByteArray(4)); //! 4 as intent
164 emit configurationChanged();
167 void Configuration::saveConnectionSettings(const QDomNode &aXML) {
168 QDomElement e = aXML.firstChild().toElement();
169 QString tagName = e.tagName().toLower();
171 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
172 = node.nextSibling()) {
173 QDomElement e = node.toElement();
174 QString tagName = e.tagName().toLower();
176 if (tagName == QString("serverurl")) {
177 QDomText t = node.ownerDocument().createTextNode(
178 iConnectionSettings->serverUrl().toString());
179 if (e.hasChildNodes()) {
180 e.replaceChild(t, e.firstChild());
184 } else if (tagName == QString("username")) {
185 QDomText t = node.ownerDocument().createTextNode(
186 iConnectionSettings->username());
187 if (e.hasChildNodes()) {
188 e.replaceChild(t, e.firstChild());
193 } else if (tagName == QString("password")) {
194 QDomText t = node.ownerDocument().createTextNode(
195 iConnectionSettings->password());
196 if (e.hasChildNodes()) {
197 e.replaceChild(t, e.firstChild());
201 } else if (tagName == QString("refreshinterval")) {
202 QString s = QString("%1").arg(
203 iConnectionSettings->refreshInterval());
204 QDomText t = node.ownerDocument().createTextNode(s);
205 e.replaceChild(t, e.firstChild());
210 void Configuration::saveRooms(const QDomNode &aXML) {
211 //! List of rooms must be cleared and rewritten again
212 QDomDocument doc = aXML.ownerDocument();
213 QDomNode root = aXML;
215 // Remove child nodes...
216 int count = root.childNodes().count();
217 QDomNode node = root.firstChild();
219 for (int i = 0; i < count; i++) {
220 qDebug() << "remove " << node.toElement().text();
221 next = node.nextSibling();
222 node = root.removeChild(node);
227 QList<Room*>::iterator i;
228 for (i = iRooms.begin(); i != iRooms.end(); ++i) {
229 QDomElement tag = doc.createElement("room");
230 node.appendChild(tag);
232 // First room in the list is a dafault room
233 if (i == iRooms.begin()) {
234 tag.setAttribute("default", "true");
237 QDomElement ename = doc.createElement("name");
238 QDomText tname = node.ownerDocument().createTextNode((*i)->name());
239 ename.appendChild(tname);
240 tag.appendChild(ename);
242 QDomElement eaddress = doc.createElement("address");
244 node.ownerDocument().createTextNode((*i)->address());
245 eaddress.appendChild(taddress);
246 tag.appendChild(eaddress);
250 void Configuration::saveLanguageCode(const QDomNode &aXML) {
251 QDomElement e = aXML.toElement();
252 e.setAttribute("code", languageCode());
255 void Configuration::saveStartupSettings(const QDomNode &aXML) {
256 QDomElement e = aXML.toElement();
258 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
259 = node.nextSibling()) {
260 e = node.toElement();
261 QString tagName = e.tagName().toLower();
263 if (tagName == QString("powersaving")) {
264 (iStartupSettings->isPowersavingEnabled() ? e.setAttribute(
265 "enabled", "true") : e.setAttribute("enabled", "false"));
267 e.setAttribute("on", iStartupSettings->turnOnAt().toString("hh:mm"));
268 e.setAttribute("off", iStartupSettings->turnOffAt().toString(
274 void Configuration::saveDisplaySettings(const QDomNode &aXML) {
275 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
276 = node.nextSibling()) {
277 QDomElement e = node.toElement();
278 QString tagName = e.tagName().toLower();
280 if (tagName == QString("schedule")) {
281 for (QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode
282 = scheduleNode.nextSibling()) {
283 QDomElement scheduleElem = scheduleNode.toElement();
284 tagName = scheduleElem.tagName().toLower();
286 if (tagName == QString("week")) {
287 scheduleElem.setAttribute("days",
288 iDisplaySettings->daysInSchedule());
289 } else if (tagName == QString("day")) {
290 scheduleElem.setAttribute("startsat",
291 iDisplaySettings->dayStartsAt().toString("hh:mm"));
292 scheduleElem.setAttribute("endsat",
293 iDisplaySettings->dayEndsAt().toString("hh:mm"));
297 else if (tagName == QString("dateformat")) {
298 QDomText t = node.ownerDocument().createTextNode(
299 iDisplaySettings->dateFormat());
300 e.replaceChild(t, e.firstChild());
301 } else if (tagName == QString("timeformat")) {
302 QDomText t = node.ownerDocument().createTextNode(
303 iDisplaySettings->timeFormat());
304 e.replaceChild(t, e.firstChild());
305 } else if (tagName == QString("screensaver")) {
306 QString s = QString("%1").arg(iDisplaySettings->screensaver());
307 QDomText t = node.ownerDocument().createTextNode(s);
308 e.replaceChild(t, e.firstChild());
313 void Configuration::saveDateTimeSettings(const QDomNode &aXML) {
314 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
315 = node.nextSibling()) {
316 QDomElement e = node.toElement();
317 QString tagName = e.tagName().toLower();
319 if (tagName == QString("dayofweek")) {
320 QDomText t = node.ownerDocument().createTextNode(
321 iDateTimeSettings->switchDay());
322 e.replaceChild(t, e.firstChild());
323 } else if (tagName == QString("StandardTimeChangeMoment")) {
325 node.ownerDocument().createTextNode(
326 iDateTimeSettings->STDDateTime().toString(
328 e.replaceChild(t, e.firstChild());
329 } else if (tagName == QString("DaylightSaveTimeChangeMoment")) {
331 node.ownerDocument().createTextNode(
332 iDateTimeSettings->DSTDateTime().toString(
334 e.replaceChild(t, e.firstChild());
339 void Configuration::saveAdminPassword(const QDomNode &aXML) {
340 QDomElement e = aXML.toElement();
341 e.setAttribute("password", QString(adminPassword()));
344 void Configuration::readFromXML(const QString &aPath) {
348 if (!file.open(QIODevice::ReadOnly)) {
351 if (!doc.setContent(&file)) {
357 QDomElement root = doc.documentElement();
358 // check if the file is the one we need
359 if (root.tagName().toLower() != QString("configuration")) {
363 iAdminPassword = /*Configuration::*/readAdminPassword(root);
365 for (QDomNode node = root.firstChild(); !node.isNull(); node
366 = node.nextSibling()) {
367 QDomElement e = node.toElement();
368 QString tagName = e.tagName().toLower();
370 if (tagName == QString("connection")) {
371 iConnectionSettings = readConnectionSettings(node);
372 } else if (tagName == QString("rooms")) {
373 iRooms = readRooms(node);
374 } else if (tagName == QString("language")) {
375 iLanguageCode = readLanguageCode(node);
376 } else if (tagName == QString("startup")) {
377 iStartupSettings = readStartupSettings(node);
378 } else if (tagName == QString("display")) {
379 iDisplaySettings = readDisplaySettings(node);
380 } else if (tagName == QString("daylight_saving_time")) {
381 iDateTimeSettings = readDateTimeSettings(node);
382 } else if (tagName == QString("privacy")) {
383 readPrivacySettings(node);
388 ConnectionSettings* Configuration::readConnectionSettings(const QDomNode &aXML) {
389 QString server, username, password;
390 unsigned int interval = Configuration::sDefaultInterval;
392 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
393 = node.nextSibling()) {
394 QDomElement e = node.toElement();
395 QString tagName = e.tagName().toLower();
397 if (tagName == QString("serverurl")) {
399 } else if (tagName == QString("username")) {
401 } else if (tagName == QString("password")) {
403 } else if (tagName == QString("refreshinterval")) {
404 bool success = false;
405 unsigned int intervalTMP = e.text().toUInt(&success);
407 interval = intervalTMP;
412 return new ConnectionSettings(server, username, password, interval);
415 QList<Room*> Configuration::readRooms(const QDomNode &aXML) {
418 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
419 = node.nextSibling()) {
420 QDomElement e = node.toElement();
421 QString tagName = e.tagName().toLower();
423 if (tagName == QString("room")) {
424 QString name, address;
426 for (QDomNode roomNode = node.firstChild(); !roomNode.isNull(); roomNode
427 = roomNode.nextSibling()) {
428 QDomElement roomElem = roomNode.toElement();
429 tagName = roomElem.tagName().toLower();
430 if (tagName == QString("name")) {
431 name = roomElem.text();
432 } else if (tagName == QString("address")) {
433 address = roomElem.text();
436 Room* room = new Room(name, address);
437 QString defaultAttr = e.attribute("default").toLower();
438 if (defaultAttr == QString("true")) {
439 rooms.insert(0, room);
449 QString Configuration::readLanguageCode(const QDomNode &aXML) {
450 QDomElement e = aXML.toElement();
451 QString tagName = e.tagName().toLower();
453 if (e.hasAttribute("code")) {
454 return e.attribute("code");
456 // default language is English
461 StartupSettings * Configuration::readStartupSettings(const QDomNode &aXML) {
462 QDomElement e = aXML.toElement();
464 bool isPowersavingEnabled = false;
465 QTime turnOnAt, turnOffAt;
467 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
468 = node.nextSibling()) {
469 e = node.toElement();
470 QString tagName = e.tagName().toLower();
472 if (tagName == QString("powersaving")) {
473 if (e.hasAttribute("enabled") && e.attribute("enabled") == QString(
475 isPowersavingEnabled = true;
478 if (e.hasAttribute("on")) {
479 QString on = e.attribute("on");
480 turnOnAt = QTime::fromString(on, "hh:mm");
484 if (e.hasAttribute("off")) {
485 QString off = e.attribute("off");
486 turnOffAt = QTime::fromString(off, "hh:mm");
491 return new StartupSettings(isPowersavingEnabled, turnOnAt, turnOffAt);
494 DisplaySettings * Configuration::readDisplaySettings(const QDomNode &aXML) {
495 DisplaySettings::DaysInSchedule daysInSchedule =
496 DisplaySettings::WeekdaysInSchedule;
497 QTime dayStartsAt, dayEndsAt;
498 DisplaySettings::DateFormat dateformat = DisplaySettings::ShortDateFormat;
499 DisplaySettings::TimeFormat timeformat =
500 DisplaySettings::TwentyFourHoursTimeFormat;
501 int screensaver = 1; //! Default value for screensaver wait time
503 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
504 = node.nextSibling()) {
505 QDomElement e = node.toElement();
506 QString tagName = e.tagName().toLower();
508 if (tagName == QString("schedule")) {
509 for (QDomNode scheduleNode = node.firstChild(); !scheduleNode.isNull(); scheduleNode
510 = scheduleNode.nextSibling()) {
511 QDomElement scheduleElem = scheduleNode.toElement();
512 tagName = scheduleElem.tagName().toLower();
514 if (tagName == QString("week")) {
515 if (scheduleElem.hasAttribute("days")) {
516 // default value is 5, only other supported possibility is 7
517 bool success = false;
519 scheduleElem.attribute("days").toUInt(&success);
521 = (success && days == 7) ? DisplaySettings::WholeWeekInSchedule
522 : DisplaySettings::WeekdaysInSchedule;
525 } else if (tagName == QString("day")) {
526 if (scheduleElem.hasAttribute("startsat")) {
527 QString time = scheduleElem.attribute("startsat");
528 dayStartsAt = QTime::fromString(time, "hh:mm");
530 if (scheduleElem.hasAttribute("endsat")) {
531 QString time = scheduleElem.attribute("endsat");
532 dayEndsAt = QTime::fromString(time, "hh:mm");
538 else if (tagName == QString("dateformat")) {
539 //! Not able to display long format anyway at the moment
541 if ( e.text() == QObject::tr( "dddd d MMMM yyyy" ) )
542 dateformat = DisplaySettings::LongDateFormat;
544 dateformat = DisplaySettings::ShortDateFormat;
546 dateformat = DisplaySettings::ShortDateFormat;
547 } else if (tagName == QString("timeformat")) {
548 //! Not able to display "TwelveHoursTimeFormat" anyway at the moment
550 if ( e.text() == QObject::tr( "hh:mm ap" ) )
551 timeformat = DisplaySettings::TwelveHoursTimeFormat;
553 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
555 timeformat = DisplaySettings::TwentyFourHoursTimeFormat;
556 } else if (tagName == QString("screensaver")) {
557 bool success = false;
558 unsigned int screensaverTMP = e.text().toUInt(&success);
560 screensaver = screensaverTMP;
565 return new DisplaySettings(dateformat, timeformat, daysInSchedule,
566 dayStartsAt, dayEndsAt, screensaver);
569 DateTimeSettings * Configuration::readDateTimeSettings(const QDomNode &aXML) {
571 QDateTime standardTimeChangeMoment = QDateTime::fromString(
572 "05.10.2009 04:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
573 QDateTime daylightSaveTimeChangeMoment = QDateTime::fromString(
574 "01.04.2010 03:00:00", "dd'.'MM'.'yyyy' 'hh:mm:ss");
575 DateTimeSettings::weekDay dayOfWeek = DateTimeSettings::Sunday;
577 for (QDomNode node = aXML.firstChild(); !node.isNull(); node
578 = node.nextSibling()) {
579 QDomElement e = node.toElement();
580 QString tagName = e.tagName().toLower();
582 if (tagName == QString("dayofweek")) {
583 qDebug() << "Configuration::readDateTimeSettings: " + e.text();
585 bool success = false;
586 unsigned int weekDayTmp = e.text().toUInt(&success);
587 if (success && weekDayTmp < 7) {
588 dayOfWeek = (DateTimeSettings::weekDay) weekDayTmp;
590 } else if (tagName == QString("standardtimechangemoment")) {
591 standardTimeChangeMoment = QDateTime::fromString(e.text(),
592 "dd'.'MM'.'yyyy' 'hh:mm:ss");
593 qDebug() << "Configuration::readDateTimeSettings: "
594 + standardTimeChangeMoment.toString("dd.MM.yyyy hh:mm:ss");
595 } else if (tagName == QString("daylightsavetimechangemoment")) {
596 daylightSaveTimeChangeMoment = QDateTime::fromString(e.text(),
597 "dd'.'MM'.'yyyy' 'hh:mm:ss");
598 qDebug() << "Configuration::readDateTimeSettings: "
599 + daylightSaveTimeChangeMoment.toString(
600 "dd.MM.yyyy hh:mm:ss");
604 return new DateTimeSettings(standardTimeChangeMoment,
605 daylightSaveTimeChangeMoment, dayOfWeek);
608 QByteArray Configuration::readAdminPassword(const QDomNode &aXML) {
609 QDomElement e = aXML.toElement();
610 QString tagName = e.tagName().toLower();
611 if (e.hasAttribute("password")) {
612 QString pw = e.attribute("password");
613 // Check if the password is default uncrypted "admin"
615 int x = QString::compare(pw, "admin", Qt::CaseInsensitive); // x == 0
618 // uncrypted password needs to be encoded
619 QCryptographicHash *hash = new QCryptographicHash(
620 QCryptographicHash::Md5);
621 hash->addData(pw.toUtf8());
622 pw = QString(hash->result());
624 return (pw.toAscii()).toHex();
627 return (pw.toAscii());
634 void Configuration::setRooms(const QList<Room*> aRooms) {
638 void Configuration::readPrivacySettings(const QDomNode &aXML) {
639 QString s = QString("show_confidential_meeting_details");
641 QDomElement e = aXML.firstChildElement(s);
643 if (e.hasAttribute("enabled") &&
644 e.attribute("enabled") == QString("true")) {
645 iShowConfidentialMeetingDetails = true;
649 iShowConfidentialMeetingDetails = false;
653 void Configuration::savePrivacySettings(QDomNode &aXML) {
654 QString s = QString("show_confidential_meeting_details");
656 QDomElement e = aXML.firstChildElement(s);
659 e = aXML.ownerDocument().createElement(s);
663 if( showConfidentialMeetingDetails() )
664 e.setAttribute("enabled", "true");
666 e.setAttribute("enabled", "false");
669 bool Configuration::setShowConfidentialMeetingDetails(
670 bool showconfidentialmeetingdetails) {
671 iShowConfidentialMeetingDetails = showconfidentialmeetingdetails;
674 bool Configuration::showConfidentialMeetingDetails() {
675 return iShowConfidentialMeetingDetails;
678 QString Configuration::hashPassword(const QString aPassword) {
679 QCryptographicHash *hash = new QCryptographicHash(QCryptographicHash::Md5);
680 hash->addData(aPassword.toUtf8());
681 QByteArray password = hash->result();
684 return QString(password);