1 /***************************************************************************
2 * Copyright (C) 1992-2007 Trolltech ASA *
4 * Copyright (C) 2005-2007 by Tarek Saidi *
5 * tarek.saidi@arcor.de *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; version 2 of the License. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the *
18 * Free Software Foundation, Inc., *
19 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
20 ***************************************************************************/
23 #include "mainwindow.h"
24 #if defined(Q_WS_X11) && defined(GLOBAL_AUTOTYPE)
25 #include "Application_X11.h"
28 #include "plugins/interfaces/IFileDialog.h"
29 #include "plugins/interfaces/IKdeInit.h"
30 #include "plugins/interfaces/IGnomeInit.h"
32 //#include <QPluginLoader>
41 QString PluginLoadError;
42 QString DetailViewTemplate;
44 bool EventOccurredBlock = false;
47 IIconTheme* IconLoader=NULL;
50 int main(int argc, char **argv)
52 setlocale(LC_CTYPE, "");
54 #if defined(Q_WS_X11) && defined(AUTOTYPE)
55 QApplication* app = new KeepassApplication(argc,argv);
57 QApplication* app = new QApplication(argc,argv);
59 EventListener* eventListener = new EventListener();
60 app->installEventFilter(eventListener);
62 QApplication::setQuitOnLastWindowClosed(false);
64 AppDir = QApplication::applicationFilePath();
65 AppDir.truncate(AppDir.lastIndexOf("/"));
67 DataDir = AppDir+"/../share/keepassx";
68 if (!QFile::exists(DataDir) && QFile::exists(AppDir+"/share"))
69 DataDir = AppDir+"/share";
70 const char* env = getenv("XDG_CONFIG_HOME");
72 HomeDir = QDir::homePath() + "/.config";
75 QString qenv = QTextCodec::codecForLocale()->toUnicode(env);
79 HomeDir = QDir::homePath() + '/' + qenv;
81 HomeDir += "/keepassx";
82 #elif defined(Q_WS_MAC)
83 HomeDir = QDir::homePath()+"/.keepassx";
84 DataDir = AppDir+"/../Resources/keepassx";
86 HomeDir = qtWindowsConfigPath(CSIDL_APPDATA);
87 if(!HomeDir.isEmpty() && QFile::exists(HomeDir))
88 HomeDir = QDir::fromNativeSeparators(HomeDir)+"/KeePassX";
90 HomeDir = QDir::homePath()+"/KeePassX";
92 DataDir = AppDir+"/share";
94 DataDir = QDir::cleanPath(DataDir);
97 if ( !args.parse(QApplication::arguments()) ){
98 qCritical("%s\n", CSTR( args.error() ));
109 if(args.configLocation().isEmpty()){
110 if(!QDir(HomeDir).exists()){
111 QDir conf(QDir::homePath());
112 if(!QDir().mkpath(HomeDir))
113 qWarning("Warning: Could not create directory '%s'", CSTR(HomeDir));
115 IniFilename=HomeDir+"/config.ini";
118 IniFilename=args.configLocation();
122 QString OldHomeDir = QDir::homePath()+"/.keepassx";
123 if (args.configLocation().isEmpty() && QFile::exists(OldHomeDir+"/config") && !QFile::exists(HomeDir+"/config")) {
124 QFile::rename(OldHomeDir+"/config", HomeDir+"/config.ini");
125 if (QDir(OldHomeDir).entryList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System).count()==0)
126 QDir().rmdir(OldHomeDir);
130 if (args.configLocation().isEmpty() && QFile::exists(HomeDir+"/config") && !QFile::exists(HomeDir+"/config.ini"))
131 QFile::rename(HomeDir+"/config", HomeDir+"/config.ini");
133 config = new KpxConfig(IniFilename);
134 fileDlgHistory.load();
139 if(config->integrPlugin()!=KpxConfig::NoIntegr){
140 QString LibName="libkeepassx-";
141 if(config->integrPlugin()==KpxConfig::KDE)
143 else if(config->integrPlugin()==KpxConfig::Gnome)
145 QString filename=findPlugin(LibName);
146 if(filename!=QString()){
147 QPluginLoader plugin(filename);
149 PluginLoadError=plugin.errorString();
150 qWarning("Could not load desktop integration plugin:");
151 qWarning("%s", CSTR(PluginLoadError));
154 QObject *plugininstance=plugin.instance();
155 IFileDialog* fdlg=qobject_cast<IFileDialog*>(plugininstance);
156 IconLoader=qobject_cast<IIconTheme*>(plugininstance);
157 if(IconLoader==NULL){
158 qWarning("Error: Integration Plugin: Could not initialize IconTheme interface.");
160 KpxFileDialogs::setPlugin(fdlg);
161 if(config->integrPlugin()==KpxConfig::KDE){
162 IKdeInit* kdeinit=qobject_cast<IKdeInit*>(plugin.instance());
163 app=kdeinit->getMainAppObject(argc,argv);
164 if(!app) PluginLoadError = "Initialization failed.";
166 if(config->integrPlugin()==KpxConfig::Gnome){
167 IGnomeInit* ginit=qobject_cast<IGnomeInit*>(plugin.instance());
168 if(!ginit->init(argc,argv)){
169 KpxFileDialogs::setPlugin(NULL);
170 qWarning("GtkIntegrPlugin: Gtk init failed.");
171 PluginLoadError = "Initialization failed.";
177 qWarning(CSTR(QString("Could not load desktop integration plugin: File '%1' not found.").arg(LibName)));
178 PluginLoadError=QApplication::translate("Main", "Could not locate library file.");
184 DetailViewTemplate=config->detailViewTemplate();
187 KpxBookmarks::load();
188 initYarrow(); //init random number generator
189 SecString::generateSessionKey();
194 QApplication::processEvents();
195 if (args.file().isEmpty() && !eventListener->file().isEmpty()) {
196 args.setFile(eventListener->file());
200 KeepassMainWindow *mainWin = new KeepassMainWindow(args.file(), args.startMinimized(), args.startLocked());
202 eventListener->setMainWin(mainWin);
207 delete eventListener;
209 fileDlgHistory.save();
210 SecString::deleteSessionKey();
219 QPixmap tmpImg(getImageFile("clientic.png"));
220 EntryIcons=new QPixmap[BUILTIN_ICONS];
221 for(int i=0;i<BUILTIN_ICONS;i++){
222 EntryIcons[i]=tmpImg.copy(i*16,0,16,16);
230 CmdLineArgs::CmdLineArgs(){
231 StartMinimized=false;
236 bool CmdLineArgs::parse(const QStringList& argv){
237 for(int i=1;i<argv.size();i++){
238 if(argv[i]=="-help" || argv[i]=="--help" || argv[i]=="-h"){
240 break; // break, because other arguments will be ignored anyway
243 if(argv.size() == i+1){
244 Error="Missing argument for '-cfg'.";
247 if(argv[i+1].left(1)=="-"){
248 Error=QString("Expected a path as argument for '-cfg' but got '%1.'").arg(argv[i+1]);
251 QFileInfo file(argv[i+1]);
252 ConfigLocation=file.absoluteFilePath();
260 if(argv[i]=="-lock"){
264 if(i==1 && argv[i].left(1)!="-"){
268 Error=QString("** Unrecognized argument: '%1'").arg(argv[i]);
274 void CmdLineArgs::printHelp(){
275 cerr << "KeePassX " << APP_VERSION << endl;
276 cerr << "Usage: keepassx [filename] [options]" << endl;
277 cerr << " -help This Help" << endl;
278 cerr << " -cfg <CONFIG> Use specified file for loading/saving the configuration." << endl;
279 cerr << " -min Start minimized." << endl;
280 cerr << " -lock Start locked." << endl;
284 /*QString findPlugin(const QString& filename){
286 info.setFile(AppDir+"/../lib/"+filename);
287 if(info.exists() && info.isFile())
288 return AppDir+"/../lib/"+filename;
293 bool EventListener::eventFilter(QObject*, QEvent* event){
295 int t = event->type();
296 if ( (t>=QEvent::MouseButtonPress && t<=QEvent::KeyRelease) || (t>=QEvent::HoverEnter && t<=QEvent::HoverMove) )
297 EventOccurred = true;
301 if (event->type() == QEvent::FileOpen) {
302 QString filename = static_cast<QFileOpenEvent*>(event)->file();
304 if (QApplication::activeModalWidget() == NULL)
305 pMainWindow->openFile(filename);
307 return true; // ignore file open events while a modal dialog is displayed