~ubuntu-branches/ubuntu/edgy/psi/edgy

« back to all changes in this revision

Viewing changes to src/psi_profiles.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jan Niehusmann
  • Date: 2004-06-15 00:10:41 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040615001041-enywb6pcpe4sjsw6
Tags: 0.9.2-1
* New upstream release
* Set KDEDIR for ./configure so kde specific files get installed
* Don't install libpsiwidgets.so. It got installed in /usr/share
  where it doesn't belong. May be included (at a better location)
  later.

Show diffs side-by-side

added added

removed removed

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