Skip to content
This repository has been archived by the owner on Dec 9, 2021. It is now read-only.

Commit

Permalink
Merge branch '2.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
debfx committed Jan 29, 2016
2 parents ecfbf72 + eb56bd8 commit 71d4cb7
Show file tree
Hide file tree
Showing 30 changed files with 569 additions and 40 deletions.
2 changes: 2 additions & 0 deletions src/CMakeLists.txt
Expand Up @@ -73,6 +73,7 @@ set(keepassx_SOURCES
format/KeePass2.h
format/KeePass2RandomStream.cpp
format/KeePass2Reader.cpp
format/KeePass2Repair.cpp
format/KeePass2Writer.cpp
format/KeePass2XmlReader.cpp
format/KeePass2XmlWriter.cpp
Expand All @@ -81,6 +82,7 @@ set(keepassx_SOURCES
gui/ChangeMasterKeyWidget.cpp
gui/Clipboard.cpp
gui/DatabaseOpenWidget.cpp
gui/DatabaseRepairWidget.cpp
gui/DatabaseSettingsWidget.cpp
gui/DatabaseTabWidget.cpp
gui/DatabaseWidget.cpp
Expand Down
26 changes: 17 additions & 9 deletions src/core/Entry.cpp
Expand Up @@ -113,13 +113,25 @@ QPixmap Entry::iconPixmap() const
else {
Q_ASSERT(database());

QPixmap pixmap;
if (database() && !QPixmapCache::find(m_pixmapCacheKey, &pixmap)) {
pixmap = QPixmap::fromImage(database()->metadata()->customIcon(m_data.customIcon));
m_pixmapCacheKey = QPixmapCache::insert(pixmap);
if (database()) {
return database()->metadata()->customIconPixmap(m_data.customIcon);
}
else {
return QPixmap();
}
}
}

QPixmap Entry::iconScaledPixmap() const
{
if (m_data.customIcon.isNull()) {
// built-in icons are 16x16 so don't need to be scaled
return databaseIcons()->iconPixmap(m_data.iconNumber);
}
else {
Q_ASSERT(database());

return pixmap;
return database()->metadata()->customIconScaledPixmap(m_data.customIcon);
}
}

Expand Down Expand Up @@ -247,8 +259,6 @@ void Entry::setIcon(int iconNumber)
m_data.iconNumber = iconNumber;
m_data.customIcon = Uuid();

m_pixmapCacheKey = QPixmapCache::Key();

Q_EMIT modified();
emitDataChanged();
}
Expand All @@ -262,8 +272,6 @@ void Entry::setIcon(const Uuid& uuid)
m_data.customIcon = uuid;
m_data.iconNumber = 0;

m_pixmapCacheKey = QPixmapCache::Key();

Q_EMIT modified();
emitDataChanged();
}
Expand Down
3 changes: 1 addition & 2 deletions src/core/Entry.h
Expand Up @@ -22,7 +22,6 @@
#include <QImage>
#include <QMap>
#include <QPixmap>
#include <QPixmapCache>
#include <QPointer>
#include <QSet>
#include <QUrl>
Expand Down Expand Up @@ -60,6 +59,7 @@ class Entry : public QObject
Uuid uuid() const;
QImage icon() const;
QPixmap iconPixmap() const;
QPixmap iconScaledPixmap() const;
int iconNumber() const;
Uuid iconUuid() const;
QColor foregroundColor() const;
Expand Down Expand Up @@ -168,7 +168,6 @@ private Q_SLOTS:
Entry* m_tmpHistoryItem;
bool m_modifiedSinceBegin;
QPointer<Group> m_group;
mutable QPixmapCache::Key m_pixmapCacheKey;
bool m_updateTimeinfo;
};

Expand Down
31 changes: 22 additions & 9 deletions src/core/Group.cpp
Expand Up @@ -133,13 +133,30 @@ QPixmap Group::iconPixmap() const
else {
Q_ASSERT(m_db);

QPixmap pixmap;
if (m_db && !QPixmapCache::find(m_pixmapCacheKey, &pixmap)) {
pixmap = QPixmap::fromImage(m_db->metadata()->customIcon(m_data.customIcon));
m_pixmapCacheKey = QPixmapCache::insert(pixmap);
if (m_db) {
return m_db->metadata()->customIconPixmap(m_data.customIcon);
}
else {
return QPixmap();
}
}
}

QPixmap Group::iconScaledPixmap() const
{
if (m_data.customIcon.isNull()) {
// built-in icons are 16x16 so don't need to be scaled
return databaseIcons()->iconPixmap(m_data.iconNumber);
}
else {
Q_ASSERT(m_db);

return pixmap;
if (m_db) {
return m_db->metadata()->customIconScaledPixmap(m_data.customIcon);
}
else {
return QPixmap();
}
}
}

Expand Down Expand Up @@ -213,8 +230,6 @@ void Group::setIcon(int iconNumber)
m_data.iconNumber = iconNumber;
m_data.customIcon = Uuid();

m_pixmapCacheKey = QPixmapCache::Key();

updateTimeinfo();
Q_EMIT modified();
Q_EMIT dataChanged(this);
Expand All @@ -229,8 +244,6 @@ void Group::setIcon(const Uuid& uuid)
m_data.customIcon = uuid;
m_data.iconNumber = 0;

m_pixmapCacheKey = QPixmapCache::Key();

updateTimeinfo();
Q_EMIT modified();
Q_EMIT dataChanged(this);
Expand Down
2 changes: 1 addition & 1 deletion src/core/Group.h
Expand Up @@ -58,6 +58,7 @@ class Group : public QObject
QString notes() const;
QImage icon() const;
QPixmap iconPixmap() const;
QPixmap iconScaledPixmap() const;
int iconNumber() const;
Uuid iconUuid() const;
TimeInfo timeInfo() const;
Expand Down Expand Up @@ -155,7 +156,6 @@ class Group : public QObject
QList<Entry*> m_entries;

QPointer<Group> m_parent;
mutable QPixmapCache::Key m_pixmapCacheKey;

bool m_updateTimeinfo;

Expand Down
55 changes: 55 additions & 0 deletions src/core/Metadata.cpp
Expand Up @@ -167,6 +167,43 @@ QImage Metadata::customIcon(const Uuid& uuid) const
return m_customIcons.value(uuid);
}

QPixmap Metadata::customIconPixmap(const Uuid& uuid) const
{
QPixmap pixmap;

if (!m_customIcons.contains(uuid)) {
return pixmap;
}

QPixmapCache::Key& cacheKey = m_customIconCacheKeys[uuid];

if (!QPixmapCache::find(cacheKey, &pixmap)) {
pixmap = QPixmap::fromImage(m_customIcons.value(uuid));
cacheKey = QPixmapCache::insert(pixmap);
}

return pixmap;
}

QPixmap Metadata::customIconScaledPixmap(const Uuid& uuid) const
{
QPixmap pixmap;

if (!m_customIcons.contains(uuid)) {
return pixmap;
}

QPixmapCache::Key& cacheKey = m_customIconScaledCacheKeys[uuid];

if (!QPixmapCache::find(cacheKey, &pixmap)) {
QImage image = m_customIcons.value(uuid).scaled(16, 16, Qt::KeepAspectRatio, Qt::SmoothTransformation);
pixmap = QPixmap::fromImage(image);
cacheKey = QPixmapCache::insert(pixmap);
}

return pixmap;
}

bool Metadata::containsCustomIcon(const Uuid& uuid) const
{
return m_customIcons.contains(uuid);
Expand All @@ -177,6 +214,17 @@ QHash<Uuid, QImage> Metadata::customIcons() const
return m_customIcons;
}

QHash<Uuid, QPixmap> Metadata::customIconsScaledPixmaps() const
{
QHash<Uuid, QPixmap> result;

Q_FOREACH (const Uuid& uuid, m_customIconsOrder) {
result.insert(uuid, customIconScaledPixmap(uuid));
}

return result;
}

QList<Uuid> Metadata::customIconsOrder() const
{
return m_customIconsOrder;
Expand Down Expand Up @@ -338,6 +386,9 @@ void Metadata::addCustomIcon(const Uuid& uuid, const QImage& icon)
Q_ASSERT(!m_customIcons.contains(uuid));

m_customIcons.insert(uuid, icon);
// reset cache in case there is also an icon with that uuid
m_customIconCacheKeys[uuid] = QPixmapCache::Key();
m_customIconScaledCacheKeys[uuid] = QPixmapCache::Key();
m_customIconsOrder.append(uuid);
Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count());
Q_EMIT modified();
Expand Down Expand Up @@ -365,6 +416,10 @@ void Metadata::removeCustomIcon(const Uuid& uuid)
Q_ASSERT(m_customIcons.contains(uuid));

m_customIcons.remove(uuid);
QPixmapCache::remove(m_customIconCacheKeys.value(uuid));
m_customIconCacheKeys.remove(uuid);
QPixmapCache::remove(m_customIconScaledCacheKeys.value(uuid));
m_customIconScaledCacheKeys.remove(uuid);
m_customIconsOrder.removeAll(uuid);
Q_ASSERT(m_customIcons.count() == m_customIconsOrder.count());
Q_EMIT modified();
Expand Down
7 changes: 7 additions & 0 deletions src/core/Metadata.h
Expand Up @@ -22,6 +22,8 @@
#include <QDateTime>
#include <QHash>
#include <QImage>
#include <QPixmap>
#include <QPixmapCache>
#include <QPointer>

#include "core/Uuid.h"
Expand Down Expand Up @@ -77,10 +79,13 @@ class Metadata : public QObject
bool protectNotes() const;
// bool autoEnableVisualHiding() const;
QImage customIcon(const Uuid& uuid) const;
QPixmap customIconPixmap(const Uuid& uuid) const;
QPixmap customIconScaledPixmap(const Uuid& uuid) const;
bool containsCustomIcon(const Uuid& uuid) const;
QHash<Uuid, QImage> customIcons() const;
QList<Uuid> customIconsOrder() const;
bool recycleBinEnabled() const;
QHash<Uuid, QPixmap> customIconsScaledPixmaps() const;
Group* recycleBin();
const Group* recycleBin() const;
QDateTime recycleBinChanged() const;
Expand Down Expand Up @@ -152,6 +157,8 @@ class Metadata : public QObject
MetadataData m_data;

QHash<Uuid, QImage> m_customIcons;
mutable QHash<Uuid, QPixmapCache::Key> m_customIconCacheKeys;
mutable QHash<Uuid, QPixmapCache::Key> m_customIconScaledCacheKeys;
QList<Uuid> m_customIconsOrder;

QPointer<Group> m_recycleBin;
Expand Down
14 changes: 12 additions & 2 deletions src/format/KeePass2Reader.cpp
Expand Up @@ -43,7 +43,7 @@ KeePass2Reader::KeePass2Reader()
{
}

Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key)
Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase)
{
QScopedPointer<Database> db(new Database());
m_db = db.data();
Expand Down Expand Up @@ -178,7 +178,12 @@ Database* KeePass2Reader::readDatabase(QIODevice* device, const CompositeKey& ke

if (xmlReader.hasError()) {
raiseError(xmlReader.errorString());
return nullptr;
if (keepDatabase) {
return db.take();
}
else {
return nullptr;
}
}

Q_ASSERT(version < 0x00030001 || !xmlReader.headerHash().isEmpty());
Expand Down Expand Up @@ -232,6 +237,11 @@ QByteArray KeePass2Reader::xmlData()
return m_xmlData;
}

QByteArray KeePass2Reader::streamKey()
{
return m_protectedStreamKey;
}

void KeePass2Reader::raiseError(const QString& errorMessage)
{
m_error = true;
Expand Down
3 changes: 2 additions & 1 deletion src/format/KeePass2Reader.h
Expand Up @@ -31,12 +31,13 @@ class KeePass2Reader

public:
KeePass2Reader();
Database* readDatabase(QIODevice* device, const CompositeKey& key);
Database* readDatabase(QIODevice* device, const CompositeKey& key, bool keepDatabase = false);
Database* readDatabase(const QString& filename, const CompositeKey& key);
bool hasError();
QString errorString();
void setSaveXml(bool save);
QByteArray xmlData();
QByteArray streamKey();

private:
void raiseError(const QString& errorMessage);
Expand Down

0 comments on commit 71d4cb7

Please sign in to comment.