From 15a1c2e63b49931d66e6fa82e6db9d8b238ee6da Mon Sep 17 00:00:00 2001 From: Andre Jochems Date: Mon, 16 Nov 2015 12:09:46 +0100 Subject: [PATCH] Prypto Redeem implemented --- src/qt/addresstablemodel.cpp | 22 +++++++ src/qt/addresstablemodel.h | 4 ++ src/qt/forms/pryptopage.ui | 24 ++++++-- src/qt/pryptopage.cpp | 107 +++++++++++++++++++++++++++++++++-- src/qt/pryptopage.h | 21 +++++++ src/qt/walletview.cpp | 1 + 6 files changed, 170 insertions(+), 9 deletions(-) diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp index 1801444..9500ac4 100644 --- a/src/qt/addresstablemodel.cpp +++ b/src/qt/addresstablemodel.cpp @@ -6,6 +6,7 @@ #include "wallet.h" #include "base58.h" +#include #include const QString AddressTableModel::Send = "S"; @@ -424,3 +425,24 @@ void AddressTableModel::emitDataChanged(int idx) { emit dataChanged(index(idx, 0, QModelIndex()), index(idx, columns.length()-1, QModelIndex())); } + +/* Look up address for label in address book, if not found return empty string. + */ +QString AddressTableModel::addressForLabel(const QString &label) const +{ + LOCK(wallet->cs_wallet); + QString walletAddress = ""; + // loop over addressbook values to find the key + std::map::iterator it; + for( it = wallet->mapAddressBook.begin(); it != wallet->mapAddressBook.end(); it++) + { + qDebug() << "Label Value: " << QString::fromStdString(it->second); + if (it->second.compare(label.toStdString()) == 0) + { + CTxDestination dest = it->first; + walletAddress = QString::fromStdString(CBitcoinAddress(dest).ToString()); + break; + } + } + return walletAddress; +} diff --git a/src/qt/addresstablemodel.h b/src/qt/addresstablemodel.h index 48baff5..84501d6 100644 --- a/src/qt/addresstablemodel.h +++ b/src/qt/addresstablemodel.h @@ -69,6 +69,10 @@ public: EditStatus getEditStatus() const { return editStatus; } + /* Look up address for label in address book, if not found return empty string. + */ + QString addressForLabel(const QString &label) const; + private: WalletModel *walletModel; CWallet *wallet; diff --git a/src/qt/forms/pryptopage.ui b/src/qt/forms/pryptopage.ui index 1d4d673..ba6876f 100644 --- a/src/qt/forms/pryptopage.ui +++ b/src/qt/forms/pryptopage.ui @@ -1,7 +1,7 @@ - pryptopage - + PryptoPage + 0 @@ -17,8 +17,8 @@ 20 - 20 - 281 + 50 + 361 112 @@ -56,6 +56,22 @@ + + + + 20 + 10 + 361 + 31 + + + + Enter your Prypto Code and Security Code to redeem your Prypto card. + + + Qt::AutoText + + diff --git a/src/qt/pryptopage.cpp b/src/qt/pryptopage.cpp index ecaa600..0b7c6a0 100644 --- a/src/qt/pryptopage.cpp +++ b/src/qt/pryptopage.cpp @@ -1,19 +1,116 @@ #include "pryptopage.h" #include "ui_pryptopage.h" +#include "walletmodel.h" +#include "addresstablemodel.h" +#include +#include + +const QString PryptoPage::strAPIEndpoint = "https://prypto.com/merchants/api/"; +const QString PryptoPage::strMerchantToken = "35616ab118fa557b77fdac78ef09d5632d302609"; +const QString PryptoPage::strAddressLabel = "Prypto Cards"; PryptoPage::PryptoPage(QWidget *parent) : QDialog(parent), ui(new Ui::PryptoPage) { ui->setupUi(this); + connect( &networkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(parseAPINetworkResponse(QNetworkReply*)) ); + connect( this, SIGNAL(apiResponseReady(QByteArray)), this, SLOT(showAPIResult(QByteArray)) ); + connect( this, SIGNAL(apiNetworkError(QNetworkReply::NetworkError*)), this, SLOT(showAPINetworkError(QNetworkReply*)) ); +} + +void PryptoPage::setWalletModel(WalletModel *model) +{ + this->walletModel = model; +} + +void PryptoPage::on_butRedeem_clicked() +{ + if((ui->txtPryptoCode->text().length() == 0) || + (ui->txtSecurityCode->text().length() == 0)) + { + QMessageBox msgBox; + msgBox.setText("Both Prypto code and Security code must be entered."); + msgBox.exec(); + } + else + { + // Show Busy Indicator + busyDialog = new QProgressDialog(this); + busyDialog->setWindowModality(Qt::WindowModal); + busyDialog->setLabelText("Calling Prypto Services ..."); + busyDialog->setCancelButton(0); + busyDialog->setRange(0,0); + busyDialog->setMinimumDuration(0); + busyDialog->show(); + // get wallet address for redeem action + QString pryptoWalletAddress = walletModel->getAddressTableModel()->addressForLabel(strAddressLabel); + // create new if empty + if(pryptoWalletAddress == "") + { + pryptoWalletAddress = walletModel->getAddressTableModel()->addRow(AddressTableModel::Receive, strAddressLabel, ""); + } + // call service + QUrl url ( strAPIEndpoint ); + QUrlQuery query; + query.addQueryItem("T", "RX"); + query.addQueryItem("TKN", strMerchantToken); + query.addQueryItem("COIN", "CSC"); + query.addQueryItem("PC", ui->txtPryptoCode->text()); + query.addQueryItem("SC", ui->txtSecurityCode->text()); + query.addQueryItem("RX", pryptoWalletAddress); + url.setQuery(query.query()); + QNetworkRequest networkRequest ( url ); + networkAccessManager.get( networkRequest ); + } +} + +void PryptoPage::parseAPINetworkResponse( QNetworkReply *finished ) +{ + if ( finished->error() != QNetworkReply::NoError ) + { + // A communication error has occurred + qDebug() << "API Network Error: " << finished->errorString() << " URL: " << finished->url(); + busyDialog->cancel(); + emit apiNetworkError( finished->error()); + return; + } + QByteArray data = finished->readAll(); + qDebug() << "API data: " << data; + busyDialog->cancel(); + emit apiResponseReady( data ); +} + +void PryptoPage::showAPINetworkError(QNetworkReply *reply) +{ + QMessageBox msgBox; + msgBox.setText("Error redeeming Prypto Card: " + reply->errorString()); + msgBox.exec(); +} + +void PryptoPage::showAPIResult(QByteArray data) +{ + // reset text fields + ui->txtPryptoCode->setText(""); + ui->txtSecurityCode->setText(""); + // handle result + if(data.length() > 0) + { + qDebug() << "API Result: " << data; + QMessageBox msgBox; + msgBox.setText("Prypto Card succesfully redeemed."); + msgBox.exec(); + } + else + { + qDebug() << "API Empty Result"; + QMessageBox msgBox; + msgBox.setText("Prypto Card already redeemed or invalid."); + msgBox.exec(); + } } PryptoPage::~PryptoPage() { delete ui; } - -void PryptoPage::on_butRedeem_clicked() -{ - -} diff --git a/src/qt/pryptopage.h b/src/qt/pryptopage.h index 3c646a4..78ba82b 100644 --- a/src/qt/pryptopage.h +++ b/src/qt/pryptopage.h @@ -2,6 +2,12 @@ #define PRYPTOPAGE_H #include +#include +#include +#include +#include + +class WalletModel; namespace Ui { class PryptoPage; @@ -13,13 +19,28 @@ class PryptoPage : public QDialog public: explicit PryptoPage(QWidget *parent = 0); + void setWalletModel(WalletModel *model); ~PryptoPage(); +signals: + void apiResponseReady( const QByteArray& content ); + void apiNetworkError( QNetworkReply::NetworkError error ); + private slots: void on_butRedeem_clicked(); + void parseAPINetworkResponse( QNetworkReply *finished ); + void showAPIResult(QByteArray data); + void showAPINetworkError(QNetworkReply *reply); private: + static const QString strAPIEndpoint; + static const QString strMerchantToken; + static const QString strAddressLabel; + Ui::PryptoPage *ui; + QNetworkAccessManager networkAccessManager; + WalletModel *walletModel; + QProgressDialog *busyDialog; }; #endif // PRYPTOPAGE_H diff --git a/src/qt/walletview.cpp b/src/qt/walletview.cpp index ef1a3fa..15dee8c 100644 --- a/src/qt/walletview.cpp +++ b/src/qt/walletview.cpp @@ -125,6 +125,7 @@ void WalletView::setWalletModel(WalletModel *walletModel) receiveCoinsPage->setModel(walletModel->getAddressTableModel()); sendCoinsPage->setModel(walletModel); signVerifyMessageDialog->setModel(walletModel); + pryptoPage->setWalletModel(walletModel); setEncryptionStatus(); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), gui, SLOT(setEncryptionStatus(int)));