From bfd7f372b6dc8c3f296536b064198d170ffbc10c Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Mon, 13 Jul 2015 14:14:58 -0400 Subject: [PATCH] interthread communication added --- programs/light_client/ClientDataModel.cpp | 37 +++++++++++++++++++---- programs/light_client/ClientDataModel.hpp | 13 ++++++-- programs/light_client/main.cpp | 4 +++ 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/programs/light_client/ClientDataModel.cpp b/programs/light_client/ClientDataModel.cpp index 6d5f3182..88caaa74 100644 --- a/programs/light_client/ClientDataModel.cpp +++ b/programs/light_client/ClientDataModel.cpp @@ -5,6 +5,8 @@ #include +using namespace graphene::app; + ChainDataModel::ChainDataModel( fc::thread& t, QObject* parent ) :QObject(parent),m_thread(&t){} @@ -30,32 +32,55 @@ QQmlListProperty Account::balances() } - GrapheneApplication::GrapheneApplication( QObject* parent ) :QObject( parent ),m_thread("app") { + connect( this, &GrapheneApplication::queueExecute, + this, &GrapheneApplication::execute ); + m_model = new ChainDataModel( m_thread, this ); + + start( "", "", "", "" ); } + GrapheneApplication::~GrapheneApplication() { } -bool GrapheneApplication::start( QString datadir, QString apiurl ) +void GrapheneApplication::setIsConnected( bool v ) +{ + if( v != m_isConnected ) + { + m_isConnected = v; + Q_EMIT isConnectedChanged( m_isConnected ); + } +} + +void GrapheneApplication::start( QString datadir, QString apiurl, QString user, QString pass ) { if( !m_thread.is_current() ) { - m_done = m_thread.async( [=](){ return start( datadir, apiurl ); } ); - return true; + m_done = m_thread.async( [=](){ return start( datadir, apiurl, user, pass ); } ); + return; } try { auto con = m_client.connect( apiurl.toStdString() ); auto apic = std::make_shared(*con); + auto remote_api = apic->get_remote_api< login_api >(1); + if( !remote_api->login( user.toStdString(), pass.toStdString() ) ) + { + // TODO: emit error + return; + } + queueExecute( [=](){setIsConnected( true );} ); } catch ( const fc::exception& e ) { - return false; } - return true; +} +Q_SLOT void GrapheneApplication::execute( const std::function& func )const +{ + func(); } diff --git a/programs/light_client/ClientDataModel.hpp b/programs/light_client/ClientDataModel.hpp index c13e3201..c4f0f8cd 100644 --- a/programs/light_client/ClientDataModel.hpp +++ b/programs/light_client/ClientDataModel.hpp @@ -7,6 +7,7 @@ #include +Q_DECLARE_METATYPE(std::function) class Asset : public QObject { @@ -78,7 +79,11 @@ class GrapheneApplication : public QObject { bool m_isConnected = false; fc::http::websocket_client m_client; - fc::future m_done; + fc::future m_done; + + void setIsConnected( bool v ); + + Q_SLOT void execute( const std::function& )const; public: GrapheneApplication( QObject* parent = nullptr ); ~GrapheneApplication(); @@ -88,7 +93,10 @@ public: return m_model; } - Q_INVOKABLE bool start(QString dataDirectory, QString apiUrl); + Q_INVOKABLE void start( QString dataDirectory, + QString apiUrl, + QString user, + QString pass ); bool isConnected() const { @@ -97,4 +105,5 @@ public: signals: void isConnectedChanged(bool isConnected); + void queueExecute( const std::function& ); }; diff --git a/programs/light_client/main.cpp b/programs/light_client/main.cpp index 12888e2c..f8c7bc5f 100644 --- a/programs/light_client/main.cpp +++ b/programs/light_client/main.cpp @@ -4,10 +4,14 @@ #include "ClientDataModel.hpp" + int main(int argc, char *argv[]) { + fc::thread::current().set_name( "main" ); QApplication app(argc, argv); + qRegisterMetaType>(); + qmlRegisterType("Graphene.Client", 0, 1, "Asset"); qmlRegisterType("Graphene.Client", 0, 1, "Balance"); qmlRegisterType("Graphene.Client", 0, 1, "Account");