diff --git a/src/DataStore.h b/src/DataStore.h new file mode 100644 index 0000000..19daa1b --- /dev/null +++ b/src/DataStore.h @@ -0,0 +1,58 @@ +#ifndef DATASTORE_H +#define DATASTORE_H + +#include +#include + +template +class DataStore +{ + private: + static bool instanced; + static DataStore* instance; + std::map data; + DataStore() + { + + } + + public: + static DataStore* getInstance() + { + if(!DataStore::instanced) + { + DataStore::instanced = true; + DataStore::instance = new DataStore(); + } + + return DataStore::instance; + } + + void clear(); + void setData(QString key, T value); + QString getData(QString key); + + ~DataStore() + { + DataStore::instanced = false; + } +}; + +template +void DataStore::clear() +{ + this->data.clear(); +} + +template +void DataStore::setData(QString key, T value) +{ + this->data[key] = value; +} + +template +QString DataStore::getData(QString key) +{ + return this->data[key]; +} +#endif \ No newline at end of file diff --git a/src/controller.cpp b/src/controller.cpp index e3abb1b..18a158e 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -5,7 +5,11 @@ #include "version.h" #include "camount.h" #include "websockets.h" - +#include "DataStore.h" +template<> +DataStore* DataStore::instance = nullptr; +template<> +bool DataStore::instanced = false; using json = nlohmann::json; @@ -60,7 +64,6 @@ Controller::~Controller() delete zrpc; } - // Called when a connection to hushd is available. void Controller::setConnection(Connection* c) { @@ -83,27 +86,12 @@ void Controller::setConnection(Connection* c) refresh(true); // Create Sietch zdust addr at startup. + // Using DataStore singelton, to store the data outside of lambda, bing bada boom :D for(uint8_t i = 0; i < 10; i++) { zrpc->createNewSietchZaddr( [=] (json reply) { - QString path = ""; - if(i > 0) - path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/Sietch") + QString(i) + QString(".txt"); - - else - path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/Sietch.txt"); - - QFile file(path); - QString zdust = QString::fromStdString(reply.get()[0]); - if(!file.open(QIODevice::WriteOnly)) - { - file.close(); - } - else - { - QTextStream out(&file); out << zdust.toUtf8(); - file.close(); - } + QString zdust = QString::fromStdString(reply.get()[0]); + DataStore::getInstance()->setData("Sietch" + QString(i), zdust.toUtf8()); }); } } @@ -121,67 +109,32 @@ void Controller::fillTxJsonParams(json& allRecepients, Tx tx) dust.resize(10, json::object()); // Create Sietch zdust addr again to not use it twice. + // Using DataStore singelton, to store the data outside of lambda, bing bada boom :D for(uint8_t i = 0; i < 10; i++) { zrpc->createNewSietchZaddr( [=] (json reply) { - QString path = ""; - if(i > 0) - path= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/Sietch") + QString(i) + QString(".txt"); - - else - path= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/Sietch.txt"); - - QFile file(path); - QString zdust = QString::fromStdString(reply.get()[0]); - if(!file.open(QIODevice::WriteOnly)) - { - file.close(); - } else { - QTextStream out(&file); out << zdust.toUtf8(); - file.close(); - } + QString zdust = QString::fromStdString(reply.get()[0]); + DataStore::getInstance()->setData(QString("Sietch") + QString(i), zdust.toUtf8()); } ); } - - - // Set sietch zdust addr to json. + // Using DataStore singelton, to store the data into the dusts, bing bada boom :D for(uint8_t i = 0; i < 10; i++) { - QString path = ""; - if(i > 0) - path= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/Sietch") + QString(i) + QString(".txt"); - - else - path= QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + QString("/Sietch.txt"); - - QFile inputFile(path); - if (inputFile.open(QIODevice::ReadOnly)) - { - QTextStream in(&inputFile); - while (!in.atEnd()) - { - QString line = in.readLine(); - dust.at(i)["address"] = line.toStdString(); - } - - inputFile.close(); - } + dust.at(i)["address"] = DataStore::getInstance()->getData(QString("Sietch" + QString(i))).toStdString(); } - + DataStore::getInstance()->clear(); // clears the datastore // Dust amt/memo, construct the JSON for(uint8_t i = 0; i < 10; i++) { - printf("Setting amount and memo to 0 for dust%i \n", i); dust.at(i)["amount"] = 0; dust.at(i)["memo"] = ""; } - // For each addr/amt/memo, construct the JSON and also build the confirm dialog box for (int i=0; i < tx.toAddrs.size(); i++) { @@ -310,7 +263,7 @@ void Controller::getInfoThenRefresh(bool force) ); ui->last_notarized->setText( "Block: " + QLocale(QLocale::German).toString(notarized) - ); + ); ui->longestchain->setText( "Block: " + QLocale(QLocale::German).toString(longestchain) ); @@ -342,9 +295,15 @@ void Controller::getInfoThenRefresh(bool force) ); } - ui->Version->setText(QString::fromStdString(reply["version"].get())); - ui->Vendor->setText(QString::fromStdString(reply["vendor"].get())); - main->logger->write(QString("Refresh. curblock ") % QString::number(curBlock) % ", update=" % (doUpdate ? "true" : "false") ); + ui->Version->setText( + QString::fromStdString(reply["version"].get()) + ); + ui->Vendor->setText( + QString::fromStdString(reply["vendor"].get()) + ); + main->logger->write( + QString("Refresh. curblock ") % QString::number(curBlock) % ", update=" % (doUpdate ? "true" : "false") + ); // Connected, so display checkmark. auto tooltip = Settings::getInstance()->getSettings().server + "\n" + @@ -355,99 +314,194 @@ void Controller::getInfoThenRefresh(bool force) // use currency ComboBox as input - if (Settings::getInstance()->get_currency_name() == "USD") { - double price = Settings::getInstance()->getZECPrice(); - double volume = Settings::getInstance()->getUSDVolume(); - double cap = Settings::getInstance()->getUSDCAP(); - main->statusLabel->setText(" HUSH/USD=$ " + (QLocale(QLocale::English).toString(price,'f', 2))); - ui->volumeExchange->setText(" $ " + (QLocale(QLocale::English).toString(volume,'f', 2))); - ui->marketcapTab->setText(" $ " + (QLocale(QLocale::English).toString(cap,'f', 2))); + if (Settings::getInstance()->get_currency_name() == "USD") + { + double price = Settings::getInstance()->getZECPrice(); + double volume = Settings::getInstance()->getUSDVolume(); + double cap = Settings::getInstance()->getUSDCAP(); + main->statusLabel->setText( + " HUSH/USD=$ " + (QLocale(QLocale::English).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " $ " + (QLocale(QLocale::English).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " $ " + (QLocale(QLocale::English).toString(cap,'f', 2)) + ); - } else if (Settings::getInstance()->get_currency_name() == "EUR") { - double price = Settings::getInstance()->getEURPrice(); - double volume = Settings::getInstance()->getEURVolume(); - double cap = Settings::getInstance()->getEURCAP(); - main->statusLabel->setText("HUSH/EUR "+(QLocale(QLocale::German).toString(price,'f', 2))+ " €"); - ui->volumeExchange->setText(QLocale(QLocale::German).toString(volume,'f', 2)+ " €"); - ui->marketcapTab->setText(QLocale(QLocale::German).toString(cap,'f', 2)+ " €"); + } + else if (Settings::getInstance()->get_currency_name() == "EUR") + { + double price = Settings::getInstance()->getEURPrice(); + double volume = Settings::getInstance()->getEURVolume(); + double cap = Settings::getInstance()->getEURCAP(); + main->statusLabel->setText( + "HUSH/EUR "+(QLocale(QLocale::German).toString(price,'f', 2))+ " €" + ); + ui->volumeExchange->setText( + QLocale(QLocale::German).toString(volume,'f', 2)+ " €" + ); + ui->marketcapTab->setText( + QLocale(QLocale::German).toString(cap,'f', 2)+ " €" + ); - } else if (Settings::getInstance()->get_currency_name() == "BTC") { - double price = Settings::getInstance()->getBTCPrice(); - double volume = Settings::getInstance()->getBTCVolume(); - double cap = Settings::getInstance()->getBTCCAP(); - main->statusLabel->setText(" HUSH/BTC=BTC " + (QLocale(QLocale::English).toString(price, 'f',8))); - ui->volumeExchange->setText(" BTC " + (QLocale(QLocale::English).toString(volume, 'f',8))); - ui->marketcapTab->setText(" BTC " + (QLocale(QLocale::English).toString(cap, 'f',8))); + } + else if (Settings::getInstance()->get_currency_name() == "BTC") + { + double price = Settings::getInstance()->getBTCPrice(); + double volume = Settings::getInstance()->getBTCVolume(); + double cap = Settings::getInstance()->getBTCCAP(); + main->statusLabel->setText( + " HUSH/BTC=BTC " + (QLocale(QLocale::English).toString(price, 'f',8)) + ); + ui->volumeExchange->setText( + " BTC " + (QLocale(QLocale::English).toString(volume, 'f',8)) + ); + ui->marketcapTab->setText( + " BTC " + (QLocale(QLocale::English).toString(cap, 'f',8)) + ); - } else if (Settings::getInstance()->get_currency_name() == "CNY") { - double price = Settings::getInstance()->getCNYPrice(); - double volume = Settings::getInstance()->getCNYVolume(); - double cap = Settings::getInstance()->getCNYCAP(); - main->statusLabel->setText(" HUSH/CNY=¥ /元 " + (QLocale(QLocale::Chinese).toString(price,'f', 2))); - ui->volumeExchange->setText(" ¥ /元 " + (QLocale(QLocale::Chinese).toString(volume,'f', 2))); - ui->marketcapTab->setText(" ¥ /元 " + (QLocale(QLocale::Chinese).toString(cap,'f', 2))); + } + else if (Settings::getInstance()->get_currency_name() == "CNY") + { + double price = Settings::getInstance()->getCNYPrice(); + double volume = Settings::getInstance()->getCNYVolume(); + double cap = Settings::getInstance()->getCNYCAP(); + main->statusLabel->setText( + " HUSH/CNY=¥ /元 " + (QLocale(QLocale::Chinese).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " ¥ /元 " + (QLocale(QLocale::Chinese).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " ¥ /元 " + (QLocale(QLocale::Chinese).toString(cap,'f', 2)) + ); - } else if (Settings::getInstance()->get_currency_name() == "RUB") { - double price = Settings::getInstance()->getRUBPrice(); - double volume = Settings::getInstance()->getRUBVolume(); - double cap = Settings::getInstance()->getRUBCAP(); - main->statusLabel->setText(" HUSH/RUB=₽ " + (QLocale(QLocale::German).toString(price,'f', 2))); - ui->volumeExchange->setText(" ₽ " + (QLocale(QLocale::German).toString(volume,'f', 2))); - ui->marketcapTab->setText(" ₽ " + (QLocale(QLocale::German).toString(cap,'f', 2))); + } + else if (Settings::getInstance()->get_currency_name() == "RUB") + { + double price = Settings::getInstance()->getRUBPrice(); + double volume = Settings::getInstance()->getRUBVolume(); + double cap = Settings::getInstance()->getRUBCAP(); + main->statusLabel->setText( + " HUSH/RUB=₽ " + (QLocale(QLocale::German).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " ₽ " + (QLocale(QLocale::German).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " ₽ " + (QLocale(QLocale::German).toString(cap,'f', 2)) + ); - } else if (Settings::getInstance()->get_currency_name() == "CAD") { - double price = Settings::getInstance()->getCADPrice(); - double volume = Settings::getInstance()->getCADVolume(); - double cap = Settings::getInstance()->getCADCAP(); - main->statusLabel->setText(" HUSH/CAD=$ " + (QLocale(QLocale::English).toString(price,'f', 2))); - ui->volumeExchange->setText(" $ " + (QLocale(QLocale::English).toString(volume,'f', 2))); - ui->marketcapTab->setText(" $ " + (QLocale(QLocale::English).toString(cap,'f', 2))); + } + else if (Settings::getInstance()->get_currency_name() == "CAD") + { + double price = Settings::getInstance()->getCADPrice(); + double volume = Settings::getInstance()->getCADVolume(); + double cap = Settings::getInstance()->getCADCAP(); + main->statusLabel->setText( + " HUSH/CAD=$ " + (QLocale(QLocale::English).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " $ " + (QLocale(QLocale::English).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " $ " + (QLocale(QLocale::English).toString(cap,'f', 2)) + ); - } else if (Settings::getInstance()->get_currency_name() == "SGD") { - double price = Settings::getInstance()->getSGDPrice(); - double volume = Settings::getInstance()->getSGDVolume(); - double cap = Settings::getInstance()->getSGDCAP(); - main->statusLabel->setText(" HUSH/SGD=$ " + (QLocale(QLocale::English).toString(price,'f', 2))); - ui->volumeExchange->setText(" $ " + (QLocale(QLocale::English).toString(volume,'f', 2))); - ui->marketcapTab->setText(" $ " + (QLocale(QLocale::English).toString(cap,'f', 2))); + } + else if (Settings::getInstance()->get_currency_name() == "SGD") + { + double price = Settings::getInstance()->getSGDPrice(); + double volume = Settings::getInstance()->getSGDVolume(); + double cap = Settings::getInstance()->getSGDCAP(); + main->statusLabel->setText( + " HUSH/SGD=$ " + (QLocale(QLocale::English).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " $ " + (QLocale(QLocale::English).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " $ " + (QLocale(QLocale::English).toString(cap,'f', 2)) + ); - } else if (Settings::getInstance()->get_currency_name() == "CHF") { - double price = Settings::getInstance()->getCHFPrice(); - double volume = Settings::getInstance()->getCHFVolume(); - double cap = Settings::getInstance()->getCHFCAP(); - main->statusLabel->setText(" HUSH/CHF= " + (QLocale(QLocale::German).toString(price,'f', 2))+ " CHF"); - ui->volumeExchange->setText(QLocale(QLocale::German).toString(volume,'f', 2)+ " CHF"); - ui->marketcapTab->setText(QLocale(QLocale::German).toString(cap,'f', 2)+ " CHF"); + } + else if (Settings::getInstance()->get_currency_name() == "CHF") + { + double price = Settings::getInstance()->getCHFPrice(); + double volume = Settings::getInstance()->getCHFVolume(); + double cap = Settings::getInstance()->getCHFCAP(); + main->statusLabel->setText( + " HUSH/CHF= " + (QLocale(QLocale::German).toString(price,'f', 2))+ " CHF" + ); + ui->volumeExchange->setText( + QLocale(QLocale::German).toString(volume,'f', 2)+ " CHF" + ); + ui->marketcapTab->setText( + QLocale(QLocale::German).toString(cap,'f', 2)+ " CHF" + ); - } else if (Settings::getInstance()->get_currency_name() == "INR") { - double price = Settings::getInstance()->getINRPrice(); - double volume = Settings::getInstance()->getINRVolume(); - double cap = Settings::getInstance()->getINRCAP(); - main->statusLabel->setText(" HUSH/INR=₹ " + (QLocale(QLocale::English).toString(price,'f', 2))); - ui->volumeExchange->setText(" ₹ " + (QLocale(QLocale::English).toString(volume,'f', 2))); - ui->marketcapTab->setText(" ₹ " + (QLocale(QLocale::English).toString(cap,'f', 2))); + } + else if (Settings::getInstance()->get_currency_name() == "INR") + { + double price = Settings::getInstance()->getINRPrice(); + double volume = Settings::getInstance()->getINRVolume(); + double cap = Settings::getInstance()->getINRCAP(); + main->statusLabel->setText( + " HUSH/INR=₹ " + (QLocale(QLocale::English).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " ₹ " + (QLocale(QLocale::English).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " ₹ " + (QLocale(QLocale::English).toString(cap,'f', 2)) + ); - } else if (Settings::getInstance()->get_currency_name() == "GBP") { - double price = Settings::getInstance()->getGBPPrice(); - double volume = Settings::getInstance()->getGBPVolume(); - double cap = Settings::getInstance()->getGBPCAP(); - main->statusLabel->setText(" HUSH/GBP=£ " + (QLocale(QLocale::English).toString(price,'f', 2))); - ui->volumeExchange->setText(" £ " + (QLocale(QLocale::English).toString(volume,'f', 2))); - ui->marketcapTab->setText(" £ " + (QLocale(QLocale::English).toString(cap,'f', 2))); + } + else if (Settings::getInstance()->get_currency_name() == "GBP") + { + double price = Settings::getInstance()->getGBPPrice(); + double volume = Settings::getInstance()->getGBPVolume(); + double cap = Settings::getInstance()->getGBPCAP(); + main->statusLabel->setText( + " HUSH/GBP=£ " + (QLocale(QLocale::English).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " £ " + (QLocale(QLocale::English).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " £ " + (QLocale(QLocale::English).toString(cap,'f', 2)) + ); - }else if (Settings::getInstance()->get_currency_name() == "AUD") { - double price = Settings::getInstance()->getAUDPrice(); - double volume = Settings::getInstance()->getAUDVolume(); - double cap = Settings::getInstance()->getAUDCAP(); - main->statusLabel->setText(" HUSH/AUD=$ " + (QLocale(QLocale::English).toString(price,'f', 2))); - ui->volumeExchange->setText(" $ " + (QLocale(QLocale::English).toString(volume,'f', 2))); - ui->marketcapTab->setText(" $ " + (QLocale(QLocale::English).toString(cap,'f', 2))); - - } else { - main->statusLabel->setText(" HUSH/USD=$" + QString::number(Settings::getInstance()->getZECPrice(),'f',2 )); - ui->volumeExchange->setText(" $ " + QString::number((double) Settings::getInstance()->getUSDVolume() ,'f',2)); - ui->marketcapTab->setText(" $ " + QString::number((double) Settings::getInstance()->getUSDCAP() ,'f',2)); - } + } + else if (Settings::getInstance()->get_currency_name() == "AUD") + { + double price = Settings::getInstance()->getAUDPrice(); + double volume = Settings::getInstance()->getAUDVolume(); + double cap = Settings::getInstance()->getAUDCAP(); + main->statusLabel->setText( + " HUSH/AUD=$ " + (QLocale(QLocale::English).toString(price,'f', 2)) + ); + ui->volumeExchange->setText( + " $ " + (QLocale(QLocale::English).toString(volume,'f', 2)) + ); + ui->marketcapTab->setText( + " $ " + (QLocale(QLocale::English).toString(cap,'f', 2)) + ); + + } + else + { + main->statusLabel->setText( + " HUSH/USD=$" + QString::number(Settings::getInstance()->getZECPrice(),'f',2 ) + ); + ui->volumeExchange->setText( + " $ " + QString::number((double) Settings::getInstance()->getUSDVolume() ,'f',2) + ); + ui->marketcapTab->setText( + " $ " + QString::number((double) Settings::getInstance()->getUSDCAP() ,'f',2) + ); + } main->statusLabel->setToolTip(tooltip); main->statusIcon->setPixmap(i.pixmap(16, 16)); main->statusIcon->setToolTip(tooltip); @@ -458,29 +512,34 @@ void Controller::getInfoThenRefresh(bool force) zrpc->fetchWalletEncryptionStatus([=] (const json& reply) { bool isEncrypted = reply["encrypted"].get(); bool isLocked = reply["locked"].get(); - model->setEncryptionStatus(isEncrypted, isLocked); }); // Get the total supply and render it with thousand decimal zrpc->fetchSupply([=] (const json& reply) { - - int supply = reply["supply"].get(); - int zfunds = reply["zfunds"].get(); - int total = reply["total"].get(); + int supply = reply["supply"].get(); + int zfunds = reply["zfunds"].get(); + int total = reply["total"].get(); + if ( + Settings::getInstance()->get_currency_name() == "EUR" || + Settings::getInstance()->get_currency_name() == "CHF" || + Settings::getInstance()->get_currency_name() == "RUB" + ) + { + ui->supply_taddr->setText((QLocale(QLocale::German).toString(supply)+ " Hush")); + ui->supply_zaddr->setText((QLocale(QLocale::German).toString(zfunds)+ " Hush")); + ui->supply_total->setText((QLocale(QLocale::German).toString(total)+ " Hush")); + } + else + { + ui->supply_taddr->setText("Hush " + (QLocale(QLocale::English).toString(supply))); + ui->supply_zaddr->setText("Hush " +(QLocale(QLocale::English).toString(zfunds))); + ui->supply_total->setText("Hush " +(QLocale(QLocale::English).toString(total))); + } - if (Settings::getInstance()->get_currency_name() == "EUR" || Settings::getInstance()->get_currency_name() == "CHF" || Settings::getInstance()->get_currency_name() == "RUB") { - ui->supply_taddr->setText((QLocale(QLocale::German).toString(supply)+ " Hush")); - ui->supply_zaddr->setText((QLocale(QLocale::German).toString(zfunds)+ " Hush")); - ui->supply_total->setText((QLocale(QLocale::German).toString(total)+ " Hush"));} - else{ - ui->supply_taddr->setText("Hush " + (QLocale(QLocale::English).toString(supply))); - ui->supply_zaddr->setText("Hush " +(QLocale(QLocale::English).toString(zfunds))); - ui->supply_total->setText("Hush " +(QLocale(QLocale::English).toString(total)));} + }); - - }); - - if ( doUpdate ) { + if ( doUpdate ) + { // Something changed, so refresh everything. refreshBalances(); refreshAddresses(); // This calls refreshZSentTransactions() and refreshReceivedZTrans() @@ -492,10 +551,15 @@ void Controller::getInfoThenRefresh(bool force) // Prevent multiple dialog boxes, because these are called async static bool shown = false; - if (!shown && prevCallSucceeded) { // show error only first time + if (!shown && prevCallSucceeded) // show error only first time + { shown = true; - QMessageBox::critical(main, QObject::tr("Connection Error"), QObject::tr("There was an error connecting to hushd. The error was") + ": \n\n" - + err, QMessageBox::StandardButton::Ok); + QMessageBox::critical( + main, + QObject::tr("Connection Error"), + QObject::tr("There was an error connecting to hushd. The error was") + ": \n\n"+ err, + QMessageBox::StandardButton::Ok + ); shown = false; } @@ -503,32 +567,31 @@ void Controller::getInfoThenRefresh(bool force) }); } -void Controller::refreshAddresses() { +void Controller::refreshAddresses() +{ if (!zrpc->haveConnection()) return noConnection(); auto newzaddresses = new QList(); auto newtaddresses = new QList(); - - zrpc->fetchAddresses([=] (json reply) { auto zaddrs = reply["z_addresses"].get(); - for (auto& it : zaddrs) { + for (auto& it : zaddrs) + { auto addr = QString::fromStdString(it.get()); newzaddresses->push_back(addr); } model->replaceZaddresses(newzaddresses); - auto taddrs = reply["t_addresses"].get(); - for (auto& it : taddrs) { + for (auto& it : taddrs) + { auto addr = QString::fromStdString(it.get()); if (Settings::isTAddress(addr)) newtaddresses->push_back(addr); } model->replaceTaddresses(newtaddresses); - // Refresh the sent and received txs from all these z-addresses refreshTransactions(); }); @@ -536,17 +599,23 @@ void Controller::refreshAddresses() { } // Function to create the data model and update the views, used below. -void Controller::updateUI(bool anyUnconfirmed) { +void Controller::updateUI(bool anyUnconfirmed) +{ ui->unconfirmedWarning->setVisible(anyUnconfirmed); - // Update balances model data, which will update the table too - balancesTableModel->setNewData(model->getAllZAddresses(), model->getAllTAddresses(), model->getAllBalances(), model->getUTXOs()); + balancesTableModel->setNewData( + model->getAllZAddresses(), + model->getAllTAddresses(), + model->getAllBalances(), + model->getUTXOs() + ); }; // Function to process reply of the listunspent and z_listunspent API calls, used below. void Controller::processUnspent(const json& reply, QMap* balancesMap, QList* unspentOutputs) { auto processFn = [=](const json& array) { - for (auto& it : array) { + for (auto& it : array) + { QString qsAddr = QString::fromStdString(it["address"]); int block = it["created_in_block"].get(); QString txid = QString::fromStdString(it["created_in_txid"]); @@ -555,8 +624,11 @@ void Controller::processUnspent(const json& reply, QMap* balan bool spendable = it["unconfirmed_spent"].is_null() && it["spent"].is_null(); // TODO: Wait for 4 confirmations bool pending = !it["unconfirmed_spent"].is_null(); - unspentOutputs->push_back(UnspentOutput{ qsAddr, txid, amount, block, spendable, pending }); - if (spendable) { + unspentOutputs->push_back( + UnspentOutput{ qsAddr, txid, amount, block, spendable, pending } + ); + if (spendable) + { (*balancesMap)[qsAddr] = (*balancesMap)[qsAddr] + CAmount::fromqint64(it["value"].get()); } @@ -569,7 +641,8 @@ void Controller::processUnspent(const json& reply, QMap* balan processFn(reply["pending_utxos"].get()); }; -void Controller::updateUIBalances() { +void Controller::updateUIBalances() +{ CAmount balT = getModel()->getBalT(); CAmount balZ = getModel()->getBalZ(); CAmount balVerified = getModel()->getBalVerified(); @@ -580,112 +653,141 @@ void Controller::updateUIBalances() { CAmount balTotal = balT + balZ; CAmount balAvailable = balT + balVerified; - if (balZ < 0) { + if (balZ < 0) balZ = CAmount::fromqint64(0); - } // Balances table - ui->balSheilded ->setText(balZ.toDecimalhushString()); - ui->balVerified ->setText(balVerified.toDecimalhushString()); + ui->balSheilded->setText(balZ.toDecimalhushString()); + ui->balVerified->setText(balVerified.toDecimalhushString()); ui->balTransparent->setText(balT.toDecimalhushString()); - ui->balTotal ->setText(balTotal.toDecimalhushString()); + ui->balTotal->setText(balTotal.toDecimalhushString()); - if (Settings::getInstance()->get_currency_name() == "USD") { - ui->balSheilded ->setToolTip(balZ.toDecimalUSDString()); - ui->balVerified ->setToolTip(balVerified.toDecimalUSDString()); - ui->balTransparent->setToolTip(balT.toDecimalUSDString()); - ui->balTotal ->setToolTip(balTotal.toDecimalUSDString()); + if (Settings::getInstance()->get_currency_name() == "USD") + { + ui->balSheilded->setToolTip(balZ.toDecimalUSDString()); + ui->balVerified->setToolTip(balVerified.toDecimalUSDString()); + ui->balTransparent->setToolTip(balT.toDecimalUSDString()); + ui->balTotal->setToolTip(balTotal.toDecimalUSDString()); - } else if (Settings::getInstance()->get_currency_name() == "EUR") { - ui->balSheilded ->setToolTip(balZ.toDecimalEURString()); - ui->balVerified ->setToolTip(balVerified.toDecimalEURString()); - ui->balTransparent->setToolTip(balT.toDecimalEURString()); - ui->balTotal ->setToolTip(balTotal.toDecimalEURString()); + } + else if (Settings::getInstance()->get_currency_name() == "EUR") + { + ui->balSheilded->setToolTip(balZ.toDecimalEURString()); + ui->balVerified->setToolTip(balVerified.toDecimalEURString()); + ui->balTransparent->setToolTip(balT.toDecimalEURString()); + ui->balTotal->setToolTip(balTotal.toDecimalEURString()); + + } + else if (Settings::getInstance()->get_currency_name() == "BTC") + { + ui->balSheilded->setToolTip(balZ.toDecimalBTCString()); + ui->balVerified->setToolTip(balVerified.toDecimalBTCString()); + ui->balTransparent->setToolTip(balT.toDecimalBTCString()); + ui->balTotal->setToolTip(balTotal.toDecimalBTCString()); + } + else if (Settings::getInstance()->get_currency_name() == "CNY") + { + ui->balSheilded->setToolTip(balZ.toDecimalCNYString()); + ui->balVerified->setToolTip(balVerified.toDecimalCNYString()); + ui->balTransparent->setToolTip(balT.toDecimalCNYString()); + ui->balTotal->setToolTip(balTotal.toDecimalCNYString()); - } else if (Settings::getInstance()->get_currency_name() == "BTC") { - ui->balSheilded ->setToolTip(balZ.toDecimalBTCString()); - ui->balVerified ->setToolTip(balVerified.toDecimalBTCString()); - ui->balTransparent->setToolTip(balT.toDecimalBTCString()); - ui->balTotal ->setToolTip(balTotal.toDecimalBTCString()); - - } else if (Settings::getInstance()->get_currency_name() == "CNY") { - ui->balSheilded ->setToolTip(balZ.toDecimalCNYString()); - ui->balVerified ->setToolTip(balVerified.toDecimalCNYString()); - ui->balTransparent->setToolTip(balT.toDecimalCNYString()); - ui->balTotal ->setToolTip(balTotal.toDecimalCNYString()); + } + else if (Settings::getInstance()->get_currency_name() == "RUB") + { + ui->balSheilded->setToolTip(balZ.toDecimalRUBString()); + ui->balVerified->setToolTip(balVerified.toDecimalRUBString()); + ui->balTransparent->setToolTip(balT.toDecimalRUBString()); + ui->balTotal->setToolTip(balTotal.toDecimalRUBString()); - } else if (Settings::getInstance()->get_currency_name() == "RUB") { - ui->balSheilded ->setToolTip(balZ.toDecimalRUBString()); - ui->balVerified ->setToolTip(balVerified.toDecimalRUBString()); - ui->balTransparent->setToolTip(balT.toDecimalRUBString()); - ui->balTotal ->setToolTip(balTotal.toDecimalRUBString()); + } + else if (Settings::getInstance()->get_currency_name() == "CAD") + { + ui->balSheilded->setToolTip(balZ.toDecimalCADString()); + ui->balVerified->setToolTip(balVerified.toDecimalCADString()); + ui->balTransparent->setToolTip(balT.toDecimalCADString()); + ui->balTotal->setToolTip(balTotal.toDecimalCADString()); - } else if (Settings::getInstance()->get_currency_name() == "CAD") { - ui->balSheilded ->setToolTip(balZ.toDecimalCADString()); - ui->balVerified ->setToolTip(balVerified.toDecimalCADString()); - ui->balTransparent->setToolTip(balT.toDecimalCADString()); - ui->balTotal ->setToolTip(balTotal.toDecimalCADString()); + } + else if (Settings::getInstance()->get_currency_name() == "SGD") + { + ui->balSheilded->setToolTip(balZ.toDecimalSGDString()); + ui->balVerified->setToolTip(balVerified.toDecimalSGDString()); + ui->balTransparent->setToolTip(balT.toDecimalSGDString()); + ui->balTotal->setToolTip(balTotal.toDecimalSGDString()); - } else if (Settings::getInstance()->get_currency_name() == "SGD") { - ui->balSheilded ->setToolTip(balZ.toDecimalSGDString()); - ui->balVerified ->setToolTip(balVerified.toDecimalSGDString()); - ui->balTransparent->setToolTip(balT.toDecimalSGDString()); - ui->balTotal ->setToolTip(balTotal.toDecimalSGDString()); + } + else if (Settings::getInstance()->get_currency_name() == "CHF") + { + ui->balSheilded->setToolTip(balZ.toDecimalCHFString()); + ui->balVerified->setToolTip(balVerified.toDecimalCHFString()); + ui->balTransparent->setToolTip(balT.toDecimalCHFString()); + ui->balTotal->setToolTip(balTotal.toDecimalCHFString()); - } else if (Settings::getInstance()->get_currency_name() == "CHF") { - ui->balSheilded ->setToolTip(balZ.toDecimalCHFString()); - ui->balVerified ->setToolTip(balVerified.toDecimalCHFString()); - ui->balTransparent->setToolTip(balT.toDecimalCHFString()); - ui->balTotal ->setToolTip(balTotal.toDecimalCHFString()); + } + else if (Settings::getInstance()->get_currency_name() == "INR") + { + ui->balSheilded->setToolTip(balZ.toDecimalINRString()); + ui->balVerified->setToolTip(balVerified.toDecimalINRString()); + ui->balTransparent->setToolTip(balT.toDecimalINRString()); + ui->balTotal->setToolTip(balTotal.toDecimalINRString()); - } else if (Settings::getInstance()->get_currency_name() == "INR") { - ui->balSheilded ->setToolTip(balZ.toDecimalINRString()); - ui->balVerified ->setToolTip(balVerified.toDecimalINRString()); - ui->balTransparent->setToolTip(balT.toDecimalINRString()); - ui->balTotal ->setToolTip(balTotal.toDecimalINRString()); + } + else if (Settings::getInstance()->get_currency_name() == "GBP") + { + ui->balSheilded ->setToolTip(balZ.toDecimalGBPString()); + ui->balVerified ->setToolTip(balVerified.toDecimalGBPString()); + ui->balTransparent->setToolTip(balT.toDecimalGBPString()); + ui->balTotal ->setToolTip(balTotal.toDecimalGBPString()); - } else if (Settings::getInstance()->get_currency_name() == "GBP") { - ui->balSheilded ->setToolTip(balZ.toDecimalGBPString()); - ui->balVerified ->setToolTip(balVerified.toDecimalGBPString()); - ui->balTransparent->setToolTip(balT.toDecimalGBPString()); - ui->balTotal ->setToolTip(balTotal.toDecimalGBPString()); - - } else if (Settings::getInstance()->get_currency_name() == "AUD") { - ui->balSheilded ->setToolTip(balZ.toDecimalAUDString()); - ui->balVerified ->setToolTip(balVerified.toDecimalAUDString()); - ui->balTransparent->setToolTip(balT.toDecimalAUDString()); - ui->balTotal ->setToolTip(balTotal.toDecimalAUDString()); + } + else if (Settings::getInstance()->get_currency_name() == "AUD") + { + ui->balSheilded ->setToolTip(balZ.toDecimalAUDString()); + ui->balVerified ->setToolTip(balVerified.toDecimalAUDString()); + ui->balTransparent->setToolTip(balT.toDecimalAUDString()); + ui->balTotal ->setToolTip(balTotal.toDecimalAUDString()); } // Send tab ui->txtAvailablehush->setText(balAvailable.toDecimalhushString()); - if (Settings::getInstance()->get_currency_name() == "USD") { + if (Settings::getInstance()->get_currency_name() == "USD") ui->txtAvailableUSD->setText(balAvailable.toDecimalUSDString()); - } else if (Settings::getInstance()->get_currency_name() == "EUR") { + + else if (Settings::getInstance()->get_currency_name() == "EUR") ui->txtAvailableUSD->setText(balAvailable.toDecimalEURString()); - } else if (Settings::getInstance()->get_currency_name() == "BTC") { + + else if (Settings::getInstance()->get_currency_name() == "BTC") ui->txtAvailableUSD->setText(balAvailable.toDecimalBTCString()); - } else if (Settings::getInstance()->get_currency_name() == "CNY") { + + else if (Settings::getInstance()->get_currency_name() == "CNY") ui->txtAvailableUSD->setText(balAvailable.toDecimalCNYString()); - } else if (Settings::getInstance()->get_currency_name() == "RUB") { + + else if (Settings::getInstance()->get_currency_name() == "RUB") ui->txtAvailableUSD->setText(balAvailable.toDecimalRUBString()); - } else if (Settings::getInstance()->get_currency_name() == "CAD") { + + else if (Settings::getInstance()->get_currency_name() == "CAD") ui->txtAvailableUSD->setText(balAvailable.toDecimalCADString()); - } else if (Settings::getInstance()->get_currency_name() == "SGD") { - ui->txtAvailableUSD->setText(balAvailable.toDecimalSGDString()); - } else if (Settings::getInstance()->get_currency_name() == "CHF") { + + else if (Settings::getInstance()->get_currency_name() == "SGD") + ui->txtAvailableUSD->setText(balAvailable.toDecimalSGDString()); + + else if (Settings::getInstance()->get_currency_name() == "CHF") ui->txtAvailableUSD->setText(balAvailable.toDecimalCHFString()); - } else if (Settings::getInstance()->get_currency_name() == "INR") { - ui->txtAvailableUSD->setText(balAvailable.toDecimalINRString()); - } else if (Settings::getInstance()->get_currency_name() == "GBP") { - ui->txtAvailableUSD->setText(balAvailable.toDecimalGBPString()); - } else if (Settings::getInstance()->get_currency_name() == "AUD") { + + else if (Settings::getInstance()->get_currency_name() == "INR") + ui->txtAvailableUSD->setText(balAvailable.toDecimalINRString()); + + else if (Settings::getInstance()->get_currency_name() == "GBP") + ui->txtAvailableUSD->setText(balAvailable.toDecimalGBPString()); + + else if (Settings::getInstance()->get_currency_name() == "AUD") ui->txtAvailableUSD->setText(balAvailable.toDecimalAUDString()); - } } -void Controller::refreshBalances() { +void Controller::refreshBalances() +{ if (!zrpc->haveConnection()) return noConnection(); @@ -705,7 +807,6 @@ void Controller::refreshBalances() { // This is for the datamodel CAmount balAvailable = balT + balVerified; model->setAvailableBalance(balAvailable); - updateUIBalances(); }); @@ -723,10 +824,13 @@ void Controller::refreshBalances() { model->replaceUTXOs(newUnspentOutputs); // Find if any output is not spendable or is pending - bool anyUnconfirmed = std::find_if(newUnspentOutputs->constBegin(), newUnspentOutputs->constEnd(), - [=](const UnspentOutput& u) -> bool { - return !u.spendable || u.pending; - }) != newUnspentOutputs->constEnd(); + bool anyUnconfirmed = std::find_if( + newUnspentOutputs->constBegin(), + newUnspentOutputs->constEnd(), + [=](const UnspentOutput& u) -> bool { + return !u.spendable || u.pending; + } + ) != newUnspentOutputs->constEnd(); updateUI(anyUnconfirmed); @@ -734,46 +838,45 @@ void Controller::refreshBalances() { }); } -void Controller::refreshTransactions() { +void Controller::refreshTransactions() +{ if (!zrpc->haveConnection()) return noConnection(); zrpc->fetchTransactions([=] (json reply) { QList txdata; - for (auto& it : reply.get()) { + for (auto& it : reply.get()) + { QString address; CAmount total_amount; QList items; long confirmations; - if (it.find("unconfirmed") != it.end() && it["unconfirmed"].get()) { + if (it.find("unconfirmed") != it.end() && it["unconfirmed"].get()) confirmations = 0; - } else { + else confirmations = model->getLatestBlock() - it["block_height"].get() + 1; - } auto txid = QString::fromStdString(it["txid"]); auto datetime = it["datetime"].get(); // First, check if there's outgoing metadata - if (!it["outgoing_metadata"].is_null()) { - - for (auto o: it["outgoing_metadata"].get()) { - - QString address; - + if (!it["outgoing_metadata"].is_null()) + { + for (auto o: it["outgoing_metadata"].get()) + { + QString address; address = QString::fromStdString(o["address"]); - + // Sent items are -ve CAmount amount = CAmount::fromqint64(-1* o["value"].get()); // Check for Memos QString memo; - if (!o["memo"].is_null()) { + if (!o["memo"].is_null()) memo = QString::fromStdString(o["memo"]); - } items.push_back(TransactionItemDetail{address, amount, memo}); total_amount = total_amount + amount; @@ -783,41 +886,51 @@ void Controller::refreshTransactions() { // Concat all the addresses QList addresses; - for (auto item : items) { - - if (item.amount == 0 ) { - - } else { - addresses.push_back(item.address); - - address = addresses.join(","); } + for (auto item : items) + { + if (item.amount == 0 ) + { + } + else + { + addresses.push_back(item.address); + address = addresses.join(","); + } - } + } } - txdata.push_back(TransactionItem{ - "send", datetime, address, txid,confirmations, items - }); - } else { + txdata.push_back( + TransactionItem{"send", datetime, address, txid,confirmations, items} + ); + + } + else + { // Incoming Transaction address = (it["address"].is_null() ? "" : QString::fromStdString(it["address"])); model->markAddressUsed(address); - QString memo; - if (!it["memo"].is_null()) { + if (!it["memo"].is_null()) memo = QString::fromStdString(it["memo"]); - } - items.push_back(TransactionItemDetail{ - address, - CAmount::fromqint64(it["amount"].get()), - memo - }); + items.push_back( + TransactionItemDetail{ + address, + CAmount::fromqint64(it["amount"].get()), + memo + } + ); TransactionItem tx{ - "Receive", datetime, address, txid,confirmations, items + "Receive", + datetime, + address, + txid, + confirmations, + items }; txdata.push_back(tx); @@ -828,13 +941,17 @@ void Controller::refreshTransactions() { // Calculate the total unspent amount that's pending. This will need to be // shown in the UI so the user can keep track of pending funds CAmount totalPending; - for (auto txitem : txdata) { - if (txitem.confirmations == 0) { - for (auto item: txitem.items) { + for (auto txitem : txdata) + { + if (txitem.confirmations == 0) + { + for (auto item: txitem.items) + { totalPending = totalPending + item.amount; } } } + getModel()->setTotalPending(totalPending); // Update UI Balance @@ -846,15 +963,24 @@ void Controller::refreshTransactions() { } // If the wallet is encrpyted and locked, we need to unlock it -void Controller::unlockIfEncrypted(std::function cb, std::function error) { +void Controller::unlockIfEncrypted(std::function cb, std::function error) +{ auto encStatus = getModel()->getEncryptionStatus(); - if (encStatus.first && encStatus.second) { + if (encStatus.first && encStatus.second) + { // Wallet is encrypted and locked. Ask for the password and unlock. - QString password = QInputDialog::getText(main, main->tr("Wallet Password"), - main->tr("Your wallet is encrypted.\nPlease enter your wallet password"), QLineEdit::Password); + QString password = QInputDialog::getText( + main, + main->tr("Wallet Password"), + main->tr("Your wallet is encrypted.\nPlease enter your wallet password"), + QLineEdit::Password + ); - if (password.isEmpty()) { - QMessageBox::critical(main, main->tr("Wallet Decryption Failed"), + if (password.isEmpty()) + { + QMessageBox::critical( + main, + main->tr("Wallet Decryption Failed"), main->tr("Please enter a valid password"), QMessageBox::Ok ); @@ -863,20 +989,28 @@ void Controller::unlockIfEncrypted(std::function cb, std::functionunlockWallet(password, [=](json reply) { - if (isJsonResultSuccess(reply)) { + if (isJsonResultSuccess(reply)) + { cb(); // Refresh the wallet so the encryption status is now in sync. refresh(true); - } else { - QMessageBox::critical(main, main->tr("Wallet Decryption Failed"), + } + else + { + QMessageBox::critical( + main, + main->tr("Wallet Decryption Failed"), QString::fromStdString(reply["error"].get()), QMessageBox::Ok ); error(); } }); - } else { + + } + else + { // Not locked, so just call the function cb(); } @@ -886,18 +1020,25 @@ void Controller::unlockIfEncrypted(std::function cb, std::functionstatusBar->showMessage(Settings::txidStatusMessage + " " + txid); }, [=] (QString opid, QString errStr) { - ui->statusBar->showMessage(QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000); + ui->statusBar->showMessage( + QObject::tr(" Tx ") % opid % QObject::tr(" failed"), 15 * 1000 + ); if (!opid.isEmpty()) errStr = QObject::tr("The transaction with id ") % opid % QObject::tr(" failed. The error was") + ":\n\n" + errStr; - QMessageBox::critical(main, QObject::tr("Transaction Error"), errStr, QMessageBox::Ok); + QMessageBox::critical( + main, + QObject::tr("Transaction Error"), + errStr, + QMessageBox::Ok + ); } ); } @@ -906,7 +1047,8 @@ void Controller::executeStandardUITransaction(Tx tx) { // Execute a transaction! void Controller::executeTransaction(Tx tx, const std::function submitted, - const std::function error) { + const std::function error) +{ unlockIfEncrypted([=] () { // First, create the json params json params = json::array(); @@ -914,9 +1056,12 @@ void Controller::executeTransaction(Tx tx, std::cout << std::setw(2) << params << std::endl; zrpc->sendTransaction(QString::fromStdString(params.dump()), [=](const json& reply) { - if (reply.find("txid") == reply.end()) { + if (reply.find("txid") == reply.end()) + { error("", "Couldn't understand Response: " + QString::fromStdString(reply.dump())); - } else { + } + else + { QString txid = QString::fromStdString(reply["txid"].get()); submitted(txid); } @@ -930,7 +1075,8 @@ void Controller::executeTransaction(Tx tx, } -void Controller::checkForUpdate(bool silent) { +void Controller::checkForUpdate(bool silent) +{ if (!zrpc->haveConnection()) return noConnection(); @@ -946,13 +1092,14 @@ void Controller::checkForUpdate(bool silent) { reply->deleteLater(); manager->deleteLater(); - try { - if (reply->error() == QNetworkReply::NoError) { - + try + { + if (reply->error() == QNetworkReply::NoError) + { auto releases = QJsonDocument::fromJson(reply->readAll()).array(); QVersionNumber maxVersion(0, 0, 0); - - for (QJsonValue rel : releases) { + for (QJsonValue rel : releases) + { if (!rel.toObject().contains("tag_name")) continue; @@ -960,7 +1107,8 @@ void Controller::checkForUpdate(bool silent) { if (tag.startsWith("v")) tag = tag.right(tag.length() - 1); - if (!tag.isEmpty()) { + if (!tag.isEmpty()) + { auto v = QVersionNumber::fromString(tag); if (v > maxVersion) maxVersion = v; @@ -971,24 +1119,34 @@ void Controller::checkForUpdate(bool silent) { // Get the max version that the user has hidden updates for QSettings s; - auto maxHiddenVersion = QVersionNumber::fromString(s.value("update/lastversion", "0.0.0").toString()); + auto maxHiddenVersion = QVersionNumber::fromString( + s.value("update/lastversion", "0.0.0" + ).toString()); qDebug() << "Version check: Current " << currentVersion << ", Available " << maxVersion; - if (maxVersion > currentVersion && (!silent || maxVersion > maxHiddenVersion)) { + if (maxVersion > currentVersion && (!silent || maxVersion > maxHiddenVersion)) + { auto ans = QMessageBox::information(main, QObject::tr("Update Available"), QObject::tr("A new release v%1 is available! You have v%2.\n\nWould you like to visit the releases page?") .arg(maxVersion.toString()) .arg(currentVersion.toString()), QMessageBox::Yes, QMessageBox::Cancel); - if (ans == QMessageBox::Yes) { + if (ans == QMessageBox::Yes) + { QDesktopServices::openUrl(QUrl("https://github.com/MyHush/SilentDragonLite/releases")); - } else { + } + else + { // If the user selects cancel, don't bother them again for this version s.setValue("update/lastversion", maxVersion.toString()); } - } else { - if (!silent) { + + } + else + { + if (!silent) + { QMessageBox::information(main, QObject::tr("No updates available"), QObject::tr("You already have the latest release v%1") .arg(currentVersion.toString())); @@ -996,7 +1154,8 @@ void Controller::checkForUpdate(bool silent) { } } } - catch (...) { + catch (...) + { // If anything at all goes wrong, just set the price to 0 and move on. qDebug() << QString("Caught something nasty"); } @@ -1004,7 +1163,8 @@ void Controller::checkForUpdate(bool silent) { } // Get the hush->USD price from coinmarketcap using their API -void Controller::refreshZECPrice() { +void Controller::refreshZECPrice() +{ if (!zrpc->haveConnection()) return noConnection(); @@ -1013,22 +1173,22 @@ void Controller::refreshZECPrice() { QNetworkRequest req; req.setUrl(cmcURL); - QNetworkAccessManager *manager = new QNetworkAccessManager(this->main); QNetworkReply *reply = manager->get(req); - QObject::connect(reply, &QNetworkReply::finished, [=] { reply->deleteLater(); manager->deleteLater(); - try { - if (reply->error() != QNetworkReply::NoError) { + try + { + if (reply->error() != QNetworkReply::NoError) + { auto parsed = json::parse(reply->readAll(), nullptr, false); - if (!parsed.is_discarded() && !parsed["error"]["message"].is_null()) { + if (!parsed.is_discarded() && !parsed["error"]["message"].is_null()) qDebug() << QString::fromStdString(parsed["error"]["message"]); - } else { + else qDebug() << reply->errorString(); - } + Settings::getInstance()->setZECPrice(0); Settings::getInstance()->setEURPrice(0); Settings::getInstance()->setBTCPrice(0); @@ -1062,15 +1222,14 @@ void Controller::refreshZECPrice() { Settings::getInstance()->setCHFCAP(0); Settings::getInstance()->setGBPCAP(0); Settings::getInstance()->setAUDCAP(0); - return; } qDebug() << "No network errors"; - auto all = reply->readAll(); auto parsed = json::parse(all, nullptr, false); - if (parsed.is_discarded()) { + if (parsed.is_discarded()) + { Settings::getInstance()->setZECPrice(0); Settings::getInstance()->setEURPrice(0); Settings::getInstance()->setBTCPrice(0); @@ -1106,266 +1265,268 @@ void Controller::refreshZECPrice() { Settings::getInstance()->setAUDCAP(0); return; } - qDebug() << "Parsed JSON"; - const json& item = parsed.get(); const json& hush = item["hush"].get(); - if (hush["usd"] >= 0) { + if (hush["usd"] >= 0) + { qDebug() << "Found hush key in price json"; - qDebug() << "HUSH = $" << QString::number((double)hush["usd"]); Settings::getInstance()->setZECPrice( hush["usd"] ); } + if (hush["eur"] >= 0) { - qDebug() << "HUSH = €" << QString::number((double)hush["eur"]); Settings::getInstance()->setEURPrice(hush["eur"]); } + if (hush["btc"] >= 0) { - qDebug() << "HUSH = BTC" << QString::number((double)hush["btc"]); Settings::getInstance()->setBTCPrice( hush["btc"]); } + if (hush["cny"] >= 0) - { qDebug() << "HUSH = CNY" << QString::number((double)hush["cny"]); Settings::getInstance()->setCNYPrice( hush["cny"]); } + if (hush["rub"] >= 0) { qDebug() << "HUSH = RUB" << QString::number((double)hush["rub"]); Settings::getInstance()->setRUBPrice( hush["rub"]); } - if (hush["cad"] >= 0) - + + if (hush["cad"] >= 0) { qDebug() << "HUSH = CAD" << QString::number((double)hush["cad"]); Settings::getInstance()->setCADPrice( hush["cad"]); } + if (hush["sgd"] >= 0) { - qDebug() << "HUSH = SGD" << QString::number((double)hush["sgd"]); Settings::getInstance()->setSGDPrice( hush["sgd"]); } + if (hush["chf"] >= 0) { - qDebug() << "HUSH = CHF" << QString::number((double)hush["chf"]); Settings::getInstance()->setCHFPrice( hush["chf"]); } + if (hush["inr"] >= 0) - { - + { qDebug() << "HUSH = INR" << QString::number((double)hush["inr"]); Settings::getInstance()->setINRPrice( hush["inr"]); } + if (hush["gbp"] >= 0) { - qDebug() << "HUSH = GBP" << QString::number((double)hush["gbp"]); Settings::getInstance()->setGBPPrice( hush["gbp"]); } + if (hush["aud"] >= 0) { - qDebug() << "HUSH = AUD" << QString::number((double)hush["aud"]); Settings::getInstance()->setAUDPrice( hush["aud"]); } - if (hush["btc_24h_vol"] >= 0) - { - + + if (hush["btc_24h_vol"] >= 0) + { qDebug() << "HUSH = usd_24h_vol" << QString::number((double)hush["usd_24h_vol"]); Settings::getInstance()->setUSDVolume( hush["usd_24h_vol"]); } - if (hush["btc_24h_vol"] >= 0) - { - + + if (hush["btc_24h_vol"] >= 0) + { qDebug() << "HUSH = euro_24h_vol" << QString::number((double)hush["eur_24h_vol"]); Settings::getInstance()->setEURVolume( hush["eur_24h_vol"]); } - if (hush["btc_24h_vol"] >= 0) - { - + + if (hush["btc_24h_vol"] >= 0) + { qDebug() << "HUSH = btc_24h_vol" << QString::number((double)hush["btc_24h_vol"]); Settings::getInstance()->setBTCVolume( hush["btc_24h_vol"]); } - if (hush["cny_24h_vol"] >= 0) - { - + + if (hush["cny_24h_vol"] >= 0) + { qDebug() << "HUSH = cny_24h_vol" << QString::number((double)hush["cny_24h_vol"]); Settings::getInstance()->setCNYVolume( hush["cny_24h_vol"]); } - if (hush["rub_24h_vol"] >= 0) - { - + + if (hush["rub_24h_vol"] >= 0) + { qDebug() << "HUSH = rub_24h_vol" << QString::number((double)hush["rub_24h_vol"]); Settings::getInstance()->setRUBVolume( hush["rub_24h_vol"]); } - if (hush["cad_24h_vol"] >= 0) + + if (hush["cad_24h_vol"] >= 0) { - qDebug() << "HUSH = cad_24h_vol" << QString::number((double)hush["cad_24h_vol"]); Settings::getInstance()->setCADVolume( hush["cad_24h_vol"]); } - if (hush["sgd_24h_vol"] >= 0) - { - + + if (hush["sgd_24h_vol"] >= 0) + { qDebug() << "HUSH = sgd_24h_vol" << QString::number((double)hush["sgd_24h_vol"]); Settings::getInstance()->setSGDVolume( hush["sgd_24h_vol"]); } - if (hush["chf_24h_vol"] >= 0) - { - + + if (hush["chf_24h_vol"] >= 0) + { qDebug() << "HUSH = chf_24h_vol" << QString::number((double)hush["chf_24h_vol"]); Settings::getInstance()->setCHFVolume( hush["chf_24h_vol"]); } - if (hush["inr_24h_vol"] >= 0) - { - + + if (hush["inr_24h_vol"] >= 0) + { qDebug() << "HUSH = inr_24h_vol" << QString::number((double)hush["inr_24h_vol"]); Settings::getInstance()->setINRVolume( hush["inr_24h_vol"]); } - if (hush["gbp_24h_vol"] >= 0) - { - + + if (hush["gbp_24h_vol"] >= 0) + { qDebug() << "HUSH = gbp_24h_vol" << QString::number((double)hush["gbp_24h_vol"]); Settings::getInstance()->setGBPVolume( hush["gbp_24h_vol"]); } - if (hush["aud_24h_vol"] >= 0) - { - + + if (hush["aud_24h_vol"] >= 0) + { qDebug() << "HUSH = aud_24h_vol" << QString::number((double)hush["aud_24h_vol"]); Settings::getInstance()->setAUDVolume( hush["aud_24h_vol"]); } - if (hush["usd_market_cap"] >= 0) - { - + + if (hush["usd_market_cap"] >= 0) + { qDebug() << "HUSH = usd_market_cap" << QString::number((double)hush["usd_market_cap"]); Settings::getInstance()->setUSDCAP( hush["usd_market_cap"]); } - if (hush["eur_market_cap"] >= 0) - { - + + if (hush["eur_market_cap"] >= 0) + { qDebug() << "HUSH = eur_market_cap" << QString::number((double)hush["eur_market_cap"]); Settings::getInstance()->setEURCAP( hush["eur_market_cap"]); } - if (hush["btc_market_cap"] >= 0) - { - + + if (hush["btc_market_cap"] >= 0) + { qDebug() << "HUSH = btc_market_cap" << QString::number((double)hush["btc_market_cap"]); Settings::getInstance()->setBTCCAP( hush["btc_market_cap"]); } - if (hush["cny_market_cap"] >= 0) - { - + + if (hush["cny_market_cap"] >= 0) + { qDebug() << "HUSH = cny_market_cap" << QString::number((double)hush["cny_market_cap"]); Settings::getInstance()->setCNYCAP( hush["cny_market_cap"]); } - if (hush["rub_market_cap"] >= 0) - { - + + if (hush["rub_market_cap"] >= 0) + { qDebug() << "HUSH = rub_market_cap" << QString::number((double)hush["rub_market_cap"]); Settings::getInstance()->setRUBCAP( hush["rub_market_cap"]); } - if (hush["cad_market_cap"] >= 0) - { - + + if (hush["cad_market_cap"] >= 0) + { qDebug() << "HUSH = cad_market_cap" << QString::number((double)hush["cad_market_cap"]); Settings::getInstance()->setCADCAP( hush["cad_market_cap"]); } - if (hush["sgd_market_cap"] >= 0) - { - + + if (hush["sgd_market_cap"] >= 0) + { qDebug() << "HUSH = sgd_market_cap" << QString::number((double)hush["sgd_market_cap"]); Settings::getInstance()->setSGDCAP( hush["sgd_market_cap"]); } - if (hush["chf_market_cap"] >= 0) - { - + + if (hush["chf_market_cap"] >= 0) + { qDebug() << "HUSH = chf_market_cap" << QString::number((double)hush["chf_market_cap"]); Settings::getInstance()->setCHFCAP( hush["chf_market_cap"]); } - if (hush["inr_market_cap"] >= 0) - { - + + if (hush["inr_market_cap"] >= 0) + { qDebug() << "HUSH = inr_market_cap" << QString::number((double)hush["inr_market_cap"]); Settings::getInstance()->setINRCAP( hush["inr_market_cap"]); } - if (hush["gbp_market_cap"] >= 0) - { - + + if (hush["gbp_market_cap"] >= 0) + { qDebug() << "HUSH = gbp_market_cap" << QString::number((double)hush["gbp_market_cap"]); Settings::getInstance()->setGBPCAP( hush["gbp_market_cap"]); } - if (hush["aud_market_cap"] >= 0) - { - + + if (hush["aud_market_cap"] >= 0) + { qDebug() << "HUSH = aud_market_cap" << QString::number((double)hush["aud_market_cap"]); Settings::getInstance()->setAUDCAP( hush["aud_market_cap"]); } + return; - } catch (const std::exception& e) { + } + catch (const std::exception& e) + { // If anything at all goes wrong, just set the price to 0 and move on. qDebug() << QString("Caught something nasty: ") << e.what(); } // If nothing, then set the price to 0; - Settings::getInstance()->setZECPrice(0); - Settings::getInstance()->setEURPrice(0); - Settings::getInstance()->setBTCPrice(0); - Settings::getInstance()->setCNYPrice(0); - Settings::getInstance()->setRUBPrice(0); - Settings::getInstance()->setCADPrice(0); - Settings::getInstance()->setSGDPrice(0); - Settings::getInstance()->setCHFPrice(0); - Settings::getInstance()->setGBPPrice(0); - Settings::getInstance()->setAUDPrice(0); - Settings::getInstance()->setINRPrice(0); - Settings::getInstance()->setBTCVolume(0); - Settings::getInstance()->setUSDVolume(0); - Settings::getInstance()->setEURVolume(0); - Settings::getInstance()->setBTCVolume(0); - Settings::getInstance()->setCNYVolume(0); - Settings::getInstance()->setRUBVolume(0); - Settings::getInstance()->setCADVolume(0); - Settings::getInstance()->setINRVolume(0); - Settings::getInstance()->setSGDVolume(0); - Settings::getInstance()->setCHFVolume(0); - Settings::getInstance()->setGBPVolume(0); - Settings::getInstance()->setAUDVolume(0); - Settings::getInstance()->setUSDCAP(0); - Settings::getInstance()->setEURCAP(0); - Settings::getInstance()->setBTCCAP(0); - Settings::getInstance()->setCNYCAP(0); - Settings::getInstance()->setRUBCAP(0); - Settings::getInstance()->setCADCAP(0); - Settings::getInstance()->setINRCAP(0); - Settings::getInstance()->setSGDCAP(0); - Settings::getInstance()->setCHFCAP(0); - Settings::getInstance()->setGBPCAP(0); - Settings::getInstance()->setAUDCAP(0); + Settings::getInstance()->setZECPrice(0); + Settings::getInstance()->setEURPrice(0); + Settings::getInstance()->setBTCPrice(0); + Settings::getInstance()->setCNYPrice(0); + Settings::getInstance()->setRUBPrice(0); + Settings::getInstance()->setCADPrice(0); + Settings::getInstance()->setSGDPrice(0); + Settings::getInstance()->setCHFPrice(0); + Settings::getInstance()->setGBPPrice(0); + Settings::getInstance()->setAUDPrice(0); + Settings::getInstance()->setINRPrice(0); + Settings::getInstance()->setBTCVolume(0); + Settings::getInstance()->setUSDVolume(0); + Settings::getInstance()->setEURVolume(0); + Settings::getInstance()->setBTCVolume(0); + Settings::getInstance()->setCNYVolume(0); + Settings::getInstance()->setRUBVolume(0); + Settings::getInstance()->setCADVolume(0); + Settings::getInstance()->setINRVolume(0); + Settings::getInstance()->setSGDVolume(0); + Settings::getInstance()->setCHFVolume(0); + Settings::getInstance()->setGBPVolume(0); + Settings::getInstance()->setAUDVolume(0); + Settings::getInstance()->setUSDCAP(0); + Settings::getInstance()->setEURCAP(0); + Settings::getInstance()->setBTCCAP(0); + Settings::getInstance()->setCNYCAP(0); + Settings::getInstance()->setRUBCAP(0); + Settings::getInstance()->setCADCAP(0); + Settings::getInstance()->setINRCAP(0); + Settings::getInstance()->setSGDCAP(0); + Settings::getInstance()->setCHFCAP(0); + Settings::getInstance()->setGBPCAP(0); + Settings::getInstance()->setAUDCAP(0); }); } -void Controller::shutdownhushd() { +void Controller::shutdownhushd() +{ // Save the wallet and exit the lightclient library cleanly. - if (zrpc->haveConnection()) { + if (zrpc->haveConnection()) + { QDialog d(main); Ui_ConnectionDialog connD; connD.setupUi(&d); connD.topIcon->setBasePixmap(QIcon(":/icons/res/icon.ico").pixmap(256, 256)); connD.status->setText(QObject::tr("Please wait for SilentDragonLite to exit")); connD.statusDetail->setText(QObject::tr("Waiting for hushd to exit")); - bool finished = false; - zrpc->saveWallet([&] (json) { if (!finished) d.accept(); @@ -1380,8 +1541,10 @@ void Controller::shutdownhushd() { /** * Get a Sapling address from the user's wallet */ -QString Controller::getDefaultSaplingAddress() { - for (QString addr: model->getAllZAddresses()) { +QString Controller::getDefaultSaplingAddress() +{ + for (QString addr: model->getAllZAddresses()) + { if (Settings::getInstance()->isSaplingAddress(addr)) return addr; } @@ -1389,13 +1552,12 @@ QString Controller::getDefaultSaplingAddress() { return QString(); } -QString Controller::getDefaultTAddress() { +QString Controller::getDefaultTAddress() +{ if (model->getAllTAddresses().length() > 0) return model->getAllTAddresses().at(0); + else return QString(); + } - - - -