diff --git a/src/Database.cpp b/src/Database.cpp index e69a59e..77670d9 100644 --- a/src/Database.cpp +++ b/src/Database.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2005 by Tarek Saidi * - * mail@tarek-saidi.de * + * Copyright (C) 2005-2007 by Tarek Saidi * + * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -87,18 +87,19 @@ else return date().toString(format); CEntry::CEntry(){ -Image=0; -GroupId=0; -Creation=QDateTime::currentDateTime(); -LastMod=QDateTime::currentDateTime(); -LastAccess=QDateTime::currentDateTime(); -Expire=QDateTime(QDate(2999,12,28),QTime(23,59,59)); //Never -Binary=QByteArray(); + Image=0; + GroupId=0; + Creation=QDateTime::currentDateTime(); + LastMod=QDateTime::currentDateTime(); + LastAccess=QDateTime::currentDateTime(); + Expire=QDateTime(QDate(2999,12,28),QTime(23,59,59)); //Never + Binary=QByteArray(); } CGroup::CGroup(){ -Image=0; + Image=0; + IsExpanded=false; } diff --git a/src/Database.h b/src/Database.h index 7c63f94..58d0150 100644 --- a/src/Database.h +++ b/src/Database.h @@ -103,6 +103,7 @@ public: quint32 Image; QString Title; bool operator==(const CGroup& other) const; + bool IsExpanded; }; @@ -144,14 +145,25 @@ public: virtual KpxDateTime expire()=0; virtual QByteArray binary()=0; virtual quint32 binarySize()=0; + //! \return the index of the entry amongst the entries of its group. The index of the first entry is 0. - virtual int index()const=0; + virtual int visualIndex()const=0; + + /*! Sets the visual index of an entry. The indices of all other entries in the same group get automaticly readjusted by this function. + \param index The new visual index. + */ + virtual void setVisualIndex(int index)=0; + + /*! Sets the visual index of an entry. The indices of all other entries in the same group need to be adjusted manually! + This function is optimal to avoid readjustion overhead when sorting items. + \param index The new visual index. + */ + virtual void setVisualIndexDirectly(int index)=0; /*! Tests the validity of the handle. \return TRUE if the handle is valid and FALSE if the handle is invalid e.g. because the associated entry was deleted.*/ virtual bool isValid()const=0; - - virtual bool operator<(const IEntryHandle*& other)=0; + }; @@ -218,6 +230,9 @@ public: /*! \return the level of the group in the group tree. This level is tantamount to the number of parents that the group has. */ virtual int level()=0; + + virtual bool expanded()=0; + virtual void setExpanded(bool)=0; }; @@ -225,7 +240,7 @@ public: /*! This is the common base interface for databases. Every database class must implement this interface necessarily. */ -class IDatabase{ +class IDatabase:public QObject{ public: virtual ~IDatabase(){}; diff --git a/src/StandardDatabase.cpp b/src/StandardDatabase.cpp index 6e4cba0..a6a3a70 100644 --- a/src/StandardDatabase.cpp +++ b/src/StandardDatabase.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * keepassx@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -17,6 +17,7 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ + #include "global.h" #include #include @@ -38,6 +39,19 @@ using namespace std; #define UNEXP_ERROR error=QString("Unexpected error in: %1, Line:%2").arg(__FILE__).arg(__LINE__); const QDateTime Date_Never(QDate(2999,12,28),QTime(23,59,59)); + + +bool EntryHandleLessThan(const IEntryHandle* This,const IEntryHandle* Other){ + if(!This->isValid() && Other->isValid())return true; + if(This->isValid() && !Other->isValid())return false; + if(!This->isValid() && !Other->isValid())return false; + return This->visualIndex()visualIndex(); + +} + +bool StdEntryLessThan(const StandardDatabase::StdEntry& This,const StandardDatabase::StdEntry& Other){ + return This.Index dta.size()){ - CustomIcons.clear(); - return false;} - offset+=4; - if(!CustomIcons.back().loadFromData((const unsigned char*)dta.data()+offset,Size,"PNG")){ - CustomIcons.clear(); - return false;} - offset+=Size; - if(offset > dta.size()){ - CustomIcons.clear(); - return false;} -} -for(int i=0;iOldImage=entry->Image; - entry->Image=Icon; +void StandardDatabase::parseCustomIconsMetaStream(const QByteArray& dta){ + //Rev 3 + quint32 NumIcons,NumEntries,NumGroups,offset; + memcpyFromLEnd32(&NumIcons,dta.data()); + memcpyFromLEnd32(&NumEntries,dta.data()+4); + memcpyFromLEnd32(&NumGroups,dta.data()+8); + offset=12; + CustomIcons.clear(); + for(int i=0;i dta.size()){ + CustomIcons.clear(); + qWarning("Discarded metastream KPX_CUSTOM_ICONS_3 because of a parsing error."); + return;} + offset+=4; + if(!CustomIcons.back().loadFromData((const unsigned char*)dta.data()+offset,Size,"PNG")){ + CustomIcons.clear(); + qWarning("Discarded metastream KPX_CUSTOM_ICONS_3 because of a parsing error."); + return;} + offset+=Size; + if(offset > dta.size()){ + CustomIcons.clear(); + qWarning("Discarded metastream KPX_CUSTOM_ICONS_3 because of a parsing error."); + return;} } -} -for(int i=0;iOldImage=Group->Image; - Group->Image=Icon; + for(int i=0;iOldImage=entry->Image; + entry->Image=Icon; + } + } + for(int i=0;iOldImage=Group->Image; + Group->Image=Icon; + } + } + return; +} + +void StandardDatabase::parseGroupTreeStateMetaStream(const QByteArray& dta){ + if(dta.size()<4){qWarning("Discarded metastream KPX_GROUP_TREE_STATE because of a parsing error."); return;} + quint32 Num; + memcpyFromLEnd32(&Num,dta.data()); + if(Num*5!=dta.size()-4){qWarning("Discarded metastream KPX_GROUP_TREE_STATE because of a parsing error."); return;} + TreeStateMetaStream.clear(); + for(int i=0;iBinaryDesc="bin-stream"; + e->Title="Meta-Info"; + e->Username="SYSTEM"; + e->Comment="KPX_GROUP_TREE_STATE"; + e->Url="$"; + e->OldImage=0; + e->Image=0; + if(Groups.size())e->GroupId=Groups[0].Id; + QByteArray bin; + quint32 Num=Groups.size(); + bin.resize(Num*5+4); + memcpyToLEnd32(bin.data(),&Num); + for(int i=0;iBinary=bin; } StandardDatabase::StdEntry* StandardDatabase::getEntry(const KpxUuid& uuid){ @@ -319,11 +380,16 @@ bool StandardDatabase::createGroupTree(QList& Levels){ Groups[i].Parent->Childs.append(&Groups[i]); } + QList EntryIndexCounter; + for(int i=0;ivalue("GroupTreeState","ExpandAll")=="ExpandAll"){ + for(int i=0;ivalue("GroupTreeState","ExpandAll")=="Restore"){ + for(int i=0;i StandardDatabase::entries(){ return handles; } -bool StandardDatabase::EntryHandle::operator<(const IEntryHandle*& other){ - if(!isValid() && other->isValid())return true; - if(isValid() && !other->isValid())return false; - if(!isValid() && !other->isValid())return false; - return index()index(); -} - QList StandardDatabase::entries(IGroupHandle* group){ QList handles; for(int i=0; ititle().toUtf8().data(),(int)h->isValid());} + return handles; } @@ -859,9 +937,18 @@ KpxDateTime StandardDatabase::EntryHandle::lastAccess(){return Entry->LastAccess KpxDateTime StandardDatabase::EntryHandle::expire(){return Entry->Expire;} QByteArray StandardDatabase::EntryHandle::binary(){return Entry->Binary;} quint32 StandardDatabase::EntryHandle::binarySize(){return Entry->Binary.size();} -int StandardDatabase::EntryHandle::index()const{return Entry->Index;} +int StandardDatabase::EntryHandle::visualIndex()const{return Entry->Index;} +void StandardDatabase::EntryHandle::setVisualIndexDirectly(int i){Entry->Index=i;} bool StandardDatabase::EntryHandle::isValid()const{return valid;} +void StandardDatabase::EntryHandle::setVisualIndex(int index){ + QListEntries=pDB->entries(Entry->Group->Handle); + Entries.move(visualIndex(),index); + for(int i=0;i(Entries[i])->Entry->Index=index; + } +} + StandardDatabase::EntryHandle::EntryHandle(StandardDatabase* db){ pDB=db; ListIndex=0; @@ -876,8 +963,8 @@ quint32 StandardDatabase::GroupHandle::oldImage(){return Group->OldImage;} quint32 StandardDatabase::GroupHandle::image(){return Group->Image;} int StandardDatabase::GroupHandle::index(){return Group->Index;} void StandardDatabase::GroupHandle::setTitle(const QString& Title){Group->Title=Title;} - - +void StandardDatabase::GroupHandle::setExpanded(bool IsExpanded){Group->IsExpanded=IsExpanded;} +bool StandardDatabase::GroupHandle::expanded(){return Group->IsExpanded;} void StandardDatabase::GroupHandle::setImage(const quint32& New) { if(Group->Image < pDB->builtinIcons() && New >= pDB->builtinIcons()) @@ -1003,6 +1090,8 @@ bool StandardDatabase::save(){ QList MetaStreams; MetaStreams << StdEntry(); createCustomIconsMetaStream(&MetaStreams.back()); + MetaStreams << StdEntry(); + createGroupTreeStateMetaStream(&MetaStreams.back()); FileSize=DB_HEADER_SIZE; // Get the size of all groups (94 Byte + length of the name string) @@ -1048,7 +1137,9 @@ bool StandardDatabase::save(){ else if(Algorithm == Twofish_Cipher) Flags |= PWM_FLAG_TWOFISH; Version = PWM_DBVER_DW; NumGroups = Groups.size(); - NumEntries = Entries.size()+UnknownMetaStreams.size()+1; + NumEntries = Entries.size()+UnknownMetaStreams.size()+MetaStreams.size(); + + qSort(Entries.begin(),Entries.end(),StdEntryLessThan); randomize(FinalRandomSeed,16); randomize(TransfRandomSeed,32); diff --git a/src/StandardDatabase.h b/src/StandardDatabase.h index fad36f9..63171c1 100644 --- a/src/StandardDatabase.h +++ b/src/StandardDatabase.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * keepassx@gmail.com * * * * This program is free software; you can redistribute it and/or modify * @@ -38,6 +38,7 @@ #include #include #include +#include #include "lib/SecString.h" #include "Database.h" @@ -73,7 +74,9 @@ public: virtual KpxUuid uuid(); virtual IGroupHandle* group(); virtual quint32 image(); - virtual int index() const; + virtual int visualIndex() const; + virtual void setVisualIndex(int i); + virtual void setVisualIndexDirectly(int i); quint32 oldImage(); virtual QString title(); virtual QString url(); @@ -88,7 +91,6 @@ public: virtual QByteArray binary(); virtual quint32 binarySize(); virtual bool isValid() const; - virtual bool operator<(const IEntryHandle*& other); private: void invalidate(){valid=false;} bool valid; @@ -113,6 +115,8 @@ public: virtual int index(); virtual void setIndex(int index); virtual int level(); + virtual bool expanded(); + virtual void setExpanded(bool IsExpanded); private: void invalidate(){valid=false;} bool valid; @@ -193,9 +197,12 @@ private: void dateToPackedStruct5(const QDateTime& datetime, unsigned char* dst); bool isMetaStream(StdEntry& Entry); bool parseMetaStream(const StdEntry& Entry); - bool parseCustomIconsMetaStream(const QByteArray& data); + void parseCustomIconsMetaStream(const QByteArray& data); bool parseCustomIconsMetaStreamV1(const QByteArray& data); bool parseCustomIconsMetaStreamV2(const QByteArray& data); + void parseGroupTreeStateMetaStream(const QByteArray& data); + void createCustomIconsMetaStream(StdEntry* e); + void createGroupTreeStateMetaStream(StdEntry* e); bool readEntryField(StdEntry* entry, quint16 FieldType, quint32 FieldSize, quint8 *pData); bool readGroupField(StdGroup* group,QList& Levels,quint16 FieldType, quint32 FieldSize, quint8 *pData); bool createGroupTree(QList& Levels); @@ -206,12 +213,12 @@ private: quint32 getNewGroupId(); void serializeEntries(QList& EntryList,char* buffer,unsigned int& pos); void serializeGroups(QList& GroupList,char* buffer,unsigned int& pos); - void createCustomIconsMetaStream(StdEntry* e); void appendChildsToGroupList(QList& list,StdGroup& group); void appendChildsToGroupList(QList& list,StdGroup& group); bool searchStringContains(const QString& search, const QString& string,bool Cs, bool RegExp); void getEntriesRecursive(IGroupHandle* Group, QList& EntryList); void rebuildIndices(QList& list); + void restoreGroupTreeState(); StdEntry* getEntry(const KpxUuid& uuid); StdEntry* getEntry(EntryHandle* handle); @@ -231,6 +238,7 @@ private: QString error; bool KeyError; QList UnknownMetaStreams; + QMap TreeStateMetaStream; unsigned int KeyTransfRounds; CryptAlgorithm Algorithm; quint8 RawMasterKey[32]; diff --git a/src/dialogs/PasswordDlg.cpp b/src/dialogs/PasswordDlg.cpp index bdae78f..8b6ed9d 100755 --- a/src/dialogs/PasswordDlg.cpp +++ b/src/dialogs/PasswordDlg.cpp @@ -18,9 +18,6 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "main.h" -#include "PwmConfig.h" -#include "PasswordDlg.h" #include #include #include @@ -29,6 +26,12 @@ #include #include #include +#include + +#include "main.h" +#include "PwmConfig.h" +#include "PasswordDlg.h" +#include "lib/FileDialogs.h" CPasswordDialog::CPasswordDialog(QWidget* parent,IDatabase* DB,bool ShowExitButton,bool ChangeKeyMode) @@ -127,27 +130,23 @@ void CPasswordDialog::setStateBoth(){ void CPasswordDialog::OnButtonBrowse() { - QFileDialog FileDlg(this,tr("Select a Key File"),QDir::homePath()); - FileDlg.setFilters(QStringList()<setEditText(FileDlg.selectedFiles()[0]); - return; + QString filename=KpxFileDialogs::openExistingFile(this,"PasswordDlg",tr("Select a Key File"), + QStringList() << tr("All Files (*)") << tr("Key Files (*.key)")); + if(filename!=QString()){ + Combo_Dirs->setEditText(filename); } - QMessageBox::warning(this,tr("Error"),tr("Unexpected Error: File does not exist."),tr("OK"),"","",0,0); + return; } void CPasswordDialog::OnButtonBrowse_Set() { - QFileDialog FileDlg(this,tr("Select a Key File"),QDir::homePath()); - FileDlg.setFilters(QStringList()<setEditText(FileDlg.selectedFiles()[0]); + QString filename=KpxFileDialogs::saveFile(this,"PasswordDlg",tr("Select a Key File"), + QStringList() << tr("All Files (*)") << tr("Key Files (*.key)"), + false); + if(filename!=QString()){ + Combo_Dirs->setEditText(filename); + } + return; } void CPasswordDialog::OnCancel() diff --git a/src/dialogs/SettingsDlg.cpp b/src/dialogs/SettingsDlg.cpp index 31622a9..cb6f9d2 100755 --- a/src/dialogs/SettingsDlg.cpp +++ b/src/dialogs/SettingsDlg.cpp @@ -107,6 +107,10 @@ CSettingsDlg::CSettingsDlg(QWidget* parent):QDialog(parent,Qt::Dialog) case CConfig::KDE: Radio_IntPlugin_Kde->setChecked(true); break; } + if(settings->value("GroupTreeState","ExpandAll")=="ExpandAll")Radio_GroupTreeExpand->setChecked(true); + if(settings->value("GroupTreeState","ExpandAll")=="Restore")Radio_GroupTreeRestore->setChecked(true); + if(settings->value("GroupTreeState","ExpandAll")=="ExpandNone")Radio_GroupTreeDoNothing->setChecked(true); + if(!PluginsModified) Label_IntPlugin_Info->hide(); } @@ -167,6 +171,11 @@ void CSettingsDlg::apply(){ if(Radio_IntPlugin_None->isChecked())config.IntegrPlugin=CConfig::NONE; if(Radio_IntPlugin_Gnome->isChecked())config.IntegrPlugin=CConfig::GNOME; if(Radio_IntPlugin_Kde->isChecked())config.IntegrPlugin=CConfig::KDE; + + if(Radio_GroupTreeExpand->isChecked())settings->setValue("GroupTreeState","ExpandAll"); + if(Radio_GroupTreeDoNothing->isChecked())settings->setValue("GroupTreeState","ExpandNone"); + if(Radio_GroupTreeRestore->isChecked())settings->setValue("GroupTreeState","Restore"); + } void CSettingsDlg::OnTextColor() diff --git a/src/export/Export_Txt.cpp b/src/export/Export_Txt.cpp index 7c605f6..f4d9cd1 100644 --- a/src/export/Export_Txt.cpp +++ b/src/export/Export_Txt.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -21,9 +21,9 @@ #include #include #include "main.h" -#include "../lib/SecString.h" +#include "lib/SecString.h" #include "Export_Txt.h" -/* + QString EntryTemplate=QString("\n\ Title: %1\n\ @@ -37,27 +37,22 @@ QString GroupTemplate=QString("\n\ *** Group: %1 ***\n\ "); -bool Export_Txt::exportFile(const QString& filename,StandardDatabase* db,QString& err){ -QFile file(filename); -if(!file.open(QIODevice::Truncate | QIODevice::WriteOnly)){ - err+=tr("Could not open file (FileError=%1)").arg(file.error()); - return false; -} - -for(int g=0;gnumGroups();g++){ - file.write(GroupTemplate.arg(db->group(g).Name).toUtf8()); - for(int e=0;enumEntries();e++){ - if(db->group(g).ID==db->entry(e).GroupID){ - db->entry(e).Password.unlock(); - file.write(EntryTemplate.arg(db->entry(e).Title) - .arg(db->entry(e).UserName) - .arg(db->entry(e).URL) - .arg(db->entry(e).Password.string()) - .arg(db->entry(e).Additional.replace('\n',"\n ")) +QString Export_Txt::exportDatabase(QWidget* GuiParent, IDatabase* db, QIODevice* file){ + QList groups=db->sortedGroups(); + for(int g=0;gwrite(GroupTemplate.arg(groups[g]->title()).toUtf8()); + QList entries=db->entries(groups[g]); + for(int e=0;epassword(); + password.unlock(); + file->write(EntryTemplate.arg(entries[e]->title()) + .arg(entries[e]->username()) + .arg(entries[e]->url()) + .arg(password.string()) + .arg(entries[e]->comment().replace('\n',"\n ")) .toUtf8()); - db->entry(e).Password.lock(); + password.lock(); } } -} -file.close(); -}*/ \ No newline at end of file + return QString(); +} \ No newline at end of file diff --git a/src/export/Export_Txt.h b/src/export/Export_Txt.h index 4c07eef..12b2386 100644 --- a/src/export/Export_Txt.h +++ b/src/export/Export_Txt.h @@ -19,13 +19,14 @@ ***************************************************************************/ #ifndef _EXPORT_TXT_H_ #define _EXPORT_TXT_H_ -#include -#include "StandardDatabase.h" -class Export_Txt:public QObject{ -public: - bool exportFile(const QString& filename,StandardDatabase* db,QString& err); +#include +#include "IExport.h" +class Export_Txt:public QObject, public IExport{ + public: + virtual QString exportDatabase(QWidget* GuiParent, IDatabase* Database, QIODevice* Dest); + virtual QString name(){return QString("Txt");} }; #endif diff --git a/src/forms/MainWindow.ui b/src/forms/MainWindow.ui index 8216a18..835973e 100644 --- a/src/forms/MainWindow.ui +++ b/src/forms/MainWindow.ui @@ -77,9 +77,6 @@ false - - true - diff --git a/src/forms/SettingsDlg.ui b/src/forms/SettingsDlg.ui index 1aa130b..2b2f071 100644 --- a/src/forms/SettingsDlg.ui +++ b/src/forms/SettingsDlg.ui @@ -62,7 +62,7 @@ QTabWidget::Rounded - 3 + 4 @@ -915,6 +915,13 @@ + + + + Verify database content and structure after saving + + + diff --git a/src/import/Import_KWalletXml.h b/src/import/Import_KWalletXml.h index 86201be..da133f4 100755 --- a/src/import/Import_KWalletXml.h +++ b/src/import/Import_KWalletXml.h @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2005 by Tarek Saidi * - * mail@tarek-saidi.de * + * Copyright (C) 2007 by Tarek Saidi * + * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -17,6 +17,7 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ + #ifndef _IMPORT_KWALLET_H_ #define _IMPORT_KWALLET_H_ #include diff --git a/src/lib/EntryView.cpp b/src/lib/EntryView.cpp index 7c5be15..218d7b7 100644 --- a/src/lib/EntryView.cpp +++ b/src/lib/EntryView.cpp @@ -47,9 +47,11 @@ KeepassEntryView::KeepassEntryView(QWidget* parent):QTreeWidget(parent){ updateColumns(); header()->setResizeMode(QHeaderView::Interactive); header()->setStretchLastSection(false); + header()->setClickable(true); connect(header(),SIGNAL(sectionResized(int,int,int)),this,SLOT(OnColumnResized(int,int,int))); connect(this,SIGNAL(itemSelectionChanged()),this,SLOT(OnItemsChanged())); connect(&ClipboardTimer, SIGNAL(timeout()), this, SLOT(OnClipboardTimeOut())); + connect(header(),SIGNAL(sectionClicked(int)),this,SLOT(OnHeaderSectionClicked(int))); Clipboard=QApplication::clipboard(); ContextMenu=new QMenu(this); setAlternatingRowColors(config.AlternatingRowColors); @@ -82,6 +84,22 @@ void KeepassEntryView::OnItemsChanged(){ } } +void KeepassEntryView::OnHeaderSectionClicked(int index){ + if(header()->isSortIndicatorShown() && header()->sortIndicatorSection()==index){ + header()->setSortIndicator(index,header()->sortIndicatorOrder() ? Qt::DescendingOrder : Qt::AscendingOrder); + sortItems(index,header()->sortIndicatorOrder()); + } + else{ + header()->setSortIndicator(index,Qt::AscendingOrder); + header()->setSortIndicatorShown(true); + sortItems(index,Qt::AscendingOrder); + } + + for(int i=0;iEntryHandle->setVisualIndexDirectly(indexOfTopLevelItem(Items[i])); + } +} + void KeepassEntryView::OnSaveAttachment(){ Q_ASSERT(selectedItems().size()==1); CEditEntryDlg::saveAttachment(((EntryViewItem*)selectedItems()[0])->EntryHandle,this); @@ -268,7 +286,8 @@ void KeepassEntryView::showGroup(IGroupHandle* group){ createItems(entries); } -void KeepassEntryView::createItems(QList& entries){ +void KeepassEntryView::createItems(QList& entries){ + header()->setSortIndicatorShown(false); for(int i=0;iisValid())continue; EntryViewItem* item=new EntryViewItem(this); @@ -304,6 +323,7 @@ void KeepassEntryView::createItems(QList& entries){ if(config.Columns[9]){ item->setText(j++,entries[i]->binaryDesc());} Items.back()->setIcon(0,db->icon(entries[i]->image())); + qDebug("%s : %i",entries[i]->title().toUtf8().data(),entries[i]->visualIndex()); } } diff --git a/src/lib/EntryView.h b/src/lib/EntryView.h index c6adf31..5425ca0 100644 --- a/src/lib/EntryView.h +++ b/src/lib/EntryView.h @@ -70,6 +70,7 @@ class KeepassEntryView:public QTreeWidget{ virtual void mouseMoveEvent(QMouseEvent *event); public slots: void OnColumnResized(int index,int OldSize, int NewSize); + void OnHeaderSectionClicked(int index); void OnGroupChanged(IGroupHandle* group); void OnShowSearchResults(); void OnEntryActivated(QTreeWidgetItem*,int); diff --git a/src/lib/FileDialogs.cpp b/src/lib/FileDialogs.cpp index 17e82c6..229e5db 100644 --- a/src/lib/FileDialogs.cpp +++ b/src/lib/FileDialogs.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -18,11 +18,15 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "FileDialogs.h" #include +#include +#include "main.h" +#include "FileDialogs.h" + IFileDialog* KpxFileDialogs::iFileDialog=NULL; QtStandardFileDialogs DefaultQtDlgs; +FileDlgHistory fileDlgHistory; void KpxFileDialogs::setPlugin(IFileDialog* plugin){ iFileDialog=plugin; @@ -30,26 +34,37 @@ void KpxFileDialogs::setPlugin(IFileDialog* plugin){ QString KpxFileDialogs::openExistingFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,const QString& Dir) { + QString dir; if(iFileDialog==NULL)iFileDialog=dynamic_cast(&DefaultQtDlgs); - //Load History here! - return iFileDialog->openExistingFileDialog(Parent,Title,QDir::homePath(),Filters); - + if(Dir==QString()) dir=fileDlgHistory.getDir(Name); + else dir=Dir; + QString result = iFileDialog->openExistingFileDialog(Parent,Title,dir,Filters); + if(result!=QString()){ + fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter()); + } + return result; } QStringList KpxFileDialogs::openExistingFiles(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,const QString& Dir) { if(iFileDialog==NULL)iFileDialog=dynamic_cast(&DefaultQtDlgs); //Load History here! - return iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters); + QStringList results=iFileDialog->openExistingFilesDialog(Parent,Title,QString(),Filters); + if(results.size()){ + fileDlgHistory.set(Name,results[0].left(results[0].lastIndexOf("/")+1),iFileDialog->getLastFilter()); + } + return results; } QString KpxFileDialogs::saveFile(QWidget* Parent, const QString& Name, const QString& Title,const QStringList& Filters,bool OverWriteWarn, const QString& Dir) { if(iFileDialog==NULL)iFileDialog=dynamic_cast(&DefaultQtDlgs); //Load History here! - return iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,OverWriteWarn); - - + QString result = iFileDialog->saveFileDialog(Parent,Title,QString(),Filters,OverWriteWarn); + if(result!=QString()){ + fileDlgHistory.set(Name,result.left(result.lastIndexOf("/")+1),iFileDialog->getLastFilter()); + } + return result; } QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters){ @@ -58,6 +73,7 @@ QString QtStandardFileDialogs::openExistingFileDialog(QWidget* parent,QString ti FileDlg.setFileMode(QFileDialog::ExistingFile); if(!FileDlg.exec())return QString(); if(!FileDlg.selectedFiles().size())return QString(); + LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter()); return FileDlg.selectedFiles()[0]; } @@ -66,6 +82,7 @@ QStringList QtStandardFileDialogs::openExistingFilesDialog(QWidget* parent,QStri FileDlg.setFilters(Filters); FileDlg.setFileMode(QFileDialog::ExistingFiles); if(!FileDlg.exec())return QStringList(); + LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter()); return FileDlg.selectedFiles(); } @@ -76,7 +93,65 @@ QString QtStandardFileDialogs::saveFileDialog(QWidget* parent,QString title,QStr FileDlg.setAcceptMode(QFileDialog::AcceptSave); FileDlg.setConfirmOverwrite(ShowOverwriteWarning); if(!FileDlg.exec())return QString(); + LastFilter=FileDlg.filters().indexOf(FileDlg.selectedFilter()); return FileDlg.selectedFiles()[0]; } +int QtStandardFileDialogs::getLastFilter(){ + return LastFilter; +} + + +QString FileDlgHistory::getDir(const QString& name){ + Entry e=History.value(name); + if(e.isNull()) + return QDir::homePath(); + else + return e.Dir; +} + +int FileDlgHistory::getFilter(const QString& name){ + Entry e=History.value(name); + if(e.isNull()) + return 0; + else + return e.Filter; +} + +void FileDlgHistory::set(const QString& name,const QString& dir, int filter){ + History[name]=Entry(); + History[name].Dir=dir; + History[name].Filter=filter; +} +void FileDlgHistory::save(){ + if(settings->value("General/SaveFileDlgHistory",QVariant(true)).toBool()){ + settings->beginGroup("FileDlgHistory"); + for(int i=0;isetValue(QString("ENTRY%1").arg(i),QVariant(entry)); + } + settings->endGroup(); + } +} + +void FileDlgHistory::load(){ + if(settings->value("General/SaveFileDlgHistory",QVariant(true)).toBool()){ + settings->beginGroup("FileDlgHistory"); + QStringList keys=settings->childKeys(); + for(int i=0;ivalue(QString("ENTRY%1").arg(i)).toStringList(); + entry.Dir=value[1]; + entry.Filter=value[2].toInt(); + History[value[0]]=entry; + } + settings->endGroup(); + } + else{ + settings->remove("FileDlgHistory"); + } +} diff --git a/src/lib/FileDialogs.h b/src/lib/FileDialogs.h index a43b117..75863fb 100644 --- a/src/lib/FileDialogs.h +++ b/src/lib/FileDialogs.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -23,27 +23,31 @@ #include #include #include +#include #include "plugins/interfaces/IFileDialog.h" -/* + class FileDlgHistory{ - class HistoryEntry{ - public: - QString DlgId; - QString Dir; - int Filter; - QString toString(); - void fromString(const QString& str); - }; public: - void set(const QString& DlgId,const QString& Dir,int Filter); - int getFilter(const QString& DlgId); - QString getDir(const QString& DlgId); - void clear(); + QString getDir(const QString& name); + int getFilter(const QString& name); + void set(const QString& name,const QString& dir,int filter); + void save(); + void load(); private: - QList + class Entry{ + public: + Entry(){Filter=-1;} + QString Dir; + int Filter; + bool isNull(){if(Filter==-1)return true; + else return false;} + }; + + QHashHistory; + }; -*/ + class KpxFileDialogs{ public: @@ -71,14 +75,17 @@ class KpxFileDialogs{ class QtStandardFileDialogs:public QObject,public IFileDialog{ -Q_OBJECT - public: - QString openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters); - QStringList openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters); - QString saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,bool ShowOverwriteWarning); + Q_OBJECT + public: + QString openExistingFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters); + QStringList openExistingFilesDialog(QWidget* parent,QString title,QString dir,QStringList Filters); + QString saveFileDialog(QWidget* parent,QString title,QString dir,QStringList Filters,bool ShowOverwriteWarning); + int getLastFilter(); + private: + int LastFilter; }; - +extern FileDlgHistory fileDlgHistory; #endif diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp index ea5beb8..dc06c3d 100644 --- a/src/lib/GroupView.cpp +++ b/src/lib/GroupView.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005 by Tarek Saidi * + * Copyright (C) 2005-2007 by Tarek Saidi * * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * @@ -46,8 +46,8 @@ KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){ ContextMenu=new QMenu(this); ContextMenuSearchGroup=new QMenu(this); connect(this,SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),this,SLOT(OnCurrentGroupChanged(QTreeWidgetItem*,QTreeWidgetItem*))); -// connect(this,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(OnItemExpanded(QTreeWidgetItem*))); -// connect(this,SIGNAL(itemCollapsed(QTreeWidgetItem*)),this,SLOT(OnItemCollapsed(QTreeWidgetItem*))); + connect(this,SIGNAL(itemExpanded(QTreeWidgetItem*)),this,SLOT(OnItemExpanded(QTreeWidgetItem*))); + connect(this,SIGNAL(itemCollapsed(QTreeWidgetItem*)),this,SLOT(OnItemCollapsed(QTreeWidgetItem*))); } @@ -59,12 +59,13 @@ void KeepassGroupView::createItems(){ if(groups[i]->parent()==NULL){ Items.append(new GroupViewItem(this)); Items.back()->setText(0,groups[i]->title()); - Items.back()->GroupHandle=groups[i]; + Items.back()->GroupHandle=groups[i]; addChilds(Items.back()); } } for(int i=0;isetIcon(0,db->icon(Items[i]->GroupHandle->image())); + Items[i]->setExpanded(Items[i]->GroupHandle->expanded()); } SearchResultItem=new GroupViewItem(); SearchResultItem->setText(0,tr("Search Results")); @@ -398,6 +399,14 @@ void KeepassGroupView::mouseMoveEvent(QMouseEvent *event){ Qt::DropAction dropAction = drag->start(Qt::MoveAction); } +void KeepassGroupView::OnItemExpanded(QTreeWidgetItem* item){ + dynamic_cast(item)->GroupHandle->setExpanded(true); +} + +void KeepassGroupView::OnItemCollapsed(QTreeWidgetItem* item){ + dynamic_cast(item)->GroupHandle->setExpanded(false); +} + GroupViewItem::GroupViewItem():QTreeWidgetItem(){ diff --git a/src/lib/GroupView.h b/src/lib/GroupView.h index 4a232d1..e3f65aa 100644 --- a/src/lib/GroupView.h +++ b/src/lib/GroupView.h @@ -62,8 +62,8 @@ class KeepassGroupView:public QTreeWidget{ void OnEditGroup(); void updateIcons(); void OnHideSearchResults(); -// void OnItemExpanded(QTreeWidgetItem*); -// void OnItemCollapsed(QTreeWidgetItem*); + void OnItemExpanded(QTreeWidgetItem*); + void OnItemCollapsed(QTreeWidgetItem*); signals: void groupChanged(IGroupHandle* NewGroup); diff --git a/src/main.cpp b/src/main.cpp index e15365d..bba1d34 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ /*************************************************************************** - * Copyright (C) 2005-2006 by Tarek Saidi * - * tarek@linux * + * Copyright (C) 2005-2007 by Tarek Saidi * + * tarek.saidi@arcor.de * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * @@ -38,6 +38,7 @@ #include "lib/FileDialogs.h" #include "main.h" +#include "lib/FileDialogs.h" #include "PwmConfig.h" #include "StandardDatabase.h" #include "mainwindow.h" @@ -56,6 +57,7 @@ using namespace std; #define CSTR(x)(x.toUtf8().data()) CConfig config; +QSettings* settings; QString AppDir; QString PluginLoadError; bool TrActive; @@ -113,6 +115,9 @@ int main(int argc, char **argv) config.loadFromIni(IniFilename);} + settings = new QSettings(QDir::homePath()+"/.keepassx/config",QSettings::IniFormat); + fileDlgHistory.load(); + //Plugins if(config.IntegrPlugin!=CConfig::NONE){ QString LibName="libkeepassx-"; @@ -209,7 +214,10 @@ int main(int argc, char **argv) QMessageBox::warning(NULL,QObject::tr("Warning"), QObject::tr("Could not save configuration file.\nMake sure you have write access to '~/.keepass'."), QObject::tr("OK"),"","",0.0); + + fileDlgHistory.save(); delete app; + delete settings; return r; } diff --git a/src/main.h b/src/main.h index 56f456b..203aec8 100644 --- a/src/main.h +++ b/src/main.h @@ -26,6 +26,7 @@ #include #include #include +#include #define KEEPASS_VERSION "0.2.3" #define BUILTIN_ICONS 62 @@ -43,6 +44,7 @@ QString findPlugin(const QString& filename); extern QString PluginLoadError; extern CConfig config; +extern QSettings *settings; extern QString AppDir; extern bool TrActive; extern QPixmap *EntryIcons; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index f7be5df..0567d14 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -38,6 +38,7 @@ #include #include +#include "KpxFirefox.h" #include "lib/random.h" #include "lib/IniReader.h" #include "lib/AutoType.h" @@ -55,35 +56,54 @@ #include "dialogs/PasswordGenDlg.h" #include "dialogs/CollectEntropyDlg.h" +#include +#include + +QDBusServer* dbusServer; +QDBusConnection* dbusCon; + KeepassMainWindow::KeepassMainWindow(const QString& ArgFile,QWidget *parent, Qt::WFlags flags):QMainWindow(parent,flags){ - Start=true; - ShutingDown=false; - setupUi(this); - AutoType::MainWin=this; - setGeometry(geometry().x(),geometry().y(),config.MainWinWidth,config.MainWinHeight); - splitter->setSizes(QList() << config.MainWinSplit1 << config.MainWinSplit2); - SysTray=new QSystemTrayIcon(this); - setupToolbar(); - setupIcons(); - setStateFileOpen(false); - setupMenus(); - StatusBarGeneral=new QLabel(tr("Ready"),statusBar()); - StatusBarSelection=new QLabel(statusBar()); - statusBar()->addWidget(StatusBarGeneral,15); - statusBar()->addWidget(StatusBarSelection,85); - statusBar()->setVisible(config.ShowStatusbar); - setupConnections(); - FileOpen=false; - if(ArgFile!=QString()) - openDatabase(ArgFile,false); - else if(config.OpenLast && (config.LastFile!=QString()) ){ + Start=true; + ShutingDown=false; + setupUi(this); + AutoType::MainWin=this; + setGeometry(settings->value("Ui/MainWindowGeometry",QVariant(geometry())).toRect()); + splitter->restoreState(settings->value("Ui/SplitterPos").toByteArray()); + SysTray=new QSystemTrayIcon(this); + setupToolbar(); + setupIcons(); + setStateFileOpen(false); + setupMenus(); + StatusBarGeneral=new QLabel(tr("Ready"),statusBar()); + StatusBarSelection=new QLabel(statusBar()); + statusBar()->addWidget(StatusBarGeneral,15); + statusBar()->addWidget(StatusBarSelection,85); + statusBar()->setVisible(config.ShowStatusbar); + setupConnections(); + FileOpen=false; + if(ArgFile!=QString()) + openDatabase(ArgFile,false); + else if(config.OpenLast && (config.LastFile!=QString()) ){ QFileInfo file(config.LastFile); if(file.exists()) openDatabase(config.LastFile,true); else config.LastFile=QString(); - } + } + + + //dbusServer=new QDBusServer("unix:path=/tmp/KpxBus",this); + //qDebug("DBUS: %s",dbusServer->lastError().message().toAscii().data()); + //QDBusConnection::connectToBus("unix:path=/tmp/KpxBus","MyKpxConnection"); + //qDebug("DBUS: %s",dbusCon->lastError().message().toAscii().data()); + + KpxFirefox* fox=new KpxFirefox(NULL); + new KpxFirefoxAdaptor(fox); + QDBusConnection::sessionBus().registerService("org.keepassx.firefoxservice"); + QDBusConnection::sessionBus().registerObject("/KpxFirefox",fox); + qDebug("DBUS: %s",QDBusConnection::sessionBus().lastError().message().toAscii().data()); + } void KeepassMainWindow::setupConnections(){ @@ -642,13 +662,33 @@ void KeepassMainWindow::OnFileExit(){ } void KeepassMainWindow::OnExportToTxt(){ - /* -QString filename=QFileDialog::getSaveFileName(this,tr("Export To..."),QDir::homePath(),"*.txt"); -if(filename==QString())return; -Export_Txt exp; -QString err; -exp.exportFile(filename,db,err); - */ + IExport* exporter=new Export_Txt(); + QStringList Filters; + Filters << tr("All Files (*)"); + Filters << tr("Text Files (*.txt)"); + exportDatabase(exporter, Filters); + delete exporter; +} + +void KeepassMainWindow::exportDatabase(IExport* exporter,QStringList Filters){ + QString filename=KpxFileDialogs::saveFile(this,"Export_"+exporter->name(),tr("Export Database"),Filters,true); + if(filename==QString())return; + QFile file(filename); + if(!file.open(QIODevice::WriteOnly|QIODevice::Truncate)){ + QMessageBox::critical(this,tr("Export Failed"),decodeFileError(file.error())); + return; + } + QString err=exporter->exportDatabase(this,db,&file); + if(err!=QString()){ + QMessageBox::critical(this,tr("Export Failed"),err); + return; + } + file.close(); + if(file.error()!=QFile::NoError){ + QMessageBox::critical(this,tr("Export Failed"),decodeFileError(file.error())); + return; + } + } void KeepassMainWindow::OnImportFromPwm(){ @@ -816,10 +856,8 @@ void KeepassMainWindow::closeEvent(QCloseEvent* e){ return; } - config.MainWinHeight=geometry().height(); - config.MainWinWidth=geometry().width(); - config.MainWinSplit1=splitter->sizes()[0]; - config.MainWinSplit2=splitter->sizes()[1]; + settings->setValue("Ui/MainWindowGeometry",QVariant(geometry())); + settings->setValue("Ui/SplitterPos",splitter->saveState()); config.ShowStatusbar=statusBar()->isVisible(); if(FileOpen){ diff --git a/src/mainwindow.h b/src/mainwindow.h index 9b0e788..0f6241e 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -43,6 +43,7 @@ #include "PwmConfig.h" #include "lib/EntryView.h" #include "lib/GroupView.h" +#include "export/IExport.h" #include "ui_MainWindow.h" @@ -112,6 +113,7 @@ class KeepassMainWindow : public QMainWindow, public Ui_MainWindow{ void search(IGroupHandle* Group); void removeFromSearchResults(int sID); void updateDetailView(); + void exportDatabase(IExport* exporter,QStringList filters); QLineEdit* QuickSearchEdit; QLabel* StatusBarGeneral; QLabel* StatusBarSelection; diff --git a/src/plugins/interfaces/IFileDialog.h b/src/plugins/interfaces/IFileDialog.h index 2e3fe61..376133f 100644 --- a/src/plugins/interfaces/IFileDialog.h +++ b/src/plugins/interfaces/IFileDialog.h @@ -33,6 +33,8 @@ class IFileDialog{ virtual QString saveFileDialog(QWidget* parent,QString title,QString dir, QStringList Filters,bool ShowOverwriteWarning=true)=0; + + virtual int getLastFilter()=0; }; Q_DECLARE_INTERFACE(IFileDialog,"org.KeePassX.FileDialogInterface/1.0") diff --git a/src/src.pro b/src/src.pro index ba66940..2a001b3 100755 --- a/src/src.pro +++ b/src/src.pro @@ -1,146 +1,159 @@ -# Diese Datei wurde mit dem qmake-Manager von KDevelop erstellt. -# ------------------------------------------- -# Unterordner relativ zum Projektordner: ./src -# Das Target ist eine Anwendung: ../bin/keepass - - -INSTALLS += target data -data.files += ../share/keepass/* -TARGET = ../bin/keepassx - -unix:!macx{ - isEmpty(PREFIX){ - PREFIX=/usr/local - } - target.path = $${PREFIX}/bin - data.path = $${PREFIX}/share/keepass - LIBS+=-lXtst - SOURCES+=lib/AutoType_X11.cpp -} - -macx{ - target.path = /Applications - data.path = /Applications/keepass.app/Contents/share/keepass - SOURCES+=lib/AutoType_X11.cpp -} - -win32{ - SOURCES+=lib/AutoType_Win.cpp - TARGET=../$$TARGET - QMAKE_LINK_OBJECT_SCRIPT=../build/$$QMAKE_LINK_OBJECT_SCRIPT - -} - -FORMS += forms/EditGroupDlg.ui \ - forms/SearchDlg.ui \ - forms/AboutDlg.ui \ - forms/SettingsDlg.ui \ - forms/MainWindow.ui \ - forms/SimplePasswordDlg.ui \ - forms/DatabaseSettingsDlg.ui \ - forms/PasswordDlg.ui \ - forms/EditEntryDlg.ui \ - forms/PasswordGenDlg.ui \ - forms/SelectIconDlg.ui \ - forms/CollectEntropyDlg.ui -TRANSLATIONS += translations/keepass-de_DE.ts \ - translations/keepass-ru_RU.ts \ - translations/keepass-es_ES.ts \ - translations/keepass-fr_FR.ts \ - translations/keepass-cs_CS.ts \ - translations/keepass-xx_XX.ts -HEADERS += lib/IniReader.h \ - lib/UrlLabel.h \ - mainwindow.h \ - StandardDatabase.h \ - lib/SecString.h \ - crypto/twoclass.h \ - crypto/twofish.h \ - import/Import_PwManager.h \ - export/Export_Txt.h \ - import/Import_KWalletXml.h \ - PwmConfig.h \ - dialogs/AboutDlg.h \ - dialogs/EditGroupDlg.h \ - dialogs/SearchDlg.h \ - dialogs/SettingsDlg.h \ - dialogs/DatabaseSettingsDlg.h \ - dialogs/PasswordDlg.h \ - dialogs/SimplePasswordDlg.h \ - dialogs/EditEntryDlg.h \ - dialogs/PasswordGenDlg.h \ - dialogs/SelectIconDlg.h \ - dialogs/CollectEntropyDlg.h \ - lib/random.h \ - Database.h \ - lib/KdePlugin.h \ - lib/AutoType.h \ - lib/FileDialogs.h \ - global.h \ - main.h \ - lib/GroupView.h \ - lib/EntryView.h \ - crypto/arcfour.h \ - lib/KpFileIconProvider.h \ - crypto/aes_edefs.h \ - crypto/aes_tdefs.h \ - crypto/aes.h \ - crypto/aesopt.h \ - crypto/aestab.h \ - crypto/aescpp.h \ - crypto/sha256.h \ - crypto/yarrow.h \ - lib/WaitAnimationWidget.h \ - plugins/interfaces/IFileDialog.h \ - plugins/interfaces/IKdeInit.h \ - plugins/interfaces/IGnomeInit.h -SOURCES += lib/IniReader.cpp \ - lib/UrlLabel.cpp \ - main.cpp \ - mainwindow.cpp \ - StandardDatabase.cpp \ - lib/SecString.cpp \ - crypto/twoclass.cpp \ - crypto/twofish.cpp \ - import/Import_PwManager.cpp \ - export/Export_Txt.cpp \ - import/Import_KWalletXml.cpp \ - PwmConfig.cpp \ - dialogs/AboutDlg.cpp \ - dialogs/EditGroupDlg.cpp \ - dialogs/SearchDlg.cpp \ - dialogs/SettingsDlg.cpp \ - dialogs/DatabaseSettingsDlg.cpp \ - dialogs/PasswordDlg.cpp \ - dialogs/SimplePasswordDlg.cpp \ - dialogs/EditEntryDlg.cpp \ - dialogs/PasswordGenDlg.cpp \ - dialogs/SelectIconDlg.cpp \ - dialogs/CollectEntropyDlg.cpp \ - lib/random.cpp \ - Database.cpp \ - lib/KdePlugin.cpp \ - lib/GroupView.cpp \ - lib/EntryView.cpp \ - lib/FileDialogs.cpp \ - crypto/arcfour.cpp \ - lib/KpFileIconProvider.cpp \ - crypto/aescrypt.c \ - crypto/aeskey.c \ - crypto/aestab.c \ - crypto/aes_modes.c \ - crypto/sha256.cpp \ - crypto/yarrow.cpp \ - lib/WaitAnimationWidget.cpp -QT += xml -MOC_DIR = ../build/moc -UI_DIR = ../build/ui -OBJECTS_DIR = ../build/ -INCLUDEPATH += ./ -CONFIG += debug \ -warn_off \ -qt \ -thread \ -exceptions \ -stl -TEMPLATE = app +###################################################################### +# Automatically generated by qmake (2.01a) Mo Jan 29 18:17:19 2007 +###################################################################### + +DEPENDPATH += "crypto \ + dialogs \ + export \ + forms \ + import \ + lib \ + translations" +INSTALLS += target data +data.files += ../share/keepass/* +TARGET = ../bin/keepassx + +unix: !macx{ + isEmpty(PREFIX){ + PREFIX = /usr/local + } + target.path = $${PREFIX}/bin + data.path = $${PREFIX}/share/keepass + LIBS += -lXtst -lQtDBus + SOURCES += lib/AutoType_X11.cpp + } + +macx{ + target.path = /Applications + data.path = /Applications/keepass.app/Contents/share/keepass + SOURCES += lib/AutoType_X11.cpp +} + +win32{ + SOURCES += lib/AutoType_Win.cpp + TARGET = ../$$TARGET + QMAKE_LINK_OBJECT_SCRIPT = ../build/$$QMAKE_LINK_OBJECT_SCRIPT + +} + +FORMS += forms/EditGroupDlg.ui \ + forms/SearchDlg.ui \ + forms/AboutDlg.ui \ + forms/SettingsDlg.ui \ + forms/MainWindow.ui \ + forms/SimplePasswordDlg.ui \ + forms/DatabaseSettingsDlg.ui \ + forms/PasswordDlg.ui \ + forms/EditEntryDlg.ui \ + forms/PasswordGenDlg.ui \ + forms/SelectIconDlg.ui \ + forms/CollectEntropyDlg.ui +TRANSLATIONS += translations/keepass-de_DE.ts \ + translations/keepass-ru_RU.ts \ + translations/keepass-es_ES.ts \ + translations/keepass-fr_FR.ts \ + translations/keepass-cs_CS.ts \ + translations/keepass-xx_XX.ts +HEADERS += lib/IniReader.h \ + lib/UrlLabel.h \ + mainwindow.h \ + StandardDatabase.h \ + lib/SecString.h \ + crypto/twoclass.h \ + crypto/twofish.h \ + import/Import_PwManager.h \ + export/Export_Txt.h \ + import/Import_KWalletXml.h \ + PwmConfig.h \ + dialogs/AboutDlg.h \ + dialogs/EditGroupDlg.h \ + dialogs/SearchDlg.h \ + dialogs/SettingsDlg.h \ + dialogs/DatabaseSettingsDlg.h \ + dialogs/PasswordDlg.h \ + dialogs/SimplePasswordDlg.h \ + dialogs/EditEntryDlg.h \ + dialogs/PasswordGenDlg.h \ + dialogs/SelectIconDlg.h \ + dialogs/CollectEntropyDlg.h \ + lib/random.h \ + Database.h \ + lib/KdePlugin.h \ + lib/AutoType.h \ + lib/FileDialogs.h \ + global.h \ + main.h \ + lib/GroupView.h \ + lib/EntryView.h \ + crypto/arcfour.h \ + lib/KpFileIconProvider.h \ + crypto/aes_edefs.h \ + crypto/aes_tdefs.h \ + crypto/aes.h \ + crypto/aesopt.h \ + crypto/aestab.h \ + crypto/aescpp.h \ + crypto/sha256.h \ + crypto/yarrow.h \ + lib/WaitAnimationWidget.h \ + plugins/interfaces/IFileDialog.h \ + plugins/interfaces/IKdeInit.h \ + plugins/interfaces/IGnomeInit.h \ + KpxFirefox.h +SOURCES += lib/IniReader.cpp \ + lib/UrlLabel.cpp \ + main.cpp \ + mainwindow.cpp \ + StandardDatabase.cpp \ + lib/SecString.cpp \ + crypto/twoclass.cpp \ + crypto/twofish.cpp \ + import/Import_PwManager.cpp \ + export/Export_Txt.cpp \ + import/Import_KWalletXml.cpp \ + PwmConfig.cpp \ + dialogs/AboutDlg.cpp \ + dialogs/EditGroupDlg.cpp \ + dialogs/SearchDlg.cpp \ + dialogs/SettingsDlg.cpp \ + dialogs/DatabaseSettingsDlg.cpp \ + dialogs/PasswordDlg.cpp \ + dialogs/SimplePasswordDlg.cpp \ + dialogs/EditEntryDlg.cpp \ + dialogs/PasswordGenDlg.cpp \ + dialogs/SelectIconDlg.cpp \ + dialogs/CollectEntropyDlg.cpp \ + lib/random.cpp \ + Database.cpp \ + lib/KdePlugin.cpp \ + lib/GroupView.cpp \ + lib/EntryView.cpp \ + lib/FileDialogs.cpp \ + crypto/arcfour.cpp \ + lib/KpFileIconProvider.cpp \ + crypto/aescrypt.c \ + crypto/aeskey.c \ + crypto/aestab.c \ + crypto/aes_modes.c \ + crypto/sha256.cpp \ + crypto/yarrow.cpp \ + lib/WaitAnimationWidget.cpp \ + KpxFirefox.cpp +MOC_DIR = ../build/moc +UI_DIR = ../build/ui +OBJECTS_DIR = ../build/ +CONFIG += debug \ +qt \ +thread \ +warn_off \ +dbus +QT += dbus xml +TEMPLATE = app +INCLUDEPATH += . \ +lib \ +crypto \ +plugins/interfaces \ +export \ +import \ +dialogs \ +./