~ubuntu-branches/ubuntu/quantal/psi/quantal

« back to all changes in this revision

Viewing changes to src/psi_profiles.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jan Niehusmann
  • Date: 2005-01-10 17:41:43 UTC
  • mfrom: (1.2.1 upstream) (2.1.2 hoary)
  • Revision ID: james.westby@ubuntu.com-20050110174143-ltocv5zapl6blf5d
Tags: 0.9.3-1
* New upstream release
* Cleaned up debian/rules (some things are done by upstream Makefiles now)
* Fixed some lintian warnings:
  - removed executable bit from some .png files
  - moved psi.desktop to /usr/share/applications
* Updated menu files

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