1
/****************************************************************************
2
** main.cpp - initialization and profile/settings handling
3
** Copyright (C) 2001, 2002 Justin Karneges
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.
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.
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
19
****************************************************************************/
23
#include<qapplication.h>
27
#include<qtextcodec.h>
33
#include"profiledlg.h"
37
QString curLang = "en";
38
QString curLangName = QT_TR_NOOP("language_name");
40
void setLang(const QString &lang)
42
//printf("changing lang: [%s]\n", lang.latin1());
46
curLangName = "English";
53
dirs += g.pathHome + subdir;
54
dirs += g.pathBase + subdir;
55
for(QStringList::Iterator it = dirs.begin(); it != dirs.end(); ++it) {
56
if(!QFile::exists(*it))
58
if(trans->load("psi_" + lang, *it)) {
66
static QColor configLoadColor(QSettings &settings, QString key, QString def)
69
c.setNamedColor(settings.readEntry(key, def));
76
static QSize configLoadSize(QSettings &settings, QString key, QSize def)
78
QStringList list = QStringList::split(',', settings.readEntry(key));
83
s.setWidth(list[0].toInt());
84
s.setHeight(list[1].toInt());
88
static void folderkeyRemove(QSettings &settings, const QString &d)
91
QStringList::Iterator it;
93
entries = settings.subkeyList(d);
94
for(it = entries.begin(); it != entries.end(); ++it) {
95
QString str = d + "/" + *it;
96
folderkeyRemove(settings, str);
99
entries = settings.entryList(d);
100
for(it = entries.begin(); it != entries.end(); ++it) {
101
QString str = d + "/" + *it;
102
settings.removeEntry(str);
104
settings.removeEntry(d);
108
PsiMain::PsiMain(QObject *par)
113
// detect available language packs
114
langs.set("en", "English");
118
dirs += "." + subdir;
119
dirs += g.pathHome + subdir;
120
dirs += g.pathBase + subdir;
122
for(QStringList::Iterator it = dirs.begin(); it != dirs.end(); ++it) {
123
if(!QFile::exists(*it))
126
QStringList entries = d.entryList();
127
for(QStringList::Iterator it2 = entries.begin(); it2 != entries.end(); ++it2) {
128
if(*it2 == "." || *it2 == "..")
132
// verify that it is a language file
133
if(str.left(4) != "psi_")
135
int n = str.find('.', 4);
138
if(str.mid(n) != ".qm")
140
QString lang = str.mid(4, n-4);
142
//printf("found [%s], lang=[%s]\n", str.latin1(), lang.latin1());
144
// get the language_name
145
QString name = QString("[") + str + "]";
147
if(!t.load(str, *it))
150
if(t.contains("@default", "language_name", 0)) {
151
QString s = t.findMessage("@default", "language_name", 0).translation();
156
langs.set(lang, name);
160
QSettings *s = new QSettings;
161
s->insertSearchPath(QSettings::Windows, "/Affinix");
162
s->insertSearchPath(QSettings::Unix, g.pathHome);
163
lastProfile = s->readEntry("/psi/lastProfile");
164
lastLang = s->readEntry("/psi/lastLang");
165
autoOpen = s->readBoolEntry("/psi/autoOpen", FALSE);
168
// get a debug window
169
debug_window = new LogWindow;
173
if(lastLang.isEmpty()) {
174
lastLang = QTextCodec::locale();
175
//printf("guessing locale: [%s]\n", lastLang.latin1());
181
sessionStart(lastProfile);
183
QTimer::singleShot(0, this, SLOT(chooseProfile()));
190
QSettings *s = new QSettings;
191
s->insertSearchPath(QSettings::Windows, "/Affinix");
192
s->insertSearchPath(QSettings::Unix, g.pathHome);
193
s->writeEntry("/psi/lastProfile", lastProfile);
194
s->writeEntry("/psi/lastLang", lastLang);
195
s->writeEntry("/psi/autoOpen", autoOpen);
199
static bool loadGlobal()
201
//QIconSet::setIconSize(QIconSet::Small, QSize(16,16));
202
//QIconSet::setIconSize(QIconSet::Large, QSize(50,50));
205
g.pathBase = getResourcesDir();
206
g.pathHome = getHomeDir();
207
g.pathProfiles = g.pathHome + "/profiles";
209
QDir d(g.pathProfiles);
218
dirs += g.pathBase + "/image";
220
pix_logo = loadImage("psilogo.png", dirs);
221
pix_main = loadImage("psimain.png", dirs);
223
pix_ssl_yes = loadImage("ssl_yes.png", dirs);
224
pix_ssl_no = loadImage("ssl_no.png", dirs);
226
//pixdat_ft_back = loadImageData("ft_back.png", dirs, &pixlen_ft_back);
227
//pixdat_ft_file = loadImageData("ft_file.png", dirs, &pixlen_ft_file);
228
//pixdat_ft_folder = loadImageData("ft_folder.png", dirs, &pixlen_ft_folder);
233
QPixmap *tmp = loadImage("chatsend.png", dirs);
235
QImage image = tmp->convertToImage();
238
frame = image.copy(0, 0, 50, 50);
239
pix_chatsend1 = new QPixmap;
240
pix_chatsend1->convertFromImage(frame);
241
frame = image.copy(50, 0, 50, 50);
242
pix_chatsend2 = new QPixmap;
243
pix_chatsend2->convertFromImage(frame);
246
pix_chatclear = loadImage("chatclear.png", dirs);
247
pix_account = loadImage("account.png", dirs);
248
pix_icon_48 = loadImage("icon_48.png", dirs);
251
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
252
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
254
QBitmap bm(16, 16, blank);
255
pix_blank = new QPixmap(16,16);
256
pix_blank->fill(Qt::black);
257
pix_blank->setMask(bm);
260
QString tic_names[5] = { "trans", "icq", "aim", "msn", "yahoo" };
261
QString tic_types[5] = { "offline", "online", "away", "xa", "dnd" };
262
for(int n = 0; n < 5; ++n) {
263
for(int n2 = 0; n2 < 5; ++n2) {
264
tic[n].p[n2] = loadImage(tic_names[n] + '_' + tic_types[n2] + ".png", dirs);
265
if(n == 0 && !tic[n].p[n2])
270
if(!pix_logo || !pix_main || /*!pixdat_ft_back || !pixdat_ft_file || !pixdat_ft_folder ||*/
271
!pix_chatsend1 || !pix_chatsend2 || !pix_chatclear || !pix_account || !tic_ok || !pix_ssl_yes || !pix_ssl_no || !pix_icon_48) {
272
QMessageBox::critical(0, CAP(QObject::tr("Error")),QObject::tr(
273
"There were problems loading the images / icon set. Be sure you have correctly installed Psi by\n"
274
"running the install script (\"./install\") after unpacking. See the README for more details.\n"
282
void PsiMain::chooseProfile()
292
ProfileOpenDlg *w = new ProfileOpenDlg(lastProfile, langs, curLang);
293
w->ck_auto->setChecked(autoOpen);
297
QString newLang = w->newLang;
304
if(r == QDialog::Accepted)
305
str = w->cb_profile->currentText();
306
autoOpen = w->ck_auto->isChecked();
317
// only set lastProfile if the user opened it
319
sessionStart(lastProfile);
322
bool PsiMain::sessionStart(const QString &str)
324
//printf("starting session: [%s]\n", str.latin1());
329
j = new jabcon(this);
332
connect(j, SIGNAL(quit(int)), SLOT(sessionQuit(int)));
337
void PsiMain::sessionQuit(int x)
339
//printf("quit=%d\n", x);
341
QTimer::singleShot(0, this, SLOT(bail()));
343
QTimer::singleShot(0, this, SLOT(chooseProfile()));
355
void PsiMain::detectOldSettings()
357
if(profileExists("Default"))
361
settings.insertSearchPath(QSettings::Windows, "/Affinix");
362
settings.insertSearchPath(QSettings::Unix, g.pathHome);
364
// try to determine if a version prior to 0.8.5 has been used
365
if(settings.readNumEntry("/psi/winx", -100) == -100)
368
int r = QMessageBox::information(0, CAP(tr("Old settings")),
370
"Old settings/history from a version of Psi prior to 0.8.5 have been detected.\n"
371
"These will be imported into the \"Default\" profile. Ok?"
373
tr("Import"), tr("Skip"));
377
//printf("converting...\n");
385
acc.name = "Default";
387
// gather up the old settings
388
acc.user = settings.readEntry("/psi/username");
389
acc.host = settings.readEntry("/psi/hostname");
390
acc.pass = decodePassword(settings.readEntry("/psi/password"), QString("%1@%2").arg(acc.user).arg(acc.host));
391
acc.port = settings.readNumEntry("/psi/port", 5222);
392
acc.resource = settings.readEntry("/psi/resource", "Psi");
393
acc.priority = settings.readNumEntry("/psi/priority", 0);
394
acc.opt_auto = settings.readBoolEntry("/psi/opt_auto", FALSE);
395
acc.opt_pass = settings.readBoolEntry("/psi/opt_pass", FALSE);
396
acc.opt_ssl = settings.readBoolEntry("/psi/opt_ssl", FALSE);
397
acc.tog_offline = settings.readBoolEntry("/psi/tog_offline", TRUE);
398
acc.tog_away = settings.readBoolEntry("/psi/tog_away", TRUE);
399
acc.tog_agents = settings.readBoolEntry("/psi/tog_agents", TRUE);
400
acc.olr_string = settings.readEntry("/psi/OLR");
402
int win_x, win_y, win_w, win_h;
403
win_x = settings.readNumEntry("/psi/winx", 64);
404
win_y = settings.readNumEntry("/psi/winy", 64);
405
win_w = settings.readNumEntry("/psi/winw", 160);
406
win_h = settings.readNumEntry("/psi/winh", 360);
407
pro.mwgeom.setRect(win_x, win_y, win_w, win_h);
408
pro.lastStatusString = settings.readEntry("/psi/lastStatusString");
409
pro.useSound = settings.readBoolEntry("/psi/usesound", TRUE);
412
QStringList entries = settings.subkeyList("/psi/roster");
413
for(QStringList::Iterator i = entries.begin(); i != entries.end(); ++i) {
414
QString jid = jidDecode(*i);
415
JabRosterEntry *item = acc.roster.findByJid(jid);
417
item = new JabRosterEntry;
418
item->jid = cleanJid(jid);
419
acc.roster.add(item);
422
item->nick = settings.readEntry("/psi/roster/" + *i + "/nick");
423
item->groups = settings.readListEntry("/psi/roster/" + *i + "/group");
424
item->sub = settings.readEntry("/psi/roster/" + *i + "/sub");
428
option.useleft = settings.readBoolEntry("/psi/options/general/roster/useleft", FALSE);
429
option.singleclick = settings.readBoolEntry("/psi/options/general/roster/singleclick", FALSE);
430
option.defaultAction = settings.readNumEntry("/psi/options/general/roster/defaultAction", 0);
431
option.outgoingAs = settings.readNumEntry("/psi/options/events/send/outgoingAs", 0);
433
option.delChats = settings.readNumEntry("/psi/options/general/misc/delChats", dcHour);
434
option.browser = settings.readNumEntry("/psi/options/general/misc/browser", 0);
435
option.customBrowser = settings.readEntry("/psi/options/general/misc/customBrowser");
436
option.customMailer = settings.readEntry("/psi/options/general/misc/customMailer");
438
#if defined(Q_WS_WIN)
439
option.useDock = settings.readBoolEntry("/psi/options/general/dock/useDock", TRUE);
440
option.dockDCstyle = settings.readBoolEntry("/psi/options/general/dock/dockDCstyle", TRUE);
441
option.alwaysOnTop = settings.readBoolEntry("/psi/options/general/misc/alwaysOnTop", TRUE);
442
#elif defined(Q_WS_X11)
443
option.useDock = settings.readBoolEntry("/psi/options/general/dock/useDock", FALSE);
444
option.dockDCstyle = settings.readBoolEntry("/psi/options/general/dock/dockDCstyle", FALSE);
445
option.alwaysOnTop = settings.readBoolEntry("/psi/options/general/misc/alwaysOnTop", FALSE);
447
option.useDock = FALSE;
448
option.dockDCstyle = FALSE;
449
option.alwaysOnTop = FALSE;
452
option.keepSizes = settings.readBoolEntry("/psi/options/general/misc/keepSizes", FALSE);
453
option.ignoreHeadline = settings.readBoolEntry("/psi/options/general/misc/ignoreHeadline", FALSE);
454
option.sizeEventDlg = configLoadSize(settings, "/psi/options/sizes/eventdlg", EventDlg::defaultSize());
455
option.sizeChatDlg = configLoadSize(settings, "/psi/options/sizes/chatdlg", ChatDlg::defaultSize());
457
acc.opt_keepAlive = settings.readBoolEntry("/psi/options/general/misc/keepAlive", TRUE);
458
option.askOnline = settings.readBoolEntry("/psi/options/presence/misc/askOnline", FALSE);
459
option.rosterAnim = settings.readBoolEntry("/psi/options/presence/misc/rosterAnim", TRUE);
460
option.popupMsgs = settings.readBoolEntry("/psi/options/events/receive/popupMsgs", FALSE);
461
option.popupChats = settings.readBoolEntry("/psi/options/events/receive/popupChats", FALSE);
462
option.raise = settings.readBoolEntry("/psi/options/events/receive/raise", FALSE);
463
option.incomingAs = settings.readNumEntry("/psi/options/events/receive/incomingAs", 0);
465
option.onevent[eMessage] = settings.readEntry("/psi/options/events/onevent/message", option.onevent[eMessage]);
466
option.onevent[eChat1] = settings.readEntry("/psi/options/events/onevent/chat1", option.onevent[eChat1]);
467
option.onevent[eChat2] = settings.readEntry("/psi/options/events/onevent/chat2", option.onevent[eChat2]);
468
option.onevent[eSystem] = settings.readEntry("/psi/options/events/onevent/system", option.onevent[eSystem]);
469
option.onevent[eOnline] = settings.readEntry("/psi/options/events/onevent/online", option.onevent[eOnline]);
470
option.onevent[eOffline] = settings.readEntry("/psi/options/events/onevent/offline", option.onevent[eOffline]);
471
option.onevent[eSend] = settings.readEntry("/psi/options/events/onevent/send", option.onevent[eSend]);
473
option.color[cOnline] = configLoadColor(settings, "/psi/options/lookandfeel/colors/online", "#0060C0");
474
option.color[cListBack] = configLoadColor(settings, "/psi/options/lookandfeel/colors/listback", "#C0C0C0");
475
option.color[cAway] = configLoadColor(settings, "/psi/options/lookandfeel/colors/away", "#008080");
476
option.color[cDND] = configLoadColor(settings, "/psi/options/lookandfeel/colors/dnd", "#800000");
477
option.color[cOffline] = configLoadColor(settings, "/psi/options/lookandfeel/colors/offline", "#000000");
478
option.color[cGroupFore] = configLoadColor(settings, "/psi/options/lookandfeel/colors/groupfore", "#000000");
479
option.color[cGroupBack] = configLoadColor(settings, "/psi/options/lookandfeel/colors/groupback", "#FFFFFF");
480
option.font[fRoster] = settings.readEntry("/psi/options/lookandfeel/fonts/roster", QApplication::font().toString());
481
option.font[fMessage] = settings.readEntry("/psi/options/lookandfeel/fonts/message", QApplication::font().toString());
482
option.font[fChat] = settings.readEntry("/psi/options/lookandfeel/fonts/chat", QApplication::font().toString());
483
option.iconset = "stellar"; //settings.readEntry("/psi/options/lookandfeel/iconset", "stellar");
484
option.alertStyle = settings.readNumEntry("/psi/options/events/alertstyle", 2);
486
option.asAway = settings.readNumEntry("/psi/options/presence/autostatus/away", 10);
487
option.asXa = settings.readNumEntry("/psi/options/presence/autostatus/xa", 30);
488
option.asOffline = settings.readNumEntry("/psi/options/presence/autostatus/offline", 0);
490
QStringList vars = settings.readListEntry("/psi/options/presence/statuspresets/vars");
491
QStringList vals = settings.readListEntry("/psi/options/presence/statuspresets/vals");
493
QStringList::ConstIterator i1 = vars.begin();
494
QStringList::ConstIterator i2 = vals.begin();
495
for(; i1 != vars.end(); ++i1, ++i2)
496
option.sp.set(*i1, *i2);
498
option.player = settings.readEntry("/psi/options/sound/player", "play");
499
option.noAwaySound = settings.readBoolEntry("/psi/options/sound/noawaysound", FALSE);
502
settings.removeEntry("/psi/username");
503
settings.removeEntry("/psi/hostname");
504
settings.removeEntry("/psi/password");
505
settings.removeEntry("/psi/port");
506
settings.removeEntry("/psi/resource");
507
settings.removeEntry("/psi/priority");
508
settings.removeEntry("/psi/opt_auto");
509
settings.removeEntry("/psi/opt_pass");
510
settings.removeEntry("/psi/opt_ssl");
511
settings.removeEntry("/psi/winx");
512
settings.removeEntry("/psi/winy");
513
settings.removeEntry("/psi/winw");
514
settings.removeEntry("/psi/winh");
515
settings.removeEntry("/psi/tog_offline");
516
settings.removeEntry("/psi/tog_away");
517
settings.removeEntry("/psi/tog_agents");
518
settings.removeEntry("/psi/OLR");
519
settings.removeEntry("/psi/lastStatusString");
520
settings.removeEntry("/psi/usesound");
521
folderkeyRemove(settings, "/psi/roster");
522
folderkeyRemove(settings, "/psi/options");
529
if(profileNew("Default")) {
530
if(pro.toFile(pathToProfileConfig("Default")))
535
QMessageBox::information(0, CAP(tr("Old settings")),
536
tr("There was an error creating a profile based on the old settings")
543
toDir.setPath(pathToProfile("Default") + "/history");
545
fromDir.setPath(g.pathHome);
547
fromDir.setPath(".");
549
entries = fromDir.entryList();
550
for(QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) {
551
if(*it == "." || *it == "..")
553
QFileInfo info(fromDir, *it);
556
if(info.extension(FALSE) != "history")
559
QString src = info.filePath();
560
QString dest = toDir.filePath(*it);
561
//printf("[%s] -> [%s]\n", src.latin1(), dest.latin1());
563
fromDir.remove(info.filePath());
567
int main(int argc, char *argv[])
569
QApplication::addLibraryPath(getResourcesDir());
570
QApplication *app = new QApplication(argc, argv);
576
trans = new QTranslator(0);
577
app->installTranslator(trans);
579
PsiMain *psi = new PsiMain;
580
QObject::connect(psi, SIGNAL(quit()), app, SLOT(quit()));