From 3b4539ee7e75779029fc77d66263c0ae164af396 Mon Sep 17 00:00:00 2001 From: Jaquee Date: Mon, 12 Dec 2016 21:39:29 +0100 Subject: [PATCH] addressbook updates --- src/wallet/api/address_book.cpp | 23 ++++++++++++----------- src/wallet/api/wallet.cpp | 17 +++++++++++------ src/wallet/wallet2.cpp | 15 +++++++++++---- src/wallet/wallet2.h | 6 +++--- src/wallet/wallet2_api.h | 6 ++++-- 5 files changed, 41 insertions(+), 26 deletions(-) diff --git a/src/wallet/api/address_book.cpp b/src/wallet/api/address_book.cpp index 198ce17cd..edeb5bb46 100644 --- a/src/wallet/api/address_book.cpp +++ b/src/wallet/api/address_book.cpp @@ -79,16 +79,16 @@ void AddressBookImpl::refresh() LOG_PRINT_L2("Refreshing addressbook"); clearRows(); - - // Fetch from Wallet2 and create vector - for (auto const &a : m_wallet->m_wallet->get_address_book() ) { - auto row = a.second; - int rowId = a.first; - - std::string payment_id = (row.m_payment_id == cryptonote::null_hash)? "" : epee::string_tools::pod_to_hex(row.m_payment_id); - std::string address = cryptonote::get_account_address_as_str(m_wallet->m_wallet->testnet(),row.m_address); - - AddressBookRow * abr = new AddressBookRow(rowId, address, payment_id, row.m_description); + + // Fetch from Wallet2 and create vector of AddressBookRow objects + std::vector rows = m_wallet->m_wallet->get_address_book(); + for (size_t i = 0; i < rows.size(); ++i) { + tools::wallet2::address_book_row * row = &rows.at(i); + + std::string payment_id = (row->m_payment_id == cryptonote::null_hash)? "" : epee::string_tools::pod_to_hex(row->m_payment_id); + std::string address = cryptonote::get_account_address_as_str(m_wallet->m_wallet->testnet(),row->m_address); + + AddressBookRow * abr = new AddressBookRow(i, address, payment_id, row->m_description); m_rows.push_back(abr); } @@ -98,7 +98,8 @@ bool AddressBookImpl::deleteRow(int rowId) { LOG_PRINT_L2("Deleting address book row " << rowId); bool r = m_wallet->m_wallet->delete_address_book_row(rowId); - refresh(); + if (r) + refresh(); return r; } diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index 0a2f0f680..5b7a3e286 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -248,7 +248,7 @@ bool WalletImpl::create(const std::string &path, const std::string &password, co if (keys_file_exists || wallet_file_exists) { m_errorString = "attempting to generate or restore wallet, but specified file(s) exist. Exiting to not risk overwriting."; LOG_ERROR(m_errorString); - m_status = Status_Error; + m_status = Status_Critical; return false; } // TODO: validate language @@ -260,7 +260,7 @@ bool WalletImpl::create(const std::string &path, const std::string &password, co m_status = Status_Ok; } catch (const std::exception &e) { LOG_ERROR("Error creating wallet: " << e.what()); - m_status = Status_Error; + m_status = Status_Critical; m_errorString = e.what(); return false; } @@ -287,7 +287,7 @@ bool WalletImpl::open(const std::string &path, const std::string &password) m_password = password; } catch (const std::exception &e) { LOG_ERROR("Error opening wallet: " << e.what()); - m_status = Status_Error; + m_status = Status_Critical; m_errorString = e.what(); } return m_status == Status_Ok; @@ -319,7 +319,7 @@ bool WalletImpl::recover(const std::string &path, const std::string &seed) // TODO: wallet->init(daemon_address); } catch (const std::exception &e) { - m_status = Status_Error; + m_status = Status_Critical; m_errorString = e.what(); } return m_status == Status_Ok; @@ -331,7 +331,12 @@ bool WalletImpl::close() bool result = false; LOG_PRINT_L3("closing wallet..."); try { - m_wallet->store(); + // Do not store wallet with invalid status + // Status Critical refers to errors on opening or creating wallets. + if (status() != Status_Critical) + m_wallet->store(); + else + LOG_PRINT_L3("Status_Critical - not storing wallet"); LOG_PRINT_L3("wallet::store done"); LOG_PRINT_L3("Calling wallet::stop..."); m_wallet->stop(); @@ -339,7 +344,7 @@ bool WalletImpl::close() result = true; clearStatus(); } catch (const std::exception &e) { - m_status = Status_Error; + m_status = Status_Critical; m_errorString = e.what(); LOG_ERROR("Error closing wallet: " << e.what()); } diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 3dafa56f0..60fa1d266 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1569,13 +1569,20 @@ bool wallet2::add_address_book_row(const cryptonote::account_public_address &add a.m_payment_id = payment_id; a.m_description = description; - int key = (m_address_book.empty())? 0 : m_address_book.rbegin()->first; - bool r = m_address_book.emplace(++key,a).second; - return r; + int old_size = m_address_book.size(); + m_address_book.push_back(a); + if(m_address_book.size() == old_size+1) + return true; + return false; } bool wallet2::delete_address_book_row(int row_id) { - return (m_address_book.erase(row_id) > 0); + if(m_address_book.size() <= row_id) + return false; + + m_address_book.erase(m_address_book.begin()+row_id); + + return true; } //---------------------------------------------------------------------------------------------------- diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index fc06864e2..36b9b3d1f 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -292,7 +292,7 @@ namespace tools { cryptonote::account_public_address m_address; crypto::hash m_payment_id; - std::string m_description; + std::string m_description; }; /*! @@ -523,7 +523,7 @@ namespace tools /*! * \brief GUI Address book get/store */ - std::map get_address_book() const { return m_address_book; } + std::vector get_address_book() const { return m_address_book; } bool add_address_book_row(const cryptonote::account_public_address &address, const crypto::hash &payment_id, const std::string &description); bool delete_address_book_row(int row_id); @@ -641,7 +641,7 @@ namespace tools std::unordered_map m_pub_keys; cryptonote::account_public_address m_account_public_address; std::unordered_map m_tx_notes; - std::map m_address_book; + std::vector m_address_book; uint64_t m_upper_transaction_size_limit; //TODO: auto-calc this value or request from daemon, now use some fixed value std::atomic m_run; diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h index 86a24fa59..2e19f36cd 100644 --- a/src/wallet/wallet2_api.h +++ b/src/wallet/wallet2_api.h @@ -63,7 +63,8 @@ struct PendingTransaction { enum Status { Status_Ok, - Status_Error + Status_Error, + Status_Critical }; enum Priority { @@ -221,7 +222,8 @@ struct Wallet enum Status { Status_Ok, - Status_Error + Status_Error, + Status_Critical }; enum ConnectionStatus {