source: psi/trunk/src/psi_profiles.cpp@ 14

Last change on this file since 14 was 2, checked in by dmik, 19 years ago

Imported original Psi 0.10 sources from Affinix

File size: 59.3 KB
Line 
1/*
2 * profiles.cpp - deal with profiles
3 * Copyright (C) 2001-2003 Justin Karneges
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21#include"profiles.h"
22#include"common.h"
23#include<qdir.h>
24#include<qfileinfo.h>
25#include<qdom.h>
26
27#include<qapplication.h>
28#include"eventdlg.h"
29#include"chatdlg.h"
30#include"contactview.h"
31#include"xmpp_xmlcommon.h"
32#include"fancylabel.h"
33#include"advwidget.h"
34
35using namespace XMPP;
36using namespace XMLHelper;
37
38UserAccount::UserAccount()
39{
40 reset();
41}
42
43void UserAccount::reset()
44{
45 name = "Default";
46 opt_enabled = TRUE;
47 opt_auto = FALSE;
48 opt_ssl = FALSE;
49 tog_offline = TRUE;
50 tog_away = TRUE;
51 tog_hidden = TRUE;
52 tog_agents = TRUE;
53 tog_self = FALSE;
54 jid = "";
55 pass = "";
56 opt_pass = FALSE;
57 port = 5222;
58 opt_host = FALSE;
59 host = "";
60 resource = "Psi";
61 priority = 5;
62 olr_string = "";
63 opt_keepAlive = TRUE;
64 opt_plain = FALSE;
65 opt_log = TRUE;
66 opt_reconn = FALSE;
67 opt_ignoreSSLWarnings = false;
68 pgpSecretKeyID = "";
69
70 proxy_index = 0;
71 proxy_type = PROXY_NONE;
72 proxy_host = "";
73 proxy_port = 8080;
74 proxy_user = "";
75 proxy_pass = "";
76
77 keybind.clear();
78
79 roster.clear();
80}
81
82UserAccount::~UserAccount()
83{
84}
85
86// FIXME: this should be a const function (as should other ::toXml functions)
87QDomElement UserAccount::toXml(QDomDocument &doc, const QString &tagName)
88{
89 QDomElement a = doc.createElement(tagName);
90
91 setBoolAttribute(a, "enabled", opt_enabled);
92 setBoolAttribute(a, "auto", opt_auto);
93 setBoolAttribute(a, "ssl", opt_ssl);
94 setBoolAttribute(a, "showOffline", tog_offline);
95 setBoolAttribute(a, "showAway", tog_away);
96 setBoolAttribute(a, "showHidden", tog_hidden);
97 setBoolAttribute(a, "showAgents", tog_agents);
98 setBoolAttribute(a, "showSelf", tog_self);
99 setBoolAttribute(a, "keepAlive", opt_keepAlive);
100 setBoolAttribute(a, "plain", opt_plain);
101 setBoolAttribute(a, "log", opt_log);
102 setBoolAttribute(a, "reconn", opt_reconn);
103 setBoolAttribute(a, "ignoreSSLWarnings", opt_ignoreSSLWarnings);
104 //setBoolAttribute(a, "gpg", opt_gpg);
105
106 //QString jid = user + '@' + vhost;
107 a.appendChild(textTag(doc, "name", name));
108 a.appendChild(textTag(doc, "jid", jid));
109 if(opt_pass)
110 a.appendChild(textTag(doc, "password", encodePassword(pass, jid) ));
111 a.appendChild(textTag(doc, "useHost", opt_host));
112 a.appendChild(textTag(doc, "host", host));
113 a.appendChild(textTag(doc, "port", QString::number(port)));
114 a.appendChild(textTag(doc, "resource", resource));
115 a.appendChild(textTag(doc, "priority", QString::number(priority)));
116 a.appendChild(textTag(doc, "OLR", olr_string));
117 a.appendChild(textTag(doc, "pgpSecretKeyID", pgpSecretKeyID));
118
119 QDomElement r = doc.createElement("roster");
120 a.appendChild(r);
121 Roster::ConstIterator rit = roster.begin();
122 for ( ; rit != roster.end(); ++rit) {
123 const RosterItem &i = *rit;
124 QDomElement tag = i.toXml(&doc);
125 r.appendChild(tag);
126 }
127
128 // now we check for redundant entries
129 QStringList groupList, removeList;
130 groupList << "/\\/" + name + "\\/\\"; // account name is a very 'special' group
131
132 // special groups that should also have their state remembered
133 groupList << ContactProfile::tr("General");
134 groupList << ContactProfile::tr("Agents/Transports");
135
136 // first, add all groups' names to groupList
137 rit = roster.begin();
138 for ( ; rit != roster.end(); ++rit) {
139 const RosterItem &i = *rit;
140 groupList += i.groups();
141 }
142
143 // now, check if there's groupState name entry in groupList
144 QMap<QString, GroupData>::Iterator git = groupState.begin();
145 for ( ; git != groupState.end(); ++git) {
146 bool found = false;
147
148 QStringList::Iterator it = groupList.begin();
149 for ( ; it != groupList.end(); ++it)
150 if ( git.key() == *it ) {
151 found = true;
152 break;
153 }
154
155 if ( !found )
156 removeList << git.key();
157 }
158
159 // remove redundant groups
160 QStringList::Iterator it = removeList.begin();
161 for ( ; it != removeList.end(); ++it)
162 groupState.remove( *it );
163
164 // and finally, save the data
165 QDomElement gs = doc.createElement("groupState");
166 a.appendChild(gs);
167 git = groupState.begin();
168 for ( ; git != groupState.end(); ++git) {
169 //if ( !git.data().open || git.data().rank ) { // don't save unnecessary entries (the default is 'true' to open, and '0' to rank)
170 QDomElement group = doc.createElement("group");
171 group.setAttribute("name", git.key());
172 group.setAttribute("open", git.data().open ? "true" : "false");
173 group.setAttribute("rank", QString::number(git.data().rank));
174 gs.appendChild(group);
175 //}
176 }
177
178 a.appendChild(textTag(doc, "proxyindex", QString::number(proxy_index)));
179 //a.appendChild(textTag(doc, "proxytype", QString::number(proxy_type)));
180 //a.appendChild(textTag(doc, "proxyhost", proxy_host));
181 //a.appendChild(textTag(doc, "proxyport", QString::number(proxy_port)));
182 //a.appendChild(textTag(doc, "proxyuser", proxy_user));
183 //a.appendChild(textTag(doc, "proxypass", encodePassword(proxy_pass, jid)));
184
185 a.appendChild(keybind.toXml(doc, "pgpkeybindings"));
186 a.appendChild(textTag(doc, "dtProxy", dtProxy.full()));
187
188 return a;
189}
190
191void UserAccount::fromXml(const QDomElement &a)
192{
193 reset();
194
195 bool found;
196
197 readEntry(a, "name", &name);
198 readBoolAttribute(a, "enabled", &opt_enabled);
199 readBoolAttribute(a, "auto", &opt_auto);
200 readBoolAttribute(a, "ssl", &opt_ssl);
201 readBoolAttribute(a, "showOffline", &tog_offline);
202 readBoolAttribute(a, "showAway", &tog_away);
203 readBoolAttribute(a, "showHidden", &tog_hidden);
204 readBoolAttribute(a, "showAgents", &tog_agents);
205 readBoolAttribute(a, "showSelf", &tog_self);
206 readBoolAttribute(a, "keepAlive", &opt_keepAlive);
207 readBoolAttribute(a, "plain", &opt_plain);
208 readBoolAttribute(a, "log", &opt_log);
209 readBoolAttribute(a, "reconn", &opt_reconn);
210 readBoolAttribute(a, "ignoreSSLWarnings", &opt_ignoreSSLWarnings);
211 //readBoolAttribute(a, "gpg", &opt_gpg);
212
213 readEntry(a, "host", &host);
214 readNumEntry(a, "port", &port);
215
216 // 0.8.6 and >= 0.9
217 QDomElement j = findSubTag(a, "jid", &found);
218 if(found) {
219 readBoolAttribute(j, "manual", &opt_host);
220 jid = tagContent(j);
221 }
222 // 0.8.7
223 else {
224 QString user, vhost;
225 readEntry(a, "username", &user);
226 QDomElement j = findSubTag(a, "vhost", &found);
227 if(found) {
228 readBoolAttribute(j, "manual", &opt_host);
229 vhost = tagContent(j);
230 }
231 else {
232 opt_host = false;
233 vhost = host;
234 host = "";
235 port = 0;
236 }
237 jid = user + '@' + vhost;
238 }
239
240 readBoolEntry(a, "useHost", &opt_host);
241
242 // read password (we must do this after reading the jid, to decode properly)
243 readEntry(a, "password", &pass);
244 if(!pass.isEmpty()) {
245 opt_pass = TRUE;
246 pass = decodePassword(pass, jid);
247 }
248
249 readEntry(a, "resource", &resource);
250 readNumEntry(a, "priority", &priority);
251 readEntry(a, "OLR", &olr_string);
252 readEntry(a, "pgpSecretKeyID", &pgpSecretKeyID);
253
254 QDomElement r = findSubTag(a, "roster", &found);
255 if(found) {
256 for(QDomNode n = r.firstChild(); !n.isNull(); n = n.nextSibling()) {
257 QDomElement i = n.toElement();
258 if(i.isNull())
259 continue;
260
261 if(i.tagName() == "item") {
262 RosterItem ri;
263 if(!ri.fromXml(i))
264 continue;
265 roster += ri;
266 }
267 }
268 }
269
270 groupState.clear();
271 QDomElement gs = findSubTag(a, "groupState", &found);
272 if (found) {
273 for (QDomNode n = gs.firstChild(); !n.isNull(); n = n.nextSibling()) {
274 QDomElement i = n.toElement();
275 if (i.isNull())
276 continue;
277
278 if (i.tagName() == "group") {
279 GroupData gd;
280 gd.open = i.attribute("open") == "true";
281 gd.rank = i.attribute("rank").toInt();
282 groupState.insert(i.attribute("name"), gd);
283 }
284 }
285 }
286
287 readNumEntry(a, "proxyindex", &proxy_index);
288 readNumEntry(a, "proxytype", &proxy_type);
289 readEntry(a, "proxyhost", &proxy_host);
290 readNumEntry(a, "proxyport", &proxy_port);
291 readEntry(a, "proxyuser", &proxy_user);
292 readEntry(a, "proxypass", &proxy_pass);
293 if(!proxy_pass.isEmpty())
294 proxy_pass = decodePassword(proxy_pass, jid);
295
296 r = findSubTag(a, "pgpkeybindings", &found);
297 if(found)
298 keybind.fromXml(r);
299
300 QString str;
301 readEntry(a, "dtProxy", &str);
302 dtProxy = str;
303}
304
305UserProfile::UserProfile()
306{
307 reset();
308}
309
310void UserProfile::reset()
311{
312 bool nix, win, mac;
313 nix = win = mac = FALSE;
314
315#ifdef Q_WS_X11
316 nix = TRUE;
317#endif
318#ifdef Q_WS_WIN
319 win = TRUE;
320#endif
321#ifdef Q_WS_MAC
322 mac = TRUE;
323#endif
324
325 progver = PROG_VERSION;
326
327 // global
328 mwgeom.setRect(64, 64, 150, 360);
329 lastStatusString = "";
330 useSound = TRUE;
331 proxyList.clear();
332 acc.clear();
333
334 // prefs
335 prefs.useleft = FALSE;
336 prefs.singleclick = FALSE;
337 prefs.hideMenubar = TRUE;
338 prefs.defaultAction = 1;
339 prefs.delChats = dcHour;
340 prefs.showJoins = TRUE;
341 prefs.browser = 0;
342 prefs.customBrowser = "";
343 prefs.customMailer = "";
344 prefs.alwaysOnTop = FALSE;
345 prefs.keepSizes = TRUE;
346 prefs.ignoreHeadline = FALSE;
347 prefs.ignoreNonRoster = FALSE;
348 prefs.excludeGroupChatsFromIgnore = TRUE;
349 prefs.useDock = win ? TRUE: FALSE;
350 prefs.dockDCstyle = win ? TRUE: FALSE;
351 prefs.dockHideMW = FALSE;
352 prefs.dockToolMW = FALSE;
353 prefs.isWMDock = false;
354 prefs.alertStyle = 2;
355 prefs.popupMsgs = FALSE;
356 prefs.popupChats = FALSE;
357 prefs.popupHeadlines = FALSE;
358 prefs.popupFiles = FALSE;
359 prefs.noAwayPopup = FALSE;
360 prefs.noUnlistedPopup = false;
361 prefs.raise = FALSE;
362 prefs.incomingAs = 0;
363 prefs.askOnline = FALSE;
364 prefs.askOffline = FALSE;
365 prefs.rosterAnim = TRUE;
366 prefs.autoVersion = false;
367 prefs.autoVCardOnLogin = true;
368 prefs.xmlConsoleOnLogin = false;
369 prefs.asAway = 10;
370 prefs.asXa = 30;
371 prefs.asOffline = 0;
372 prefs.use_asAway = TRUE;
373 prefs.use_asXa = TRUE;
374 prefs.use_asOffline = FALSE;
375 prefs.asMessage = QObject::tr("Auto Status (idle)");
376 prefs.scrollTo = TRUE;
377 prefs.useEmoticons = false;
378 prefs.alertOpenChats = false;
379 prefs.raiseChatWindow = false;
380 prefs.showSubjects = true;
381 prefs.showCounter = false;
382 prefs.chatSays = false;
383 prefs.chatSoftReturn = true;
384 prefs.showGroupCounts = true;
385 prefs.smallChats = false;
386 prefs.chatLineEdit = true;
387 prefs.useTabs = false;
388 prefs.usePerTabCloseButton = true;
389 prefs.putTabsAtBottom = false;
390 prefs.autoRosterSize = false;
391 prefs.autoRosterSizeGrowTop = false;
392 prefs.autoResolveNicksOnAdd = false;
393 prefs.chatBgImage = "";
394 prefs.rosterBgImage = "";
395 prefs.autoCopy = false;
396
397 prefs.sp.clear();
398 prefs.sp.set(QObject::tr("Away from desk"), QObject::tr("I am away from my desk. Leave a message."));
399 prefs.sp.set(QObject::tr("Showering"), QObject::tr("I'm in the shower. You'll have to wait for me to get out."));
400 prefs.sp.set(QObject::tr("Eating"), QObject::tr("Out eating. Mmmm.. food."));
401 prefs.sp.set(QObject::tr("Sleep"), QObject::tr("Sleep is good. Zzzzz"));
402 prefs.sp.set(QObject::tr("Work"), QObject::tr("Can't chat. Gotta work."));
403 prefs.sp.set(QObject::tr("Air"), QObject::tr("Stepping out to get some fresh air."));
404 prefs.sp.set(QObject::tr("Movie"), QObject::tr("Out to a movie. Is that OK with you?"));
405 prefs.sp.set(QObject::tr("Secret"), QObject::tr("I'm not available right now and that's all you need to know."));
406 prefs.sp.set(QObject::tr("Out for the night"), QObject::tr("Out for the night."));
407 prefs.sp.set(QObject::tr("Greece"), QObject::tr("I have gone to a far away place. I will be back someday!"));
408 prefs.recentStatus.clear();
409
410 prefs.color[cOnline] = QColor("#000000");
411 prefs.color[cListBack] = QColor("#FFFFFF");
412 prefs.color[cAway] = QColor("#004BB4");
413 prefs.color[cDND] = QColor("#7E0000");
414 prefs.color[cOffline] = QColor("#646464");
415 prefs.color[cProfileFore] = QColor("#FFFFFF");
416 prefs.color[cProfileBack] = QColor("#969696");
417 prefs.color[cGroupFore] = QColor("#5A5A5A");
418 prefs.color[cGroupBack] = QColor("#F0F0F0");
419 prefs.color[cAnimFront] = QColor("#000000");
420 prefs.color[cAnimBack] = QColor("#969696");
421
422 prefs.font[fRoster] = QApplication::font().toString();
423 prefs.font[fMessage] = QApplication::font().toString();
424 prefs.font[fChat] = QApplication::font().toString();
425 {
426 QFont font = QApplication::font();
427 font.setPointSize( font.pointSize() - 2 );
428 prefs.font[fPopup] = font.toString();
429 }
430
431 // calculate the small font size
432 const int minimumFontSize = 7;
433 prefs.smallFontSize = qApp->font().pointSize();
434 prefs.smallFontSize -= 2;
435 if ( prefs.smallFontSize < minimumFontSize )
436 prefs.smallFontSize = minimumFontSize;
437 FancyLabel::setSmallFontSize( prefs.smallFontSize );
438
439 prefs.clNewHeadings = false;
440 prefs.chatOpacity = 100;
441 prefs.rosterOpacity = 95;
442 prefs.outlineHeadings = false;
443
444 prefs.player = "play";
445 prefs.noAwaySound = FALSE;
446
447 prefs.onevent[eMessage] = g.pathBase + "/sound/chat2.wav";
448 prefs.onevent[eChat1] = g.pathBase + "/sound/chat1.wav";
449 prefs.onevent[eChat2] = g.pathBase + "/sound/chat2.wav";
450 prefs.onevent[eSystem] = g.pathBase + "/sound/chat2.wav";
451 prefs.onevent[eHeadline] = g.pathBase + "/sound/chat2.wav";
452 prefs.onevent[eOnline] = g.pathBase + "/sound/online.wav";
453 prefs.onevent[eOffline] = g.pathBase + "/sound/offline.wav";
454 prefs.onevent[eSend] = g.pathBase + "/sound/send.wav";
455 prefs.onevent[eIncomingFT] = g.pathBase + "/sound/ft_incoming.wav";
456 prefs.onevent[eFTComplete] = g.pathBase + "/sound/ft_complete.wav";
457
458 // Added by Kiko 020621: sets up the default certificate store
459 prefs.trustCertStoreDir = g.pathBase + "/certs";
460
461 prefs.sizeEventDlg = EventDlg::defaultSize();
462 prefs.sizeChatDlg = ChatDlg::defaultSize();
463 prefs.sizeTabDlg = ChatDlg::defaultSize(); //TODO: no!
464
465 prefs.jidComplete = true;
466 prefs.grabUrls = false;
467 prefs.noGCSound = true;
468
469 prefs.pgp = "";
470
471 // toolbars
472 prefs.toolbars.clear();
473
474 Options::ToolbarPrefs tbDef;
475 tbDef.name = QString::null;
476 tbDef.on = false;
477 tbDef.locked = false;
478 tbDef.stretchable = false;
479 tbDef.keys.clear();
480
481 tbDef.dock = Qt::DockTop;
482 tbDef.nl = true;
483 tbDef.extraOffset = 0;
484
485 tbDef.dirty = true;
486
487 {
488 Options::ToolbarPrefs tb[3];
489 uint i;
490 for (i = 0; i < sizeof(tb)/sizeof(Options::ToolbarPrefs); i++) {
491 tb[i] = tbDef;
492 tb[i].index = i + 1;
493 }
494
495 bool defaultEnableToolbars;
496#ifdef Q_WS_MAC
497 defaultEnableToolbars = false;
498#else
499 defaultEnableToolbars = true;
500#endif
501
502 // Imitate old Psi button layout by default
503 tb[0].name = QObject::tr("Buttons");
504 tb[0].on = defaultEnableToolbars;
505 tb[0].locked = true;
506 tb[0].stretchable = true;
507 tb[0].keys << "button_options" << "button_status";
508 tb[0].dock = Qt::DockBottom;
509
510 tb[1].name = QObject::tr("Show contacts");
511 tb[1].on = defaultEnableToolbars;
512 tb[1].locked = true;
513 tb[1].keys << "show_offline" << "show_away" << "show_agents" << "show_self";
514
515 tb[2].name = QObject::tr("Event notifier");
516 tb[2].on = false;
517 tb[2].locked = true;
518 tb[2].stretchable = true;
519 tb[2].keys << "event_notifier";
520 tb[2].dock = Qt::DockBottom;
521 tb[2].index = 0;
522
523 for ( i = 0; i < sizeof(tb)/sizeof(Options::ToolbarPrefs); i++ )
524 prefs.toolbars["mainWin"].append( tb[i] );
525 }
526
527 // groupchat
528 prefs.gcHighlighting = true;
529 prefs.gcHighlights.clear();
530
531 prefs.gcNickColoring = true;
532 prefs.gcNickColors.clear();
533
534 prefs.gcNickColors << "Blue";
535 prefs.gcNickColors << "Green";
536 prefs.gcNickColors << "Orange";
537 prefs.gcNickColors << "Purple";
538 prefs.gcNickColors << "Red";
539
540 // popups
541 prefs.ppIsOn = false;
542 prefs.ppOnline = true;
543 prefs.ppOffline = true;
544 prefs.ppStatus = false;
545 prefs.ppMessage = true;
546 prefs.ppChat = true;
547 prefs.ppHeadline = true;
548 prefs.ppFile = true;
549 prefs.ppJidClip = 25;
550 prefs.ppStatusClip = -1;
551 prefs.ppTextClip = 300;
552 prefs.ppHideTime = 10000; // 10 sec
553 prefs.ppBorderColor = QColor (0x52, 0x97, 0xF9);
554
555 // Bouncing of the dock (Mac OS X)
556 prefs.bounceDock = Options::BounceForever;
557
558 // lockdown
559 prefs.lockdown.roster = false;
560 prefs.lockdown.options = false;
561 prefs.lockdown.profiles = false;
562 prefs.lockdown.services = false;
563 prefs.lockdown.accounts = false;
564
565 prefs.useTransportIconsForContacts = false;
566
567 // iconsets
568 prefs.systemIconset = "default";
569 prefs.emoticons = "default";
570 prefs.defaultRosterIconset = "default";
571
572 prefs.serviceRosterIconset.clear();
573 prefs.serviceRosterIconset["transport"] = "crystal-service.jisp";
574 prefs.serviceRosterIconset["aim"] = "crystal-aim.jisp";
575 prefs.serviceRosterIconset["gadugadu"] = "crystal-gadugadu.jisp";
576 prefs.serviceRosterIconset["icq"] = "crystal-icq.jisp";
577 prefs.serviceRosterIconset["msn"] = "crystal-msn.jisp";
578 prefs.serviceRosterIconset["yahoo"] = "crystal-yahoo.jisp";
579 prefs.serviceRosterIconset["sms"] = "crystal-sms.jisp";
580
581 prefs.customRosterIconset.clear();
582
583 // roster sorting
584 prefs.rosterContactSortStyle = Options::ContactSortStyle_Status;
585 prefs.rosterGroupSortStyle = Options::GroupSortStyle_Alpha;
586 prefs.rosterAccountSortStyle = Options::AccountSortStyle_Alpha;
587
588 // tip of the day
589 prefs.showTips = true;
590 prefs.tipNum = 0;
591
592 // disco dialog
593 prefs.discoItems = true;
594 prefs.discoInfo = true;
595
596 // auto-auth
597 prefs.autoAuth = false;
598
599 // Notify authorization
600 prefs.notifyAuth = true;
601
602 // message events
603 prefs.messageEvents = true;
604
605 // event priority
606 prefs.eventPriorityHeadline = 0;
607 prefs.eventPriorityChat = 1;
608 prefs.eventPriorityMessage = 1;
609 prefs.eventPriorityAuth = 2;
610 prefs.eventPriorityFile = 3;
611
612 // Last used path remembering
613 prefs.lastPath = QDir::homeDirPath();
614 prefs.lastSavePath = QDir::homeDirPath();
615
616 // data transfer
617 prefs.dtPort = 8010;
618 prefs.dtExternal = "";
619
620 // Avatars
621 prefs.avatarsEnabled = true;
622 prefs.avatarsChatdlgEnabled = true;
623 prefs.avatarsSize = 48;
624
625 // global accelerators
626 prefs.globalAccels.clear();
627 prefs.globalAccels.append(QKeySequence()); // process next event
628 prefs.globalAccels.append(QKeySequence()); // show/hide roster
629
630 // advanced widget
631 GAdvancedWidget::setStickEnabled( false ); //until this is bugless
632 GAdvancedWidget::setStickToWindows( false ); //again
633 GAdvancedWidget::setStickAt( 5 );
634}
635
636static Options::ToolbarPrefs loadToolbarData( const QDomElement &e )
637{
638 QDomElement tb_prefs = e;
639 Options::ToolbarPrefs tb;
640
641 readEntry(tb_prefs, "name", &tb.name);
642 readBoolEntry(tb_prefs, "on", &tb.on);
643 readBoolEntry(tb_prefs, "locked", &tb.locked);
644 readBoolEntry(tb_prefs, "stretchable", &tb.stretchable);
645 xmlToStringList(tb_prefs, "keys", &tb.keys);
646
647 bool found3 = false;
648 QDomElement tb_position = findSubTag(tb_prefs, "position", &found3);
649 if (found3)
650 {
651 QString dockStr;
652 Qt::Dock dock = Qt::DockTop;
653 readEntry(tb_position, "dock", &dockStr);
654 if (dockStr == "DockTop")
655 dock = Qt::DockTop;
656 else if (dockStr == "DockBottom")
657 dock = Qt::DockBottom;
658 else if (dockStr == "DockLeft")
659 dock = Qt::DockLeft;
660 else if (dockStr == "DockRight")
661 dock = Qt::DockRight;
662 else if (dockStr == "DockMinimized")
663 dock = Qt::DockMinimized;
664 else if (dockStr == "DockTornOff")
665 dock = Qt::DockTornOff;
666 else if (dockStr == "DockUnmanaged")
667 dock = Qt::DockUnmanaged;
668
669 tb.dock = dock;
670
671 readNumEntry(tb_position, "index", &tb.index);
672 readBoolEntry(tb_position, "nl", &tb.nl);
673 readNumEntry(tb_position, "extraOffset", &tb.extraOffset);
674 }
675
676 return tb;
677}
678
679bool UserProfile::toFile(const QString &fname)
680{
681 QDomDocument doc;
682
683 QDomElement base = doc.createElement("psiconf");
684 base.setAttribute("version", "1.0");
685 doc.appendChild(base);
686
687 base.appendChild(textTag(doc, "progver", PROG_VERSION));
688 base.appendChild(textTag(doc, "geom", mwgeom));
689 base.appendChild(stringListToXml(doc, "recentGCList", recentGCList));
690 base.appendChild(stringListToXml(doc, "recentBrowseList", recentBrowseList));
691 base.appendChild(textTag(doc, "lastStatusString", lastStatusString));
692 base.appendChild(textTag(doc, "useSound", useSound));
693
694 QDomElement accs = doc.createElement("accounts");
695 base.appendChild(accs);
696 for(UserAccountList::Iterator ai = acc.begin(); ai != acc.end(); ++ai)
697 accs.appendChild((*ai).toXml(doc, "account"));
698
699 QDomElement prox = doc.createElement("proxies");
700 base.appendChild(prox);
701 for(ProxyItemList::Iterator pi = proxyList.begin(); pi != proxyList.end(); ++pi) {
702 const ProxyItem &p = *pi;
703 QDomElement i = doc.createElement("proxy");
704 i.appendChild(textTag(doc, "name", p.name));
705 i.appendChild(textTag(doc, "type", p.type));
706 i.appendChild(p.settings.toXml(&doc));
707 prox.appendChild(i);
708 }
709
710 QDomElement p = doc.createElement("preferences");
711 base.appendChild(p);
712
713 {
714 QDomElement p_general = doc.createElement("general");
715 p.appendChild(p_general);
716
717 {
718 QDomElement p_roster = doc.createElement("roster");
719 p_general.appendChild(p_roster);
720
721 p_roster.appendChild(textTag(doc, "useleft", prefs.useleft));
722 p_roster.appendChild(textTag(doc, "rosterBgImage", prefs.rosterBgImage));
723 p_roster.appendChild(textTag(doc, "singleclick", prefs.singleclick));
724 p_roster.appendChild(textTag(doc, "hideMenubar", prefs.hideMenubar));
725 p_roster.appendChild(textTag(doc, "defaultAction", prefs.defaultAction));
726 p_roster.appendChild(textTag(doc, "useTransportIconsForContacts", prefs.useTransportIconsForContacts));
727
728 {
729 QDomElement sorting = doc.createElement("sortStyle");
730 p_roster.appendChild(sorting);
731
732 QString name = "status";
733 if ( prefs.rosterContactSortStyle == Options::ContactSortStyle_Alpha )
734 name = "alpha";
735 sorting.appendChild(textTag(doc, "contact", name));
736
737 name = "alpha";
738 if ( prefs.rosterGroupSortStyle == Options::GroupSortStyle_Rank )
739 name = "rank";
740 sorting.appendChild(textTag(doc, "group", name));
741
742 name = "alpha";
743 if ( prefs.rosterAccountSortStyle == Options::AccountSortStyle_Rank )
744 name = "rank";
745 sorting.appendChild(textTag(doc, "account", name));
746 }
747 }
748
749 // Avatars
750 {
751 QDomElement p_avatars = doc.createElement("avatars");
752 p_general.appendChild(p_avatars);
753 p_avatars.appendChild(textTag(doc, "use", prefs.avatarsEnabled));
754 p_avatars.appendChild(textTag(doc, "use_chatdlg", prefs.avatarsChatdlgEnabled));
755 p_avatars.appendChild(textTag(doc, "size", prefs.avatarsSize));
756 }
757 {
758 QDomElement p_misc = doc.createElement("misc");
759 p_general.appendChild(p_misc);
760
761 p_misc.appendChild(textTag(doc, "chatBgImage", prefs.chatBgImage));
762 p_misc.appendChild(textTag(doc, "smallChats", prefs.smallChats));
763 p_misc.appendChild(textTag(doc, "chatLineEdit", prefs.chatLineEdit));
764 p_misc.appendChild(textTag(doc, "useTabs", prefs.useTabs));
765 p_misc.appendChild(textTag(doc, "usePerTabCloseButton", prefs.usePerTabCloseButton));
766 p_misc.appendChild(textTag(doc, "putTabsAtBottom", prefs.putTabsAtBottom));
767 p_misc.appendChild(textTag(doc, "autoRosterSize", prefs.autoRosterSize));
768 p_misc.appendChild(textTag(doc, "autoRosterSizeGrowTop", prefs.autoRosterSizeGrowTop));
769 p_misc.appendChild(textTag(doc, "autoResolveNicksOnAdd", prefs.autoResolveNicksOnAdd));
770 p_misc.appendChild(textTag(doc, "delChats", prefs.delChats));
771 p_misc.appendChild(textTag(doc, "showJoins", prefs.showJoins));
772 p_misc.appendChild(textTag(doc, "browser", prefs.browser));
773 p_misc.appendChild(textTag(doc, "customBrowser", prefs.customBrowser));
774 p_misc.appendChild(textTag(doc, "customMailer", prefs.customMailer));
775 p_misc.appendChild(textTag(doc, "alwaysOnTop", prefs.alwaysOnTop));
776 p_misc.appendChild(textTag(doc, "keepSizes", prefs.keepSizes));
777 p_misc.appendChild(textTag(doc, "ignoreHeadline", prefs.ignoreHeadline));
778 p_misc.appendChild(textTag(doc, "ignoreNonRoster", prefs.ignoreNonRoster));
779 p_misc.appendChild(textTag(doc, "excludeGroupChatIgnore", prefs.excludeGroupChatsFromIgnore));
780 p_misc.appendChild(textTag(doc, "scrollTo", prefs.scrollTo));
781 p_misc.appendChild(textTag(doc, "useEmoticons", prefs.useEmoticons));
782 p_misc.appendChild(textTag(doc, "alertOpenChats", prefs.alertOpenChats));
783 p_misc.appendChild(textTag(doc, "raiseChatWindow", prefs.raiseChatWindow));
784 p_misc.appendChild(textTag(doc, "showSubjects", prefs.showSubjects));
785 p_misc.appendChild(textTag(doc, "showCounter", prefs.showCounter));
786 p_misc.appendChild(textTag(doc, "chatSays", prefs.chatSays));
787 p_misc.appendChild(textTag(doc, "chatSoftReturn", prefs.chatSoftReturn));
788 p_misc.appendChild(textTag(doc, "showGroupCounts", prefs.showGroupCounts));
789 p_misc.appendChild(textTag(doc, "jidComplete", prefs.jidComplete));
790 p_misc.appendChild(textTag(doc, "grabUrls", prefs.grabUrls));
791 p_misc.appendChild(textTag(doc, "messageEvents", prefs.messageEvents));
792 p_misc.appendChild(textTag(doc, "lastPath", prefs.lastPath));
793 p_misc.appendChild(textTag(doc, "lastSavePath", prefs.lastSavePath));
794 p_misc.appendChild(textTag(doc, "autoCopy", prefs.autoCopy));
795 }
796 {
797 QDomElement p_dock = doc.createElement("dock");
798 p_general.appendChild(p_dock);
799
800 p_dock.appendChild(textTag(doc, "useDock", prefs.useDock));
801 p_dock.appendChild(textTag(doc, "dockDCstyle", prefs.dockDCstyle));
802 p_dock.appendChild(textTag(doc, "dockHideMW", prefs.dockHideMW));
803 p_dock.appendChild(textTag(doc, "dockToolMW", prefs.dockToolMW));
804 p_dock.appendChild(textTag(doc, "isWMDock", prefs.isWMDock));
805 }
806 /*{
807 QDomElement p_sec = doc.createElement("security");
808 p_general.appendChild(p_sec);
809
810 p_sec.appendChild(textTag(doc, "pgp", prefs.pgp));
811 }*/
812 }
813
814 // Added by Kiko 020621: stores SSL cert chain validation configuration
815 {
816 QDomElement p_ssl = doc.createElement("ssl");
817 p.appendChild(p_ssl);
818
819 p_ssl.appendChild(textTag(doc, "trustedcertstoredir", prefs.trustCertStoreDir));
820 }
821
822 {
823 QDomElement p_events = doc.createElement("events");
824 p.appendChild(p_events);
825
826 p_events.appendChild(textTag(doc, "alertstyle", prefs.alertStyle));
827 p_events.appendChild(textTag(doc, "autoAuth", prefs.autoAuth));
828 p_events.appendChild(textTag(doc, "notifyAuth", prefs.notifyAuth));
829
830
831 {
832 QDomElement p_receive = doc.createElement("receive");
833 p_events.appendChild(p_receive);
834
835 p_receive.appendChild(textTag(doc, "popupMsgs", prefs.popupMsgs));
836 p_receive.appendChild(textTag(doc, "popupChats", prefs.popupChats));
837 p_receive.appendChild(textTag(doc, "popupHeadlines", prefs.popupHeadlines));
838 p_receive.appendChild(textTag(doc, "popupFiles", prefs.popupFiles));
839 p_receive.appendChild(textTag(doc, "noAwayPopup", prefs.noAwayPopup));
840 p_receive.appendChild(textTag(doc, "noUnlistedPopup", prefs.noUnlistedPopup));
841 p_receive.appendChild(textTag(doc, "raise", prefs.raise));
842 p_receive.appendChild(textTag(doc, "incomingAs", prefs.incomingAs));
843 }
844
845 {
846 QDomElement p_priority = doc.createElement("priority");
847 p_events.appendChild(p_priority);
848
849 p_priority.appendChild(textTag(doc, "message", prefs.eventPriorityMessage));
850 p_priority.appendChild(textTag(doc, "chat", prefs.eventPriorityChat));
851 p_priority.appendChild(textTag(doc, "headline", prefs.eventPriorityHeadline));
852 p_priority.appendChild(textTag(doc, "auth", prefs.eventPriorityAuth));
853 p_priority.appendChild(textTag(doc, "file", prefs.eventPriorityFile));
854 }
855 }
856
857 {
858 QDomElement p_pres = doc.createElement("presence");
859 p.appendChild(p_pres);
860
861 {
862 QDomElement tag = doc.createElement("misc");
863 p_pres.appendChild(tag);
864
865 tag.appendChild(textTag(doc, "askOnline", prefs.askOnline));
866 tag.appendChild(textTag(doc, "askOffline", prefs.askOffline));
867 tag.appendChild(textTag(doc, "rosterAnim", prefs.rosterAnim));
868 tag.appendChild(textTag(doc, "autoVersion", prefs.autoVersion));
869 tag.appendChild(textTag(doc, "autoVCardOnLogin", prefs.autoVCardOnLogin));
870 tag.appendChild(textTag(doc, "xmlConsoleOnLogin", prefs.xmlConsoleOnLogin));
871 }
872 {
873 QDomElement tag = doc.createElement("autostatus");
874 p_pres.appendChild(tag);
875
876 QDomElement e;
877
878 e = textTag(doc, "away", prefs.asAway);
879 setBoolAttribute(e, "use", prefs.use_asAway);
880 tag.appendChild(e);
881
882 e = textTag(doc, "xa", prefs.asXa);
883 setBoolAttribute(e, "use", prefs.use_asXa);
884 tag.appendChild(e);
885
886 e = textTag(doc, "offline", prefs.asOffline);
887 setBoolAttribute(e, "use", prefs.use_asOffline);
888 tag.appendChild(e);
889
890 tag.appendChild(textTag(doc, "message", prefs.asMessage));
891 }
892 {
893 p_pres.appendChild(prefs.sp.toXml(doc, "statuspresets"));
894 }
895 {
896 p_pres.appendChild(stringListToXml(doc, "recentstatus",prefs.recentStatus));
897 }
898 }
899
900 {
901 QDomElement p_lnf = doc.createElement("lookandfeel");
902 p.appendChild(p_lnf);
903
904 p_lnf.appendChild(textTag(doc, "newHeadings", prefs.clNewHeadings));
905 p_lnf.appendChild(textTag(doc, "chat-opacity", prefs.chatOpacity));
906 p_lnf.appendChild(textTag(doc, "roster-opacity", prefs.rosterOpacity));
907 p_lnf.appendChild(textTag(doc, "outline-headings", prefs.outlineHeadings));
908
909 {
910 QDomElement tag = doc.createElement("colors");
911 p_lnf.appendChild(tag);
912
913 tag.appendChild(textTag(doc, "online", prefs.color[cOnline].name() ));
914 tag.appendChild(textTag(doc, "listback", prefs.color[cListBack].name() ));
915 tag.appendChild(textTag(doc, "away", prefs.color[cAway].name() ));
916 tag.appendChild(textTag(doc, "dnd", prefs.color[cDND].name() ));
917 tag.appendChild(textTag(doc, "offline", prefs.color[cOffline].name() ));
918 tag.appendChild(textTag(doc, "profilefore", prefs.color[cProfileFore].name() ));
919 tag.appendChild(textTag(doc, "profileback", prefs.color[cProfileBack].name() ));
920 tag.appendChild(textTag(doc, "groupfore", prefs.color[cGroupFore].name() ));
921 tag.appendChild(textTag(doc, "groupback", prefs.color[cGroupBack].name() ));
922 tag.appendChild(textTag(doc, "animfront", prefs.color[cAnimFront].name() ));
923 tag.appendChild(textTag(doc, "animback", prefs.color[cAnimBack].name() ));
924 }
925
926 {
927 QDomElement tag = doc.createElement("fonts");
928 p_lnf.appendChild(tag);
929
930 tag.appendChild(textTag(doc, "roster", prefs.font[fRoster] ));
931 tag.appendChild(textTag(doc, "message", prefs.font[fMessage] ));
932 tag.appendChild(textTag(doc, "chat", prefs.font[fChat] ));
933 tag.appendChild(textTag(doc, "popup", prefs.font[fPopup] ));
934 }
935 }
936
937 {
938 QDomElement p_sound = doc.createElement("sound");
939 p.appendChild(p_sound);
940
941 p_sound.appendChild(textTag(doc, "player", prefs.player));
942 p_sound.appendChild(textTag(doc, "noawaysound", prefs.noAwaySound));
943 p_sound.appendChild(textTag(doc, "noGCSound", prefs.noGCSound));
944
945 {
946 QDomElement p_onevent = doc.createElement("onevent");
947 p_sound.appendChild(p_onevent);
948
949 p_onevent.appendChild(textTag(doc, "message", prefs.onevent[eMessage]));
950 p_onevent.appendChild(textTag(doc, "chat1", prefs.onevent[eChat1]));
951 p_onevent.appendChild(textTag(doc, "chat2", prefs.onevent[eChat2]));
952 p_onevent.appendChild(textTag(doc, "system", prefs.onevent[eSystem]));
953 p_onevent.appendChild(textTag(doc, "headline", prefs.onevent[eHeadline]));
954 p_onevent.appendChild(textTag(doc, "online", prefs.onevent[eOnline]));
955 p_onevent.appendChild(textTag(doc, "offline", prefs.onevent[eOffline]));
956 p_onevent.appendChild(textTag(doc, "send", prefs.onevent[eSend]));
957 p_onevent.appendChild(textTag(doc, "incoming_ft", prefs.onevent[eIncomingFT]));
958 p_onevent.appendChild(textTag(doc, "ft_complete", prefs.onevent[eFTComplete]));
959 }
960 }
961
962 {
963 QDomElement p_sizes = doc.createElement("sizes");
964 p.appendChild(p_sizes);
965
966 p_sizes.appendChild(textTag(doc, "eventdlg", prefs.sizeEventDlg));
967 p_sizes.appendChild(textTag(doc, "chatdlg", prefs.sizeChatDlg));
968 p_sizes.appendChild(textTag(doc, "tabdlg", prefs.sizeTabDlg));
969 }
970
971 {
972 QDomElement p_toolbars = doc.createElement("toolbars");
973 p.appendChild(p_toolbars);
974
975 QMap< QString, QValueList<Options::ToolbarPrefs> >::Iterator itBars = prefs.toolbars.begin();
976 for ( ; itBars != prefs.toolbars.end(); ++itBars ) {
977 QValueList<Options::ToolbarPrefs> toolbars = itBars.data();
978 QDomElement p_bars = doc.createElement( itBars.key() );
979 p_toolbars.appendChild( p_bars );
980
981 QValueList<Options::ToolbarPrefs>::Iterator it = toolbars.begin();
982 for ( ; it != toolbars.end(); ++it) {
983 Options::ToolbarPrefs tb = *it;
984 if ( tb.keys.size() ||
985 !tb.name.isEmpty() )
986 {
987 QDomElement tb_prefs = doc.createElement("toolbar");
988 p_bars.appendChild(tb_prefs);
989
990 tb_prefs.appendChild(textTag(doc, "name", tb.name));
991 tb_prefs.appendChild(textTag(doc, "on", tb.on));
992 tb_prefs.appendChild(textTag(doc, "locked", tb.locked));
993 tb_prefs.appendChild(textTag(doc, "stretchable", tb.stretchable));
994 tb_prefs.appendChild(stringListToXml(doc, "keys", tb.keys));
995
996 QDomElement tb_position = doc.createElement("position");
997 tb_prefs.appendChild(tb_position);
998
999 QString dockStr;
1000 Qt::Dock dock = tb.dock;
1001 if (dock == Qt::DockTop)
1002 dockStr = "DockTop";
1003 else if (dock == Qt::DockBottom)
1004 dockStr = "DockBottom";
1005 else if (dock == Qt::DockLeft)
1006 dockStr = "DockLeft";
1007 else if (dock == Qt::DockRight)
1008 dockStr = "DockRight";
1009 else if (dock == Qt::DockMinimized)
1010 dockStr = "DockMinimized";
1011 else if (dock == Qt::DockTornOff)
1012 dockStr = "DockTornOff";
1013 else if (dock == Qt::DockUnmanaged)
1014 dockStr = "DockUnmanaged";
1015
1016 tb_position.appendChild(textTag(doc, "dock", dockStr));
1017 tb_position.appendChild(textTag(doc, "index", tb.index));
1018 tb_position.appendChild(textTag(doc, "nl", tb.nl));
1019 tb_position.appendChild(textTag(doc, "extraOffset", tb.extraOffset));
1020 }
1021 }
1022 }
1023 }
1024
1025 {
1026 QDomElement pp = doc.createElement("popups");
1027 p.appendChild(pp);
1028 pp.appendChild(textTag(doc, "on", prefs.ppIsOn));
1029 pp.appendChild(textTag(doc, "online", prefs.ppOnline));
1030 pp.appendChild(textTag(doc, "offline", prefs.ppOffline));
1031 pp.appendChild(textTag(doc, "statusChange", prefs.ppStatus));
1032 pp.appendChild(textTag(doc, "message", prefs.ppMessage));
1033 pp.appendChild(textTag(doc, "chat", prefs.ppChat));
1034 pp.appendChild(textTag(doc, "headline", prefs.ppHeadline));
1035 pp.appendChild(textTag(doc, "file", prefs.ppFile));
1036 pp.appendChild(textTag(doc, "jidClip", prefs.ppJidClip));
1037 pp.appendChild(textTag(doc, "statusClip", prefs.ppStatusClip));
1038 pp.appendChild(textTag(doc, "textClip", prefs.ppTextClip));
1039 pp.appendChild(textTag(doc, "hideTime", prefs.ppHideTime));
1040 pp.appendChild(textTag(doc, "borderColor", prefs.ppBorderColor.name()));
1041 }
1042
1043 {
1044 // Bouncing dock (on Mac OS X)
1045 QDomElement dock = doc.createElement("dock");
1046 p.appendChild(dock);
1047 switch (prefs.bounceDock) {
1048 case Options::NoBounce :
1049 dock.setAttribute("bounce", "never");
1050 break;
1051 case Options::BounceOnce :
1052 dock.setAttribute("bounce", "once");
1053 break;
1054 case Options::BounceForever :
1055 dock.setAttribute("bounce", "forever");
1056 break;
1057 default:
1058 break;
1059 }
1060 }
1061
1062 {
1063 //group chat
1064 QDomElement gc = doc.createElement("groupchat");
1065 p.appendChild(gc);
1066 gc.appendChild(stringListToXml(doc, "highlightwords", prefs.gcHighlights));
1067 gc.appendChild(stringListToXml(doc, "nickcolors", prefs.gcNickColors));
1068 gc.appendChild(textTag(doc, "nickcoloring", prefs.gcNickColoring));
1069 gc.appendChild(textTag(doc, "highlighting", prefs.gcHighlighting));
1070 }
1071
1072 {
1073 QDomElement p_lockdown = doc.createElement("lockdown");
1074 p.appendChild(p_lockdown);
1075 p_lockdown.appendChild(textTag(doc, "roster", prefs.lockdown.roster));
1076 p_lockdown.appendChild(textTag(doc, "options", prefs.lockdown.options));
1077 p_lockdown.appendChild(textTag(doc, "profiles", prefs.lockdown.profiles));
1078 p_lockdown.appendChild(textTag(doc, "services", prefs.lockdown.services));
1079 p_lockdown.appendChild(textTag(doc, "accounts", prefs.lockdown.accounts));
1080 }
1081
1082 {
1083 QDomElement is = doc.createElement("iconset");
1084 p.appendChild(is);
1085
1086 // system
1087 is.appendChild(textTag(doc, "system", prefs.systemIconset));
1088
1089 // roster - default
1090 QDomElement is_roster = doc.createElement("roster");
1091 is.appendChild(is_roster);
1092 is_roster.appendChild(textTag(doc, "default", prefs.defaultRosterIconset));
1093
1094 {
1095 // roster - service
1096 QDomElement roster_service = doc.createElement("service");
1097 is_roster.appendChild(roster_service);
1098
1099 QMapIterator<QString, QString> it = prefs.serviceRosterIconset.begin();
1100 for ( ; it != prefs.serviceRosterIconset.end(); ++it) {
1101 QDomElement item = doc.createElement("item");
1102 roster_service.appendChild(item);
1103
1104 item.setAttribute("service", it.key());
1105 item.setAttribute("iconset", it.data());
1106 }
1107 }
1108
1109 {
1110 // roster - custom
1111 QDomElement roster_custom = doc.createElement("custom");
1112 is_roster.appendChild(roster_custom);
1113
1114 QMapIterator<QString, QString> it = prefs.customRosterIconset.begin();
1115 for ( ; it != prefs.customRosterIconset.end(); ++it) {
1116 QDomElement item = doc.createElement("item");
1117 roster_custom.appendChild(item);
1118
1119 item.setAttribute("regExp", it.key());
1120 item.setAttribute("iconset", it.data());
1121 }
1122 }
1123
1124 {
1125 // emoticons
1126 QDomElement is_emoticons = doc.createElement("emoticons");
1127 is.appendChild(is_emoticons);
1128
1129 QStringList::Iterator it = prefs.emoticons.begin();
1130 for ( ; it != prefs.emoticons.end(); ++it)
1131 is_emoticons.appendChild(textTag(doc, "item", *it));
1132 }
1133 }
1134
1135 {
1136 // tip of the day
1137 QDomElement p_tip = doc.createElement("tipOfTheDay");
1138 p.appendChild(p_tip);
1139
1140 p_tip.appendChild( textTag(doc, "show", prefs.showTips ) );
1141 p_tip.appendChild( textTag(doc, "num", prefs.tipNum ) );
1142 }
1143
1144 {
1145 // disco dialog
1146 QDomElement p_disco = doc.createElement("disco");
1147 p.appendChild(p_disco);
1148
1149 p_disco.appendChild( textTag(doc, "items", prefs.discoItems ) );
1150 p_disco.appendChild( textTag(doc, "info", prefs.discoInfo ) );
1151 }
1152
1153 {
1154 // data transfer
1155 QDomElement p_dt = doc.createElement("dt");
1156 p.appendChild(p_dt);
1157 p_dt.appendChild( textTag(doc, "port", prefs.dtPort ) );
1158 p_dt.appendChild( textTag(doc, "external", prefs.dtExternal ) );
1159 }
1160
1161 {
1162 // global accelerators
1163 QDomElement p_globalAccel = doc.createElement("globalAccel");
1164 p.appendChild(p_globalAccel);
1165
1166 QStringList accelNames;
1167 accelNames << "processNextEvent";
1168 accelNames << "showHideRoster";
1169
1170 QStringList::Iterator it1 = accelNames.begin();
1171 QValueList<QKeySequence>::iterator it2 = prefs.globalAccels.begin();
1172
1173 for ( ; it2 != prefs.globalAccels.end(); ++it1, ++it2 ) {
1174 QDomElement item = doc.createElement("command");
1175 p_globalAccel.appendChild(item);
1176 item.setAttribute("type", *it1);
1177 item.appendChild( doc.createTextNode(*it2) );
1178 }
1179 }
1180
1181 {
1182 // advanced widget
1183 QDomElement p_advWidget = doc.createElement("advancedWidget");
1184 p.appendChild(p_advWidget);
1185
1186 QDomElement stick = doc.createElement("sticky");
1187 p_advWidget.appendChild(stick);
1188
1189 setBoolAttribute(stick, "enabled", GAdvancedWidget::stickEnabled());
1190 stick.appendChild( textTag(doc, "offset", GAdvancedWidget::stickAt()) );
1191 stick.appendChild( textTag(doc, "stickToWindows", GAdvancedWidget::stickToWindows()) );
1192 }
1193
1194 QFile f(fname);
1195 if(!f.open(IO_WriteOnly))
1196 return FALSE;
1197 QTextStream t;
1198 t.setDevice(&f);
1199 t.setEncoding(QTextStream::UnicodeUTF8);
1200 t << doc.toString();
1201 t.unsetDevice();
1202 f.close();
1203
1204 return TRUE;
1205}
1206
1207bool UserProfile::fromFile(const QString &fname)
1208{
1209 QString confver;
1210 QDomDocument doc;
1211
1212 QFile f(fname);
1213 if(!f.open(IO_ReadOnly))
1214 return FALSE;
1215 if(!doc.setContent(&f))
1216 return FALSE;
1217 f.close();
1218
1219 QDomElement base = doc.documentElement();
1220 if(base.tagName() != "psiconf")
1221 return FALSE;
1222 confver = base.attribute("version");
1223 if(confver != "1.0")
1224 return FALSE;
1225
1226 readEntry(base, "progver", &progver);
1227
1228 readRectEntry(base, "geom", &mwgeom);
1229 xmlToStringList(base, "recentGCList", &recentGCList);
1230 xmlToStringList(base, "recentBrowseList", &recentBrowseList);
1231 readEntry(base, "lastStatusString", &lastStatusString);
1232 readBoolEntry(base, "useSound", &useSound);
1233
1234 bool found;
1235 QDomElement accs = findSubTag(base, "accounts", &found);
1236 if(found) {
1237 for(QDomNode n = accs.firstChild(); !n.isNull(); n = n.nextSibling()) {
1238 QDomElement a = n.toElement();
1239 if(a.isNull())
1240 continue;
1241
1242 if(a.tagName() == "account") {
1243 UserAccount ua;
1244 ua.fromXml(a);
1245 acc.append(ua);
1246 }
1247 }
1248 }
1249
1250 // convert old proxy config into new
1251 for(UserAccountList::Iterator it = acc.begin(); it != acc.end(); ++it) {
1252 UserAccount &a = *it;
1253 if(a.proxy_type > 0) {
1254 ProxyItem p;
1255 p.name = QObject::tr("%1 Proxy").arg(a.name);
1256 p.type = "http";
1257 p.settings.host = a.proxy_host;
1258 p.settings.port = a.proxy_port;
1259 p.settings.useAuth = !a.proxy_user.isEmpty();
1260 p.settings.user = a.proxy_user;
1261 p.settings.pass = a.proxy_pass;
1262 proxyList.append(p);
1263
1264 a.proxy_index = proxyList.count(); // 1 and up are proxies
1265 }
1266 }
1267
1268 QDomElement prox = findSubTag(base, "proxies", &found);
1269 if(found) {
1270 QDomNodeList list = prox.elementsByTagName("proxy");
1271 for(uint n = 0; n < list.count(); ++n) {
1272 QDomElement e = list.item(n).toElement();
1273 ProxyItem p;
1274 p.name = "";
1275 p.type = "";
1276 readEntry(e, "name", &p.name);
1277 readEntry(e, "type", &p.type);
1278 if(p.type == "0")
1279 p.type = "http";
1280 QDomElement pset = e.elementsByTagName("proxySettings").item(0).toElement();
1281 if(!pset.isNull())
1282 p.settings.fromXml(pset);
1283 proxyList.append(p);
1284 }
1285 }
1286
1287 QDomElement p = findSubTag(base, "preferences", &found);
1288 if(found) {
1289 bool found;
1290
1291 QDomElement p_general = findSubTag(p, "general", &found);
1292 if(found) {
1293 bool found;
1294
1295 QDomElement p_roster = findSubTag(p_general, "roster", &found);
1296 if(found) {
1297 readEntry(p_roster, "rosterBgImage", &prefs.rosterBgImage);
1298 readBoolEntry(p_roster, "useleft", &prefs.useleft);
1299 readBoolEntry(p_roster, "singleclick", &prefs.singleclick);
1300 readBoolEntry(p_roster, "hideMenubar", &prefs.hideMenubar);
1301 readNumEntry(p_roster, "defaultAction", &prefs.defaultAction);
1302 readBoolEntry(p_roster, "useTransportIconsForContacts", &prefs.useTransportIconsForContacts);
1303
1304 QDomElement sorting = findSubTag(p_roster, "sortStyle", &found);
1305 if(found) {
1306 QString name;
1307
1308 readEntry(sorting, "contact", &name);
1309 if ( name == "alpha" )
1310 prefs.rosterContactSortStyle = Options::ContactSortStyle_Alpha;
1311 else
1312 prefs.rosterContactSortStyle = Options::ContactSortStyle_Status;
1313
1314 readEntry(sorting, "group", &name);
1315 if ( name == "rank" )
1316 prefs.rosterGroupSortStyle = Options::GroupSortStyle_Rank;
1317 else
1318 prefs.rosterGroupSortStyle = Options::GroupSortStyle_Alpha;
1319
1320 readEntry(sorting, "account", &name);
1321 if ( name == "rank" )
1322 prefs.rosterAccountSortStyle = Options::AccountSortStyle_Rank;
1323 else
1324 prefs.rosterAccountSortStyle = Options::AccountSortStyle_Alpha;
1325 }
1326 }
1327
1328 // Avatars
1329 QDomElement avTag = findSubTag(p_general, "avatars", &found);
1330 if(found) {
1331 readBoolEntry(avTag, "use", &prefs.avatarsEnabled);
1332 readBoolEntry(avTag, "use_chatdlg", &prefs.avatarsChatdlgEnabled);
1333 readNumEntry(avTag, "size", &prefs.avatarsSize);
1334 }
1335
1336 QDomElement tag = findSubTag(p_general, "misc", &found);
1337 if(found) {
1338 readEntry(tag, "chatBgImage", &prefs.chatBgImage);
1339 readNumEntry(tag, "delChats", &prefs.delChats);
1340 readBoolEntry(tag, "showJoins", &prefs.showJoins);
1341 readNumEntry(tag, "browser", &prefs.browser);
1342 readEntry(tag, "customBrowser", &prefs.customBrowser);
1343 readEntry(tag, "customMailer", &prefs.customMailer);
1344 readBoolEntry(tag, "alwaysOnTop", &prefs.alwaysOnTop);
1345 readBoolEntry(tag, "keepSizes", &prefs.keepSizes);
1346 readBoolEntry(tag, "ignoreHeadline", &prefs.ignoreHeadline);
1347 readBoolEntry(tag, "ignoreNonRoster", &prefs.ignoreNonRoster);
1348 readBoolEntry(tag, "excludeGroupChatIgnore", &prefs.excludeGroupChatsFromIgnore);
1349 readBoolEntry(tag, "scrollTo", &prefs.scrollTo);
1350 readBoolEntry(tag, "useEmoticons", &prefs.useEmoticons);
1351 readBoolEntry(tag, "alertOpenChats", &prefs.alertOpenChats);
1352 readBoolEntry(tag, "raiseChatWindow", &prefs.raiseChatWindow);
1353 readBoolEntry(tag, "showSubjects", &prefs.showSubjects);
1354 readBoolEntry(tag, "chatSoftReturn", &prefs.chatSoftReturn);
1355 readBoolEntry(tag, "showGroupCounts", &prefs.showGroupCounts);
1356 readBoolEntry(tag, "showCounter", &prefs.showCounter);
1357 readBoolEntry(tag, "chatSays", &prefs.chatSays);
1358 readBoolEntry(tag, "jidComplete", &prefs.jidComplete);
1359 readBoolEntry(tag, "grabUrls", &prefs.grabUrls);
1360 readBoolEntry(tag, "smallChats", &prefs.smallChats);
1361 readBoolEntry(tag, "chatLineEdit", &prefs.chatLineEdit);
1362 readBoolEntry(tag, "useTabs", &prefs.useTabs);
1363 readBoolEntry(tag, "usePerTabCloseButton", &prefs.usePerTabCloseButton);
1364 readBoolEntry(tag, "putTabsAtBottom", &prefs.putTabsAtBottom);
1365 readBoolEntry(tag, "autoRosterSize", &prefs.autoRosterSize);
1366 readBoolEntry(tag, "autoRosterSizeGrowTop", &prefs.autoRosterSizeGrowTop);
1367 readBoolEntry(tag, "autoResolveNicksOnAdd", &prefs.autoResolveNicksOnAdd);
1368 readBoolEntry(tag, "messageEvents", &prefs.messageEvents);
1369 readEntry(tag, "lastPath", &prefs.lastPath);
1370 readEntry(tag, "lastSavePath", &prefs.lastSavePath);
1371 readBoolEntry(tag, "autoCopy", &prefs.autoCopy);
1372 }
1373
1374 tag = findSubTag(p_general, "dock", &found);
1375 if(found) {
1376 readBoolEntry(tag, "useDock", &prefs.useDock);
1377 readBoolEntry(tag, "dockDCstyle", &prefs.dockDCstyle);
1378 readBoolEntry(tag, "dockHideMW", &prefs.dockHideMW);
1379 readBoolEntry(tag, "dockToolMW", &prefs.dockToolMW);
1380 readBoolEntry(tag, "isWMDock", &prefs.isWMDock);
1381 }
1382
1383 /*tag = findSubTag(p_general, "security", &found);
1384 if(found) {
1385 readEntry(tag, "pgp", &prefs.pgp);
1386 }*/
1387 }
1388
1389 // Added by Kiko 020621: retrieves SSL cert chain validation configuration
1390 QDomElement p_ssl = findSubTag(p,"ssl",&found);
1391 if(found) {
1392 readEntry(p_ssl, "trustedcertstoredir", &prefs.trustCertStoreDir);
1393 }
1394
1395 QDomElement p_events = findSubTag(p, "events", &found);
1396 if(found) {
1397 bool found;
1398
1399 readNumEntry(p_events, "alertstyle", &prefs.alertStyle);
1400 readBoolEntry(p_events, "autoAuth", &prefs.autoAuth);
1401 readBoolEntry(p_events, "notifyAuth", &prefs.notifyAuth);
1402
1403 QDomElement tag = findSubTag(p_events, "receive", &found);
1404 if(found) {
1405 readBoolEntry(tag, "popupMsgs", &prefs.popupMsgs);
1406 readBoolEntry(tag, "popupChats", &prefs.popupChats);
1407 readBoolEntry(tag, "popupHeadlines", &prefs.popupHeadlines);
1408 readBoolEntry(tag, "popupFiles", &prefs.popupFiles);
1409 readBoolEntry(tag, "noAwayPopup", &prefs.noAwayPopup);
1410 readBoolEntry(tag, "noUnlistedPopup", &prefs.noUnlistedPopup);
1411 readBoolEntry(tag, "raise", &prefs.raise);
1412 readNumEntry(tag, "incomingAs", &prefs.incomingAs);
1413 }
1414
1415 tag = findSubTag(p_events, "priority", &found);
1416 if(found) {
1417 readNumEntry(tag, "message", &prefs.eventPriorityMessage);
1418 readNumEntry(tag, "chat", &prefs.eventPriorityChat);
1419 readNumEntry(tag, "headline", &prefs.eventPriorityHeadline);
1420 readNumEntry(tag, "auth", &prefs.eventPriorityAuth);
1421 readNumEntry(tag, "file", &prefs.eventPriorityFile);
1422 }
1423 }
1424
1425 QDomElement p_pres = findSubTag(p, "presence", &found);
1426 if(found) {
1427 bool found;
1428
1429 QDomElement tag = findSubTag(p_pres, "misc", &found);
1430 if(found) {
1431 readBoolEntry(tag, "askOnline", &prefs.askOnline);
1432 readBoolEntry(tag, "askOffline", &prefs.askOffline);
1433 readBoolEntry(tag, "rosterAnim", &prefs.rosterAnim);
1434 readBoolEntry(tag, "autoVersion", &prefs.autoVersion);
1435 readBoolEntry(tag, "autoVCardOnLogin", &prefs.autoVCardOnLogin);
1436 readBoolEntry(tag, "xmlConsoleOnLogin", &prefs.xmlConsoleOnLogin);
1437 }
1438
1439 tag = findSubTag(p_pres, "autostatus", &found);
1440 if(found) {
1441 bool found;
1442 QDomElement e;
1443 e = findSubTag(tag, "away", &found);
1444 if(found) {
1445 if(e.hasAttribute("use"))
1446 readBoolAttribute(e, "use", &prefs.use_asAway);
1447 else
1448 prefs.use_asAway = TRUE;
1449 }
1450 e = findSubTag(tag, "xa", &found);
1451 if(found) {
1452 if(e.hasAttribute("use"))
1453 readBoolAttribute(e, "use", &prefs.use_asXa);
1454 else
1455 prefs.use_asXa = TRUE;
1456 }
1457 e = findSubTag(tag, "offline", &found);
1458 if(found) {
1459 if(e.hasAttribute("use"))
1460 readBoolAttribute(e, "use", &prefs.use_asOffline);
1461 else
1462 prefs.use_asOffline = TRUE;
1463 }
1464
1465 readNumEntry(tag, "away", &prefs.asAway);
1466 readNumEntry(tag, "xa", &prefs.asXa);
1467 readNumEntry(tag, "offline", &prefs.asOffline);
1468
1469 readEntry(tag, "message", &prefs.asMessage);
1470 }
1471
1472 tag = findSubTag(p_pres, "statuspresets", &found);
1473 if(found)
1474 prefs.sp.fromXml(tag);
1475 xmlToStringList(p_pres, "recentstatus", &prefs.recentStatus);
1476 }
1477
1478 QDomElement p_lnf = findSubTag(p, "lookandfeel", &found);
1479 if(found) {
1480 bool found;
1481
1482 readBoolEntry(p_lnf, "newHeadings", &prefs.clNewHeadings);
1483 readBoolEntry(p_lnf, "outline-headings", &prefs.outlineHeadings);
1484 readNumEntry(p_lnf, "chat-opacity", &prefs.chatOpacity);
1485 readNumEntry(p_lnf, "roster-opacity", &prefs.rosterOpacity);
1486
1487 QDomElement tag = findSubTag(p_lnf, "colors", &found);
1488 if(found) {
1489 readColorEntry(tag, "online", &prefs.color[cOnline]);
1490 readColorEntry(tag, "listback", &prefs.color[cListBack]);
1491 readColorEntry(tag, "away", &prefs.color[cAway]);
1492 readColorEntry(tag, "dnd", &prefs.color[cDND]);
1493 readColorEntry(tag, "offline", &prefs.color[cOffline]);
1494 readColorEntry(tag, "groupfore", &prefs.color[cGroupFore]);
1495 readColorEntry(tag, "groupback", &prefs.color[cGroupBack]);
1496 readColorEntry(tag, "profilefore", &prefs.color[cProfileFore]);
1497 readColorEntry(tag, "profileback", &prefs.color[cProfileBack]);
1498 readColorEntry(tag, "animfront", &prefs.color[cAnimFront]);
1499 readColorEntry(tag, "animback", &prefs.color[cAnimBack]);
1500 }
1501
1502 tag = findSubTag(p_lnf, "fonts", &found);
1503 if(found) {
1504 readEntry(tag, "roster", &prefs.font[fRoster]);
1505 readEntry(tag, "message", &prefs.font[fMessage]);
1506 readEntry(tag, "chat", &prefs.font[fChat]);
1507 readEntry(tag, "popup", &prefs.font[fPopup]);
1508 }
1509 }
1510
1511 QDomElement p_sound = findSubTag(p, "sound", &found);
1512 if(found) {
1513 bool found;
1514
1515 readEntry(p_sound, "player", &prefs.player);
1516 readBoolEntry(p_sound, "noawaysound", &prefs.noAwaySound);
1517 readBoolEntry(p_sound, "noGCSound", &prefs.noGCSound);
1518
1519 QDomElement tag = findSubTag(p_sound, "onevent", &found);
1520 if(found) {
1521 readEntry(tag, "message", &prefs.onevent[eMessage]);
1522 readEntry(tag, "chat1", &prefs.onevent[eChat1]);
1523 readEntry(tag, "chat2", &prefs.onevent[eChat2]);
1524 readEntry(tag, "system", &prefs.onevent[eSystem]);
1525 readEntry(tag, "headline", &prefs.onevent[eHeadline]);
1526 readEntry(tag, "online", &prefs.onevent[eOnline]);
1527 readEntry(tag, "offline", &prefs.onevent[eOffline]);
1528 readEntry(tag, "send", &prefs.onevent[eSend]);
1529 readEntry(tag, "incoming_ft", &prefs.onevent[eIncomingFT]);
1530 readEntry(tag, "ft_complete", &prefs.onevent[eFTComplete]);
1531 }
1532 }
1533
1534 QDomElement p_sizes = findSubTag(p, "sizes", &found);
1535 if(found) {
1536 readSizeEntry(p_sizes, "eventdlg", &prefs.sizeEventDlg);
1537 readSizeEntry(p_sizes, "chatdlg", &prefs.sizeChatDlg);
1538 readSizeEntry(p_sizes, "tabdlg", &prefs.sizeTabDlg);
1539 }
1540
1541
1542 QDomElement p_toolbars = findSubTag(p, "toolbars", &found);
1543 if (found) {
1544 QStringList goodTags;
1545 goodTags << "toolbar";
1546 goodTags << "mainWin";
1547
1548 bool mainWinCleared = false;
1549 bool oldStyle = true;
1550
1551 for(QDomNode n = p_toolbars.firstChild(); !n.isNull(); n = n.nextSibling()) {
1552 QDomElement e = n.toElement();
1553 if( e.isNull() )
1554 continue;
1555
1556 QString tbGroup;
1557 bool isGood = false;
1558 QStringList::Iterator it = goodTags.begin();
1559 for ( ; it != goodTags.end(); ++it ) {
1560 if ( e.tagName().left( (*it).length() ) == *it ) {
1561 isGood = true;
1562
1563 if ( e.tagName().left(7) == "toolbar" )
1564 tbGroup = "mainWin";
1565 else {
1566 tbGroup = *it;
1567 oldStyle = false;
1568 }
1569
1570 break;
1571 }
1572 }
1573
1574 if ( isGood ) {
1575 if ( tbGroup != "mainWin" || !mainWinCleared ) {
1576 prefs.toolbars[tbGroup].clear();
1577 if ( tbGroup == "mainWin" )
1578 mainWinCleared = true;
1579 }
1580
1581 if ( oldStyle ) {
1582 Options::ToolbarPrefs tb = loadToolbarData( e );
1583 prefs.toolbars[tbGroup].append(tb);
1584 }
1585 else {
1586 for(QDomNode nn = e.firstChild(); !nn.isNull(); nn = nn.nextSibling()) {
1587 QDomElement ee = nn.toElement();
1588 if( ee.isNull() )
1589 continue;
1590
1591 if ( ee.tagName() == "toolbar" ) {
1592 Options::ToolbarPrefs tb = loadToolbarData( ee );
1593 prefs.toolbars[tbGroup].append(tb);
1594 }
1595 }
1596 }
1597 }
1598 }
1599
1600 // event notifier in these versions was not implemented as an action, so add it
1601 if ( progver == "0.9" || progver == "0.9-CVS" ) {
1602 // at first, we need to scan the options, to determine, whether event_notifier already available
1603 bool found = false;
1604 QValueList<Options::ToolbarPrefs>::Iterator it = prefs.toolbars["mainWin"].begin();
1605 for ( ; it != prefs.toolbars["mainWin"].end(); ++it) {
1606 QStringList::Iterator it2 = (*it).keys.begin();
1607 for ( ; it2 != (*it).keys.end(); ++it2) {
1608 if ( *it2 == "event_notifier" ) {
1609 found = true;
1610 break;
1611 }
1612 }
1613 }
1614
1615 if ( !found ) {
1616 Options::ToolbarPrefs tb;
1617 tb.name = QObject::tr("Event notifier");
1618 tb.on = false;
1619 tb.locked = true;
1620 tb.stretchable = true;
1621 tb.keys << "event_notifier";
1622 tb.dock = Qt::DockBottom;
1623 tb.index = 0;
1624 prefs.toolbars["mainWin"].append(tb);
1625 }
1626 }
1627 }
1628
1629 //group chat
1630 QDomElement p_groupchat = findSubTag(p, "groupchat", &found);
1631 if (found) {
1632 readBoolEntry(p_groupchat, "nickcoloring", &prefs.gcNickColoring);
1633 readBoolEntry(p_groupchat, "highlighting", &prefs.gcHighlighting);
1634 xmlToStringList(p_groupchat, "highlightwords", &prefs.gcHighlights);
1635 xmlToStringList(p_groupchat, "nickcolors", &prefs.gcNickColors);
1636 }
1637
1638 // Bouncing dock icon (Mac OS X)
1639 QDomElement p_dock = findSubTag(p, "dock", &found);
1640 if(found) {
1641 if (p_dock.attribute("bounce") == "once") {
1642 prefs.bounceDock = Options::BounceOnce;
1643 }
1644 else if (p_dock.attribute("bounce") == "forever") {
1645 prefs.bounceDock = Options::BounceForever;
1646 }
1647 else if (p_dock.attribute("bounce") == "never") {
1648 prefs.bounceDock = Options::NoBounce;
1649 }
1650 }
1651
1652 QDomElement p_popup = findSubTag(p, "popups", &found);
1653 if(found) {
1654 readBoolEntry(p_popup, "on", &prefs.ppIsOn);
1655 readBoolEntry(p_popup, "online", &prefs.ppOnline);
1656 readBoolEntry(p_popup, "offline", &prefs.ppOffline);
1657 readBoolEntry(p_popup, "statusChange", &prefs.ppStatus);
1658 readBoolEntry(p_popup, "message", &prefs.ppMessage);
1659 readBoolEntry(p_popup, "chat", &prefs.ppChat);
1660 readBoolEntry(p_popup, "headline", &prefs.ppHeadline);
1661 readBoolEntry(p_popup, "file", &prefs.ppFile);
1662 readNumEntry(p_popup, "jidClip", &prefs.ppJidClip);
1663 readNumEntry(p_popup, "statusClip", &prefs.ppStatusClip);
1664 readNumEntry(p_popup, "textClip", &prefs.ppTextClip);
1665 readNumEntry(p_popup, "hideTime", &prefs.ppHideTime);
1666 readColorEntry(p_popup, "borderColor", &prefs.ppBorderColor);
1667 }
1668
1669 QDomElement p_lockdown = findSubTag(p, "lockdown", &found);
1670 if(found) {
1671 readBoolEntry(p_lockdown, "roster", &prefs.lockdown.roster);
1672 readBoolEntry(p_lockdown, "options", &prefs.lockdown.options);
1673 readBoolEntry(p_lockdown, "profiles", &prefs.lockdown.profiles);
1674 readBoolEntry(p_lockdown, "services", &prefs.lockdown.services);
1675 readBoolEntry(p_lockdown, "accounts", &prefs.lockdown.accounts);
1676 }
1677
1678 QDomElement p_iconset = findSubTag(p, "iconset", &found);
1679 if(found) {
1680 readEntry(p_iconset, "system", &prefs.systemIconset);
1681
1682 QDomElement roster = findSubTag(p_iconset, "roster", &found);
1683 if (found) {
1684 readEntry(roster, "default", &prefs.defaultRosterIconset);
1685
1686 QDomElement service = findSubTag(roster, "service", &found);
1687 if (found) {
1688 prefs.serviceRosterIconset.clear();
1689 for (QDomNode n = service.firstChild(); !n.isNull(); n = n.nextSibling()) {
1690 QDomElement i = n.toElement();
1691 if ( i.isNull() )
1692 continue;
1693
1694 prefs.serviceRosterIconset[i.attribute("service")] = i.attribute("iconset");
1695 }
1696 }
1697
1698 QDomElement custom = findSubTag(roster, "custom", &found);
1699 if (found) {
1700 prefs.customRosterIconset.clear();
1701 for (QDomNode n = custom.firstChild(); !n.isNull(); n = n.nextSibling()) {
1702 QDomElement i = n.toElement();
1703 if ( i.isNull() )
1704 continue;
1705
1706 prefs.customRosterIconset[i.attribute("regExp")] = i.attribute("iconset");
1707 }
1708 }
1709 }
1710
1711 QDomElement emoticons = findSubTag(p_iconset, "emoticons", &found);
1712 if (found) {
1713 prefs.emoticons.clear();
1714 for (QDomNode n = emoticons.firstChild(); !n.isNull(); n = n.nextSibling()) {
1715 QDomElement i = n.toElement();
1716 if ( i.isNull() )
1717 continue;
1718
1719 if ( i.tagName() == "item" ) {
1720 QString is = i.text();
1721 prefs.emoticons << is;
1722 }
1723 }
1724 }
1725 }
1726
1727 QDomElement p_tip = findSubTag(p, "tipOfTheDay", &found);
1728 if (found) {
1729 readBoolEntry(p_tip, "show", &prefs.showTips);
1730 readNumEntry(p_tip, "num", &prefs.tipNum);
1731 }
1732
1733 QDomElement p_disco = findSubTag(p, "disco", &found);
1734 if (found) {
1735 readBoolEntry(p_disco, "items", &prefs.discoItems);
1736 readBoolEntry(p_disco, "info", &prefs.discoInfo);
1737 }
1738
1739 QDomElement p_dt = findSubTag(p, "dt", &found);
1740 if (found) {
1741 readNumEntry(p_dt, "port", &prefs.dtPort);
1742 readEntry(p_dt, "external", &prefs.dtExternal);
1743 }
1744
1745 QDomElement p_globalAccel = findSubTag(p, "globalAccel", &found);
1746 if (found) {
1747 QMap<QString, int> accelNames;
1748 accelNames["processNextEvent"] = 0;
1749 accelNames["showHideRoster"] = 1;
1750
1751 for (QDomNode n = p_globalAccel.firstChild(); !n.isNull(); n = n.nextSibling()) {
1752 QDomElement i = n.toElement();
1753 if ( i.isNull() )
1754 continue;
1755
1756 if ( i.tagName() == "command" && i.hasAttribute("type") ) {
1757 int n = accelNames[i.attribute("type")];
1758 prefs.globalAccels[n] = QKeySequence(i.text());
1759 }
1760 }
1761 }
1762
1763 QDomElement p_advWidget = findSubTag(p, "advancedWidget", &found);
1764 if (found) {
1765 QDomElement stick = findSubTag(p_advWidget, "sticky", &found);
1766 if (found) {
1767 bool enabled, toWindows;
1768 int offs;
1769
1770 readBoolAttribute(stick, "enabled", &enabled);
1771 readNumEntry(stick, "offset", &offs);
1772 readBoolEntry(stick, "stickToWindows", &toWindows);
1773
1774 GAdvancedWidget::setStickEnabled( enabled );
1775 GAdvancedWidget::setStickAt( offs );
1776 GAdvancedWidget::setStickToWindows( toWindows );
1777 }
1778 }
1779 }
1780
1781 return TRUE;
1782}
1783
1784
1785QString pathToProfile(const QString &name)
1786{
1787 return g.pathProfiles + "/" + name;
1788}
1789
1790QString pathToProfileConfig(const QString &name)
1791{
1792 return pathToProfile(name) + "/config.xml";
1793}
1794
1795QStringList getProfilesList()
1796{
1797 QStringList list;
1798
1799 QDir d(g.pathProfiles);
1800 if(!d.exists())
1801 return list;
1802
1803 QStringList entries = d.entryList();
1804 for(QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) {
1805 if(*it == "." || *it == "..")
1806 continue;
1807 QFileInfo info(d, *it);
1808 if(!info.isDir())
1809 continue;
1810
1811 list.append(*it);
1812 }
1813
1814 list.sort();
1815
1816 return list;
1817}
1818
1819bool profileExists(const QString &_name)
1820{
1821 QString name = _name.lower();
1822
1823 QStringList list = getProfilesList();
1824 for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
1825 if((*it).lower() == name)
1826 return TRUE;
1827 }
1828 return FALSE;
1829}
1830
1831bool profileNew(const QString &name)
1832{
1833 if(name.isEmpty())
1834 return FALSE;
1835
1836 // verify the string is sane
1837 for(int n = 0; n < (int)name.length(); ++n) {
1838 if(!name.at(n).isLetterOrNumber())
1839 return FALSE;
1840 }
1841
1842 // make it
1843 QDir d(g.pathProfiles);
1844 if(!d.exists())
1845 return FALSE;
1846 QDir p(g.pathProfiles + "/" + name);
1847 if(!p.exists()) {
1848 d.mkdir(name);
1849 if(!p.exists())
1850 return FALSE;
1851 }
1852
1853 p.mkdir("history");
1854 p.mkdir("vcard");
1855
1856 return TRUE;
1857}
1858
1859bool profileRename(const QString &oldname, const QString &name)
1860{
1861 // verify the string is sane
1862 for(int n = 0; n < (int)name.length(); ++n) {
1863 if(!name.at(n).isLetterOrNumber())
1864 return FALSE;
1865 }
1866
1867 // locate the folder
1868 QDir d(g.pathProfiles);
1869 if(!d.exists())
1870 return FALSE;
1871 if(!d.rename(oldname, name))
1872 return FALSE;
1873
1874 return TRUE;
1875}
1876
1877static bool folderRemove(const QDir &_d)
1878{
1879 QDir d = _d;
1880
1881 QStringList entries = d.entryList();
1882 for(QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) {
1883 if(*it == "." || *it == "..")
1884 continue;
1885 QFileInfo info(d, *it);
1886 if(info.isDir()) {
1887 if(!folderRemove(QDir(info.filePath())))
1888 return FALSE;
1889 }
1890 else {
1891 //printf("deleting [%s]\n", info.filePath().latin1());
1892 d.remove(info.fileName());
1893 }
1894 }
1895 QString name = d.dirName();
1896 if(!d.cdUp())
1897 return FALSE;
1898 //printf("removing folder [%s]\n", d.filePath(name).latin1());
1899 d.rmdir(name);
1900
1901 return TRUE;
1902}
1903
1904bool profileDelete(const QString &path)
1905{
1906 QDir d(path);
1907 if(!d.exists())
1908 return TRUE;
1909
1910 return folderRemove(QDir(path));
1911}
Note: See TracBrowser for help on using the repository browser.