3
* TOra - An Oracle Toolkit for DBA's and developers
4
* Copyright (C) 2003-2005 Quest Software, Inc
5
* Portions Copyright (C) 2005 Other Contributors
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License
9
* as published by the Free Software Foundation; only version 2 of
10
* the License is valid for this program.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21
* As a special exception, you have permission to link this program
22
* with the Oracle Client libraries and distribute executables, as long
23
* as you follow the requirements of the GNU GPL in regard to all of the
24
* software in the executable aside from Oracle client libraries.
26
* Specifically you are not permitted to link this program with the
27
* Qt/UNIX, Qt/Windows or Qt Non Commercial products of TrollTech.
28
* And you are not permitted to distribute binaries compiled against
29
* these libraries without written consent from Quest Software, Inc.
30
* Observe that this does not disallow linking to the Qt Free Edition.
32
* You may link this product with any GPL'd Qt library such as Qt/Free
34
* All trademarks belong to their respective owners.
41
#include "toconnection.h"
42
#include "tonewconnection.h"
44
#include "toresultview.h"
47
#include <qbuttongroup.h>
48
#include <qcheckbox.h>
49
#include <qcombobox.h>
51
#include <qinputdialog.h>
54
#include <qlineedit.h>
55
#include <qlistview.h>
56
#include <qmessagebox.h>
57
#include <qpopupmenu.h>
58
#include <qpushbutton.h>
63
#include <qwhatsthis.h>
66
# include "windows/cregistry.h"
69
#ifdef TO_KDE_KACCELMANAGER
70
# include <kaccelmanager.h>
73
#include "tonewconnection.moc"
74
#include "tonewconnectionui.moc"
76
toNewConnection::toNewConnection(QWidget* parent, const char* name, bool modal, WFlags fl)
77
: toNewConnectionUI(parent, name, modal, fl),
78
toHelpContext(QString::fromLatin1("newconnection.html"))
80
toHelp::connectDialog(this);
82
OptionGroup->setColumnLayout(0, Qt::Vertical );
83
OptionGroup->layout()->setSpacing( 6 );
84
OptionGroup->layout()->setMargin( 11 );
85
OptionGroupLayout = new QVBoxLayout( OptionGroup->layout() );
86
OptionGroupLayout->setAlignment( Qt::AlignTop );
87
#ifdef TO_KDE_KACCELMANAGER
88
KAcceleratorManager::setNoAccel( OptionGroup );
91
QPopupMenu *menu = new QPopupMenu(Previous);
92
Database->insertItem(toConfigurationSingle::Instance().globalConfig(CONF_DATABASE, DEFAULT_DATABASE));
93
Previous->addColumn(tr("Provider"));
94
Previous->addColumn(tr("Host"));
95
Previous->addColumn(tr("Database"));
96
Previous->addColumn(tr("Username"));
97
Previous->setSelectionMode(QListView::Single);
98
Previous->setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding));
99
menu->insertItem("Delete", TONEWCONNECTION_DELETE);
100
connect(menu, SIGNAL(activated(int)), this, SLOT(menuCallback(int)));
101
Previous->setDisplayMenu(menu);
102
connect(Previous, SIGNAL(selectionChanged()), this, SLOT(historySelection()));
103
connect(Previous, SIGNAL(doubleClicked(QListViewItem *)), this, SLOT(historyConnect()));
104
std::list<QCString> lst = toConnectionProvider::providers();
105
int sel = 0, cur = 0;
106
QCString provider = toConfigurationSingle::Instance().globalConfig(CONF_PROVIDER, DEFAULT_PROVIDER).latin1();
107
for (std::list<QCString>::iterator i = lst.begin();i != lst.end();i++)
109
Provider->insertItem(QString::fromLatin1(*i));
116
TOMessageBox::information(this,
117
tr("No connection provider"),
118
tr("No available connection provider, plugins probably missing"));
122
Provider->setCurrentItem(sel);
124
processOptions(toConfigurationSingle::Instance().globalConfig(CONF_OPTIONS, DEFAULT_OPTIONS));
126
QString host = toConfigurationSingle::Instance().globalConfig(CONF_HOST, DEFAULT_HOST);
128
int portix = host.find(":");
131
Host->lineEdit()->setText(host.mid(0, portix));
132
Port->setValue(host.mid(portix + 1).toInt());
135
Host->lineEdit()->setText(host);
137
Username->setText(toConfigurationSingle::Instance().globalConfig(CONF_USER, DEFAULT_USER));
138
Username->setFocus();
140
bool pass = toConfigurationSingle::Instance().globalConfig(CONF_SAVE_PWD, DEFAULT_SAVE_PWD).isEmpty();
142
Password->setText(QString::fromLatin1(DEFAULT_PASSWORD));
144
Password->setText(toUnobfuscate(toConfigurationSingle::Instance().globalConfig(CONF_PASSWORD, DEFAULT_PASSWORD)));
146
QString defdb = toConfigurationSingle::Instance().globalConfig(CONF_DATABASE, DEFAULT_DATABASE);
147
Database->setEditable(true);
150
int maxHist = toConfigurationSingle::Instance().globalConfig(CONF_CONNECT_CURRENT, 0).toInt();
151
Previous->setSorting( -1);
152
QListViewItem *last = NULL;
153
for (int i = 0;i < maxHist;i++)
155
QCString path = CONF_CONNECT_HISTORY;
157
path += QString::number(i).latin1();
160
QString user = toConfigurationSingle::Instance().globalConfig(tmp, "");
163
tmp += CONF_PASSWORD;
164
QString passstr = (pass ? QString::fromLatin1(DEFAULT_PASSWORD) :
165
(toUnobfuscate(toConfigurationSingle::Instance().globalConfig(tmp, DEFAULT_PASSWORD))));
169
QString host = toConfigurationSingle::Instance().globalConfig(tmp, DEFAULT_HOST);
172
tmp += CONF_DATABASE;
173
QString database = toConfigurationSingle::Instance().globalConfig(tmp, DEFAULT_DATABASE);
176
tmp += CONF_PROVIDER;
177
QString provider = toConfigurationSingle::Instance().globalConfig(tmp, DEFAULT_PROVIDER);
181
QString options = toConfigurationSingle::Instance().globalConfig(tmp, DEFAULT_OPTIONS);
183
last = new QListViewItem(Previous, last, provider, host, database, user, passstr, options);
189
toNewConnection::~toNewConnection()
192
void toNewConnection::changeProvider(void)
196
std::list<QString> hosts = toConnectionProvider::hosts(Provider->currentText().latin1());
197
QString current = Host->currentText();
203
for (std::list<QString>::iterator i = hosts.begin();i != hosts.end();i++)
207
else if ((*i).startsWith(":"))
209
DefaultPort = (*i).mid(1).toInt();
212
Host->insertItem(*i);
214
Port->setValue(DefaultPort);
229
Host->lineEdit()->setText(current);
231
for (std::list<QWidget *>::iterator k = OptionWidgets.begin();k != OptionWidgets.end();k++)
233
if ((*k)->isA("QCheckBox"))
235
QCheckBox *box = (QCheckBox *)(*k);
236
Options[box->text()] = box->isChecked();
240
OptionWidgets.clear();
242
std::list<QString> options = toConnectionProvider::options(Provider->currentText().latin1());
243
for (std::list<QString>::iterator j = options.begin();j != options.end();j++)
247
QFrame *frame = new QFrame(OptionGroup);
248
frame->setFrameShape( QFrame::HLine );
249
frame->setFrameShadow( QFrame::Sunken );
250
OptionGroupLayout->addWidget(frame);
252
OptionWidgets.insert(OptionWidgets.end(), frame);
258
if (option.startsWith("*"))
261
option = option.mid(1);
264
QCheckBox *ow = new QCheckBox(OptionGroup);
266
if (Options.find(option) != Options.end())
267
ow->setChecked((*(Options.find(option))).second);
269
ow->setChecked(defOn);
270
OptionGroupLayout->addWidget(ow);
272
OptionWidgets.insert(OptionWidgets.end(), ow);
275
if ( options.empty() )
281
catch (const QString &str)
284
toStatusMessage(str);
288
void toNewConnection::changeHost(void)
292
if (!Host->isHidden())
295
host = Host->currentText();
296
std::list<QString> databases = toConnectionProvider::databases(Provider->currentText().latin1(),
300
QString current = Database->currentText();
303
for (std::list<QString>::iterator i = databases.begin();i != databases.end();i++)
304
Database->insertItem(*i);
305
Database->lineEdit()->setText(current);
308
catch (const QString &str)
311
toStatusMessage(str);
315
void toNewConnection::processOptions(const QString &str)
317
QStringList options = QStringList::split(",", str);
318
std::map<QString, bool> values;
319
for (unsigned int i = 0;i < options.count();i++)
321
QString val = options[i];
322
if (val.startsWith("*"))
323
values[val.mid(1)] = true;
327
for (std::list<QWidget *>::iterator k = OptionWidgets.begin();k != OptionWidgets.end();k++)
329
if ((*k)->isA("QCheckBox"))
331
QCheckBox *box = (QCheckBox *)(*k);
332
if (values.find(box->text()) != values.end())
333
box->setChecked(values[box->text()]);
338
toConnection *toNewConnection::makeConnection(void)
342
toConfigurationSingle::Instance().globalSetConfig(CONF_PROVIDER, Provider->currentText());
343
toConfigurationSingle::Instance().globalSetConfig(CONF_USER, Username->text());
346
if (!Host->isHidden())
347
host = Host->currentText();
349
QString optionstring;
353
for (std::list<QWidget *>::iterator k = OptionWidgets.begin();k != OptionWidgets.end();k++)
355
if ((*k)->isA("QCheckBox"))
357
if (!optionstring.isEmpty())
359
QCheckBox *box = (QCheckBox *)(*k);
360
if (box->isChecked())
363
options.insert(box->text());
365
optionstring += box->text();
368
toConfigurationSingle::Instance().globalSetConfig(CONF_OPTIONS, optionstring);
370
std::list<QString> con = toMainWidget()->connections();
371
for (std::list<QString>::iterator i = con.begin();i != con.end();i++)
375
toConnection &conn = toMainWidget()->connection(*i);
376
if (conn.user() == Username->text() &&
377
conn.provider() == Provider->currentText().latin1() &&
378
conn.host() == host &&
379
conn.database() == Database->currentText())
385
if (Port->value() != 0 && Port->value() != DefaultPort)
386
host += ":" + QString::number(Port->value());
388
toConfigurationSingle::Instance().globalSetConfig(CONF_HOST, host);
390
toConnection *retCon = new toConnection(Provider->currentText().latin1(),
394
Database->currentText(),
397
for (QListViewItem *item = Previous->firstChild();item;item = item->nextSibling())
399
if (item->text(0) == Provider->currentText() &&
400
((item->text(1) == host) || (item->text(1).isEmpty() && host.isEmpty())) &&
401
item->text(2) == Database->currentText() &&
402
item->text(3) == Username->text())
410
if (!toConfigurationSingle::Instance().globalConfig(CONF_SAVE_PWD, DEFAULT_SAVE_PWD).isEmpty())
411
pass = retCon->password();
413
pass = DEFAULT_PASSWORD;
414
toConfigurationSingle::Instance().globalSetConfig(CONF_PASSWORD, toObfuscate(pass));
415
toConfigurationSingle::Instance().globalSetConfig(CONF_DATABASE, Database->currentText());
417
new QListViewItem(Previous, NULL,
418
Provider->currentText(),
420
Database->currentText(),
427
catch (const QString &exc)
429
QString str = tr("Unable to connect to the database.\n");
431
TOMessageBox::information(this->parentWidget(false),
432
tr("Unable to connect to the database"),
438
void toNewConnection::historySave(void)
440
int siz = toConfigurationSingle::Instance().globalConfig(CONF_CONNECT_SIZE, DEFAULT_CONNECT_SIZE).toInt();
444
for (QListViewItem *item = Previous->firstChild();i < siz;item = (item ? item = item->nextSibling() : 0))
446
QCString path = CONF_CONNECT_HISTORY;
448
path += QString::number(i).latin1();
451
tmp += CONF_PROVIDER;
453
toConfigurationSingle::Instance().globalSetConfig(tmp, item->text(0));
455
toConfigurationSingle::Instance().globalEraseConfig(tmp);
460
toConfigurationSingle::Instance().globalSetConfig(tmp, item->text(1));
462
toConfigurationSingle::Instance().globalEraseConfig(tmp);
465
tmp += CONF_DATABASE;
467
toConfigurationSingle::Instance().globalSetConfig(tmp, item->text(2));
469
toConfigurationSingle::Instance().globalEraseConfig(tmp);
474
toConfigurationSingle::Instance().globalSetConfig(tmp, item->text(3));
476
toConfigurationSingle::Instance().globalEraseConfig(tmp);
479
tmp += CONF_PASSWORD;
481
toConfigurationSingle::Instance().globalSetConfig(tmp, toObfuscate(item->text(4)));
483
toConfigurationSingle::Instance().globalEraseConfig(tmp);
488
toConfigurationSingle::Instance().globalSetConfig(tmp, item->text(5));
490
toConfigurationSingle::Instance().globalEraseConfig(tmp);
496
toConfigurationSingle::Instance().globalSetConfig(CONF_CONNECT_CURRENT, QString::number(j));
497
toConfigurationSingle::Instance().saveConfig();
500
void toNewConnection::historySelection(void)
502
QListViewItem *item = Previous->selectedItem();
505
for (int i = 0;i < Provider->count();i++)
506
if (Provider->text(i) == item->text(0))
508
Provider->setCurrentItem(i);
513
QString host = item->text(1);
514
int portix = host.find(":");
517
Host->lineEdit()->setText(host.mid(0, portix));
518
Port->setValue(host.mid(portix + 1).toInt());
522
Host->lineEdit()->setText(host);
523
Port->setValue(DefaultPort);
526
processOptions(item->text(5));
528
Database->lineEdit()->setText(item->text(2));
529
Username->setText(item->text(3));
530
if (item->text(4) != DEFAULT_PASSWORD)
531
Password->setText(item->text(4));
535
void toNewConnection::historyConnect(void)
538
if (toConfigurationSingle::Instance().globalConfig(CONF_SAVE_PWD, DEFAULT_SAVE_PWD).isEmpty())
541
QString name = QInputDialog::getText(tr("Enter password"),
542
tr("Enter password to use for connection."),
543
QLineEdit::Password, QString::null, &ok, this);
545
Password->setText(name);
550
void toNewConnection::menuCallback(int cmd)
554
case TONEWCONNECTION_DELETE:
562
void toNewConnection::historyDelete()
564
QListViewItem *item = Previous->selectedItem();
567
Previous->takeItem(item);