From 493e290956453ad068aa43b9a2fbefacd3550192 Mon Sep 17 00:00:00 2001 From: Ilya Kitaev Date: Fri, 3 Jun 2016 17:30:19 +0300 Subject: libwallet integration --- Wallet.cpp | 194 -------------------------------------- Wallet.h | 44 --------- WalletManager.cpp | 116 ----------------------- WalletManager.h | 48 ---------- main.cpp | 3 +- monero-core.pro | 11 ++- src/libwalletqt/Wallet.cpp | 194 ++++++++++++++++++++++++++++++++++++++ src/libwalletqt/Wallet.h | 44 +++++++++ src/libwalletqt/WalletManager.cpp | 116 +++++++++++++++++++++++ src/libwalletqt/WalletManager.h | 48 ++++++++++ 10 files changed, 410 insertions(+), 408 deletions(-) delete mode 100644 Wallet.cpp delete mode 100644 Wallet.h delete mode 100644 WalletManager.cpp delete mode 100644 WalletManager.h create mode 100644 src/libwalletqt/Wallet.cpp create mode 100644 src/libwalletqt/Wallet.h create mode 100644 src/libwalletqt/WalletManager.cpp create mode 100644 src/libwalletqt/WalletManager.h diff --git a/Wallet.cpp b/Wallet.cpp deleted file mode 100644 index 61998ab5..00000000 --- a/Wallet.cpp +++ /dev/null @@ -1,194 +0,0 @@ -#include "Wallet.h" -#include -#include -#include -#include - -namespace { - QString TEST_SEED = "bound class paint gasp task soul forgot past pleasure physical circle " - " appear shore bathroom glove women crap busy beauty bliss idea give needle burden"; - - namespace { - bool createFileWrapper(const QString &filename) - { - QFile file(filename); - // qDebug("%s: about to create file: %s", __FUNCTION__, qPrintable(filename)); - bool result = file.open(QIODevice::WriteOnly); - if (!result ){ - qWarning("%s: error creating file '%s' : '%s'", - __FUNCTION__, - qPrintable(filename), - qPrintable(file.errorString())); - } - return result; - } - } - -} - -struct WalletImpl -{ - - QString basename() const; - void setBasename(const QString &name); - - QString keysName() const; - QString addressName() const; - -// Bitmonero::Wallet * m_walletImpl; - QString m_basename; - QString m_seed; - QString m_password; - QString m_language; - - static QString keysName(const QString &basename); - static QString addressName(const QString &basename); - -}; - - -QString WalletImpl::basename() const -{ - return m_basename; -} - -void WalletImpl::setBasename(const QString &name) -{ - m_basename = name; -} - -QString WalletImpl::keysName() const -{ - return keysName(m_basename); -} - -QString WalletImpl::addressName() const -{ - return addressName(m_basename); -} - -QString WalletImpl::keysName(const QString &basename) -{ - return basename + ".keys"; -} - -QString WalletImpl::addressName(const QString &basename) -{ - return basename + ".address.txt"; -} - - -Wallet::Wallet(QObject *parent) - : QObject(parent) -{ - -} - -QString Wallet::getSeed() const -{ - return m_pimpl->m_seed; -} - -QString Wallet::getSeedLanguage() const -{ - return "English"; -} - -//void Wallet::setSeedLaguage(const QString &lang) -//{ -// // TODO: call libwallet's appropriate method -//} - -bool Wallet::setPassword(const QString &password) -{ - // set/change password implies: - // recovery wallet with existing path, seed and lang - qDebug("%s: recovering wallet with path=%s, seed=%s, lang=%s and new password=%s", - __FUNCTION__, - qPrintable(this->getBasename()), - qPrintable(this->getSeed()), - qPrintable(this->getSeedLanguage()), - qPrintable(password)); - return true; -} - -QString Wallet::getPassword() const -{ - return m_pimpl->m_password; -} - -bool Wallet::rename(const QString &name) -{ - - QString dst = QUrl(name).toLocalFile(); - - if (dst.isEmpty()) - dst = name; - - qDebug("%s: renaming '%s' to '%s'", - __FUNCTION__, - qPrintable(m_pimpl->basename()), - qPrintable(dst)); - - QString walletKeysFile = m_pimpl->keysName(); - QString walletAddressFile = m_pimpl->addressName(); - - QString dstWalletKeysFile = WalletImpl::keysName(dst); - QString dstWalletAddressFile = WalletImpl::addressName(dst); - - QFile walletFile(this->getBasename()); - - if (!walletFile.rename(dst)) { - qWarning("Error renaming file: '%s' to '%s' : (%s)", - qPrintable(m_pimpl->basename()), - qPrintable(dst), - qPrintable(walletFile.errorString())); - return false; - } - QFile::rename(walletKeysFile, dstWalletKeysFile); - QFile::rename(walletAddressFile, dstWalletAddressFile); - - bool result = QFile::exists(dst) && QFile::exists(dstWalletKeysFile) - && QFile::exists(dstWalletAddressFile); - - if (result) { - m_pimpl->m_basename = dst; - } - - return result; -} - -QString Wallet::getBasename() const -{ - return m_pimpl->basename(); -} - -int Wallet::error() const -{ - return 0; -} - -QString Wallet::errorString() const -{ - return m_pimpl->m_seed; -} - -Wallet::Wallet(const QString &path, const QString &password, const QString &language) -{ - m_pimpl = new WalletImpl; - m_pimpl->m_basename = path; - m_pimpl->m_password = password; - m_pimpl->m_language = language; - m_pimpl->m_seed = TEST_SEED; - - // Create dummy files for testing - QFileInfo fi(path); - QDir tempDir; - tempDir.mkpath(fi.absolutePath()); - createFileWrapper(m_pimpl->basename()); - createFileWrapper(m_pimpl->keysName()); - createFileWrapper(m_pimpl->addressName()); -} - - - diff --git a/Wallet.h b/Wallet.h deleted file mode 100644 index 221d3d43..00000000 --- a/Wallet.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef WALLET_H -#define WALLET_H - -#include - -struct WalletImpl; -class Wallet : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString seed READ getSeed) -public: - explicit Wallet(QObject *parent = 0); - - //! returns mnemonic seed - Q_INVOKABLE QString getSeed() const; - - //! returns seed language - Q_INVOKABLE QString getSeedLanguage() const; - - - //! changes the password using existing parameters (path, seed, seed lang) - Q_INVOKABLE bool setPassword(const QString &password); - //! returns curret wallet password - Q_INVOKABLE QString getPassword() const; - - //! renames/moves wallet files - Q_INVOKABLE bool rename(const QString &name); - - //! returns current wallet name (basename, as wallet consists of several files) - Q_INVOKABLE QString getBasename() const; - - Q_INVOKABLE int error() const; - Q_INVOKABLE QString errorString() const; - -private: - Wallet(const QString &path, const QString &password, const QString &language); - -private: - friend class WalletManager; - //! pimpl wrapper for libwallet; - WalletImpl * m_pimpl; -}; - -#endif // WALLET_H diff --git a/WalletManager.cpp b/WalletManager.cpp deleted file mode 100644 index cb0ffbac..00000000 --- a/WalletManager.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "WalletManager.h" -#include "Wallet.h" -#include "wallet/wallet2_api.h" -#include -#include -#include -#include -#include - -WalletManager * WalletManager::m_instance = nullptr; - - - - - -WalletManager *WalletManager::instance() -{ - if (!m_instance) { - m_instance = new WalletManager; - } - // Checking linkage (doesn't work, TODO: have every dependencies linked statically into libwallet) - Bitmonero::WalletManager * wallet_manager_impl = Bitmonero::WalletManagerFactory::getWalletManager(); - - return m_instance; -} - -Wallet *WalletManager::createWallet(const QString &path, const QString &password, - const QString &language) -{ - QFileInfo fi(path); - if (fi.exists()) { - qCritical("%s: already exists", __FUNCTION__); - // TODO: set error and error string - // return nullptr; - } - Wallet * wallet = new Wallet(path, password, language); - return wallet; -} - -Wallet *WalletManager::openWallet(const QString &path, const QString &language, const QString &password) -{ - QFileInfo fi(path); - if (fi.exists()) { - qCritical("%s: not exists", __FUNCTION__); - // TODO: set error and error string - // return nullptr; - } - // TODO: call the libwallet api here; - Wallet * wallet = new Wallet(path, password, language); - - return wallet; -} - -Wallet *WalletManager::recoveryWallet(const QString &path, const QString &memo, const QString &language) -{ - // TODO: call the libwallet api here; - - return nullptr; -} - -bool WalletManager::moveWallet(const QString &src, const QString &dst_) -{ - // TODO: move this to libwallet; - QFile walletFile(src); - if (!walletFile.exists()) { - qWarning("%s: source file [%s] doesn't exits", __FUNCTION__, - qPrintable(src)); - return false; - } - QString dst = QUrl(dst_).toLocalFile(); - QString walletKeysFile = src + ".keys"; - QString walletAddressFile = src + ".address.txt"; - - QString dstWalletKeysFile = dst + ".keys"; - QString dstWalletAddressFile = dst + ".address.txt"; - - if (!walletFile.rename(dst)) { - qWarning("Error renaming file: '%s' to '%s' : (%s)", - qPrintable(src), - qPrintable(dst), - qPrintable(walletFile.errorString())); - return false; - } - QFile::rename(walletKeysFile, dstWalletKeysFile); - QFile::rename(walletAddressFile, dstWalletAddressFile); - - return QFile::exists(dst) && QFile::exists(dstWalletKeysFile) - && QFile::exists(dstWalletAddressFile); -} - -void WalletManager::closeWallet(Wallet *wallet) -{ - delete wallet; -} - -QString WalletManager::walletLanguage(const QString &locale) -{ - return "English"; -} - -int WalletManager::error() const -{ - return 0; -} - -QString WalletManager::errorString() const -{ - return tr("Unknown error"); -} - -WalletManager::WalletManager(QObject *parent) : QObject(parent) -{ - -} - - diff --git a/WalletManager.h b/WalletManager.h deleted file mode 100644 index 231f104c..00000000 --- a/WalletManager.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef WALLETMANAGER_H -#define WALLETMANAGER_H - -#include - -class Wallet; - -class WalletManager : public QObject -{ - Q_OBJECT -public: - static WalletManager * instance(); - // wizard: createWallet path; - Q_INVOKABLE Wallet * createWallet(const QString &path, const QString &password, - const QString &language); - // just for future use - Q_INVOKABLE Wallet * openWallet(const QString &path, const QString &language, - const QString &password); - - // wizard: recoveryWallet path; hint: internally it recorvers wallet and set password = "" - Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &memo, - const QString &language); - - // wizard: both "create" and "recovery" paths. - // TODO: probably move it to "Wallet" interface - Q_INVOKABLE bool moveWallet(const QString &src, const QString &dst); - - //! utils: close wallet to free memory - Q_INVOKABLE void closeWallet(Wallet * wallet); - - //! returns libwallet language name for given locale - Q_INVOKABLE QString walletLanguage(const QString &locale); - - //! returns last error happened in WalletManager - Q_INVOKABLE int error() const; - - //! returns error description in human language - Q_INVOKABLE QString errorString() const; -signals: - -public slots: - -private: - explicit WalletManager(QObject *parent = 0); - static WalletManager * m_instance; -}; - -#endif // WALLETMANAGER_H diff --git a/main.cpp b/main.cpp index 0e996b84..b486c5f0 100644 --- a/main.cpp +++ b/main.cpp @@ -44,7 +44,8 @@ int main(int argc, char *argv[]) app.installEventFilter(eventFilter); qmlRegisterType("moneroComponents", 1, 0, "Clipboard"); - qmlRegisterType("moneroWallet", 1, 0, "Wallet"); + //qmlRegisterType("moneroWallet", 1, 0, "Wallet"); + qmlRegisterType(); QQmlApplicationEngine engine; diff --git a/monero-core.pro b/monero-core.pro index 4b071fb1..7b05829f 100644 --- a/monero-core.pro +++ b/monero-core.pro @@ -6,23 +6,24 @@ WALLET_ROOT=$$PWD/bitmonero CONFIG += c++11 -INCLUDEPATH += $$WALLET_ROOT/include +INCLUDEPATH += $$WALLET_ROOT/include \ + $$PWD/src/libwalletqt HEADERS += \ filter.h \ clipboardAdapter.h \ oscursor.h \ - WalletManager.h \ - Wallet.h + src/libwalletqt/WalletManager.h \ + src/libwalletqt/Wallet.h SOURCES += main.cpp \ filter.cpp \ clipboardAdapter.cpp \ oscursor.cpp \ - WalletManager.cpp \ - Wallet.cpp + src/libwalletqt/WalletManager.cpp \ + src/libwalletqt/Wallet.cpp lupdate_only { SOURCES = *.qml \ diff --git a/src/libwalletqt/Wallet.cpp b/src/libwalletqt/Wallet.cpp new file mode 100644 index 00000000..61998ab5 --- /dev/null +++ b/src/libwalletqt/Wallet.cpp @@ -0,0 +1,194 @@ +#include "Wallet.h" +#include +#include +#include +#include + +namespace { + QString TEST_SEED = "bound class paint gasp task soul forgot past pleasure physical circle " + " appear shore bathroom glove women crap busy beauty bliss idea give needle burden"; + + namespace { + bool createFileWrapper(const QString &filename) + { + QFile file(filename); + // qDebug("%s: about to create file: %s", __FUNCTION__, qPrintable(filename)); + bool result = file.open(QIODevice::WriteOnly); + if (!result ){ + qWarning("%s: error creating file '%s' : '%s'", + __FUNCTION__, + qPrintable(filename), + qPrintable(file.errorString())); + } + return result; + } + } + +} + +struct WalletImpl +{ + + QString basename() const; + void setBasename(const QString &name); + + QString keysName() const; + QString addressName() const; + +// Bitmonero::Wallet * m_walletImpl; + QString m_basename; + QString m_seed; + QString m_password; + QString m_language; + + static QString keysName(const QString &basename); + static QString addressName(const QString &basename); + +}; + + +QString WalletImpl::basename() const +{ + return m_basename; +} + +void WalletImpl::setBasename(const QString &name) +{ + m_basename = name; +} + +QString WalletImpl::keysName() const +{ + return keysName(m_basename); +} + +QString WalletImpl::addressName() const +{ + return addressName(m_basename); +} + +QString WalletImpl::keysName(const QString &basename) +{ + return basename + ".keys"; +} + +QString WalletImpl::addressName(const QString &basename) +{ + return basename + ".address.txt"; +} + + +Wallet::Wallet(QObject *parent) + : QObject(parent) +{ + +} + +QString Wallet::getSeed() const +{ + return m_pimpl->m_seed; +} + +QString Wallet::getSeedLanguage() const +{ + return "English"; +} + +//void Wallet::setSeedLaguage(const QString &lang) +//{ +// // TODO: call libwallet's appropriate method +//} + +bool Wallet::setPassword(const QString &password) +{ + // set/change password implies: + // recovery wallet with existing path, seed and lang + qDebug("%s: recovering wallet with path=%s, seed=%s, lang=%s and new password=%s", + __FUNCTION__, + qPrintable(this->getBasename()), + qPrintable(this->getSeed()), + qPrintable(this->getSeedLanguage()), + qPrintable(password)); + return true; +} + +QString Wallet::getPassword() const +{ + return m_pimpl->m_password; +} + +bool Wallet::rename(const QString &name) +{ + + QString dst = QUrl(name).toLocalFile(); + + if (dst.isEmpty()) + dst = name; + + qDebug("%s: renaming '%s' to '%s'", + __FUNCTION__, + qPrintable(m_pimpl->basename()), + qPrintable(dst)); + + QString walletKeysFile = m_pimpl->keysName(); + QString walletAddressFile = m_pimpl->addressName(); + + QString dstWalletKeysFile = WalletImpl::keysName(dst); + QString dstWalletAddressFile = WalletImpl::addressName(dst); + + QFile walletFile(this->getBasename()); + + if (!walletFile.rename(dst)) { + qWarning("Error renaming file: '%s' to '%s' : (%s)", + qPrintable(m_pimpl->basename()), + qPrintable(dst), + qPrintable(walletFile.errorString())); + return false; + } + QFile::rename(walletKeysFile, dstWalletKeysFile); + QFile::rename(walletAddressFile, dstWalletAddressFile); + + bool result = QFile::exists(dst) && QFile::exists(dstWalletKeysFile) + && QFile::exists(dstWalletAddressFile); + + if (result) { + m_pimpl->m_basename = dst; + } + + return result; +} + +QString Wallet::getBasename() const +{ + return m_pimpl->basename(); +} + +int Wallet::error() const +{ + return 0; +} + +QString Wallet::errorString() const +{ + return m_pimpl->m_seed; +} + +Wallet::Wallet(const QString &path, const QString &password, const QString &language) +{ + m_pimpl = new WalletImpl; + m_pimpl->m_basename = path; + m_pimpl->m_password = password; + m_pimpl->m_language = language; + m_pimpl->m_seed = TEST_SEED; + + // Create dummy files for testing + QFileInfo fi(path); + QDir tempDir; + tempDir.mkpath(fi.absolutePath()); + createFileWrapper(m_pimpl->basename()); + createFileWrapper(m_pimpl->keysName()); + createFileWrapper(m_pimpl->addressName()); +} + + + diff --git a/src/libwalletqt/Wallet.h b/src/libwalletqt/Wallet.h new file mode 100644 index 00000000..221d3d43 --- /dev/null +++ b/src/libwalletqt/Wallet.h @@ -0,0 +1,44 @@ +#ifndef WALLET_H +#define WALLET_H + +#include + +struct WalletImpl; +class Wallet : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString seed READ getSeed) +public: + explicit Wallet(QObject *parent = 0); + + //! returns mnemonic seed + Q_INVOKABLE QString getSeed() const; + + //! returns seed language + Q_INVOKABLE QString getSeedLanguage() const; + + + //! changes the password using existing parameters (path, seed, seed lang) + Q_INVOKABLE bool setPassword(const QString &password); + //! returns curret wallet password + Q_INVOKABLE QString getPassword() const; + + //! renames/moves wallet files + Q_INVOKABLE bool rename(const QString &name); + + //! returns current wallet name (basename, as wallet consists of several files) + Q_INVOKABLE QString getBasename() const; + + Q_INVOKABLE int error() const; + Q_INVOKABLE QString errorString() const; + +private: + Wallet(const QString &path, const QString &password, const QString &language); + +private: + friend class WalletManager; + //! pimpl wrapper for libwallet; + WalletImpl * m_pimpl; +}; + +#endif // WALLET_H diff --git a/src/libwalletqt/WalletManager.cpp b/src/libwalletqt/WalletManager.cpp new file mode 100644 index 00000000..cb0ffbac --- /dev/null +++ b/src/libwalletqt/WalletManager.cpp @@ -0,0 +1,116 @@ +#include "WalletManager.h" +#include "Wallet.h" +#include "wallet/wallet2_api.h" +#include +#include +#include +#include +#include + +WalletManager * WalletManager::m_instance = nullptr; + + + + + +WalletManager *WalletManager::instance() +{ + if (!m_instance) { + m_instance = new WalletManager; + } + // Checking linkage (doesn't work, TODO: have every dependencies linked statically into libwallet) + Bitmonero::WalletManager * wallet_manager_impl = Bitmonero::WalletManagerFactory::getWalletManager(); + + return m_instance; +} + +Wallet *WalletManager::createWallet(const QString &path, const QString &password, + const QString &language) +{ + QFileInfo fi(path); + if (fi.exists()) { + qCritical("%s: already exists", __FUNCTION__); + // TODO: set error and error string + // return nullptr; + } + Wallet * wallet = new Wallet(path, password, language); + return wallet; +} + +Wallet *WalletManager::openWallet(const QString &path, const QString &language, const QString &password) +{ + QFileInfo fi(path); + if (fi.exists()) { + qCritical("%s: not exists", __FUNCTION__); + // TODO: set error and error string + // return nullptr; + } + // TODO: call the libwallet api here; + Wallet * wallet = new Wallet(path, password, language); + + return wallet; +} + +Wallet *WalletManager::recoveryWallet(const QString &path, const QString &memo, const QString &language) +{ + // TODO: call the libwallet api here; + + return nullptr; +} + +bool WalletManager::moveWallet(const QString &src, const QString &dst_) +{ + // TODO: move this to libwallet; + QFile walletFile(src); + if (!walletFile.exists()) { + qWarning("%s: source file [%s] doesn't exits", __FUNCTION__, + qPrintable(src)); + return false; + } + QString dst = QUrl(dst_).toLocalFile(); + QString walletKeysFile = src + ".keys"; + QString walletAddressFile = src + ".address.txt"; + + QString dstWalletKeysFile = dst + ".keys"; + QString dstWalletAddressFile = dst + ".address.txt"; + + if (!walletFile.rename(dst)) { + qWarning("Error renaming file: '%s' to '%s' : (%s)", + qPrintable(src), + qPrintable(dst), + qPrintable(walletFile.errorString())); + return false; + } + QFile::rename(walletKeysFile, dstWalletKeysFile); + QFile::rename(walletAddressFile, dstWalletAddressFile); + + return QFile::exists(dst) && QFile::exists(dstWalletKeysFile) + && QFile::exists(dstWalletAddressFile); +} + +void WalletManager::closeWallet(Wallet *wallet) +{ + delete wallet; +} + +QString WalletManager::walletLanguage(const QString &locale) +{ + return "English"; +} + +int WalletManager::error() const +{ + return 0; +} + +QString WalletManager::errorString() const +{ + return tr("Unknown error"); +} + +WalletManager::WalletManager(QObject *parent) : QObject(parent) +{ + +} + + diff --git a/src/libwalletqt/WalletManager.h b/src/libwalletqt/WalletManager.h new file mode 100644 index 00000000..231f104c --- /dev/null +++ b/src/libwalletqt/WalletManager.h @@ -0,0 +1,48 @@ +#ifndef WALLETMANAGER_H +#define WALLETMANAGER_H + +#include + +class Wallet; + +class WalletManager : public QObject +{ + Q_OBJECT +public: + static WalletManager * instance(); + // wizard: createWallet path; + Q_INVOKABLE Wallet * createWallet(const QString &path, const QString &password, + const QString &language); + // just for future use + Q_INVOKABLE Wallet * openWallet(const QString &path, const QString &language, + const QString &password); + + // wizard: recoveryWallet path; hint: internally it recorvers wallet and set password = "" + Q_INVOKABLE Wallet * recoveryWallet(const QString &path, const QString &memo, + const QString &language); + + // wizard: both "create" and "recovery" paths. + // TODO: probably move it to "Wallet" interface + Q_INVOKABLE bool moveWallet(const QString &src, const QString &dst); + + //! utils: close wallet to free memory + Q_INVOKABLE void closeWallet(Wallet * wallet); + + //! returns libwallet language name for given locale + Q_INVOKABLE QString walletLanguage(const QString &locale); + + //! returns last error happened in WalletManager + Q_INVOKABLE int error() const; + + //! returns error description in human language + Q_INVOKABLE QString errorString() const; +signals: + +public slots: + +private: + explicit WalletManager(QObject *parent = 0); + static WalletManager * m_instance; +}; + +#endif // WALLETMANAGER_H -- cgit v1.2.3