peerplays_migrated/programs/light_client/ClientDataModel.cpp

170 lines
4.5 KiB
C++
Raw Normal View History

2015-07-10 21:37:22 +00:00
#include "ClientDataModel.hpp"
2015-07-13 17:56:30 +00:00
#include <graphene/app/api.hpp>
#include <graphene/chain/protocol/protocol.hpp>
#include <fc/rpc/websocket_api.hpp>
2015-07-13 18:14:58 +00:00
using namespace graphene::app;
2015-07-13 17:56:30 +00:00
ChainDataModel::ChainDataModel( fc::thread& t, QObject* parent )
:QObject(parent),m_thread(&t){}
2015-07-10 21:37:22 +00:00
Account* ChainDataModel::getAccount(qint64 id)
2015-07-10 21:37:22 +00:00
{
2015-07-13 19:41:06 +00:00
auto itr = m_accounts.find( id );
if( itr != m_accounts.end() )
return *itr;
auto acct = new Account(this);
2015-07-10 21:37:22 +00:00
acct->setProperty("id", id);
2015-07-13 19:41:06 +00:00
acct->setProperty("name", "LOADING");
auto insert_result = m_accounts.insert( acct );
/** execute in app thread */
m_thread->async( [=](){
2015-07-13 19:41:06 +00:00
try {
auto result = m_db_api->get_accounts( {account_id_type(id)} );
if( result.size() && result.front().valid() )
{
QString name = QString::fromStdString( result.front()->name );
/** execute in main */
Q_EMIT queueExecute( [=](){
this->m_accounts.modify( insert_result.first,
2015-07-13 19:41:06 +00:00
[=]( Account* a ){ a->setProperty("name", name ); }
);
});
}
else
{
/** execute in main */
Q_EMIT queueExecute( [=](){
acct->deleteLater();
m_accounts.erase( insert_result.first );
});
}
}
2015-07-13 19:41:06 +00:00
catch ( const fc::exception& e )
{
edump((e.to_detail_string()));
2015-07-13 19:41:06 +00:00
Q_EMIT exceptionThrown( QString::fromStdString(e.to_string()) );
}
});
2015-07-10 21:37:22 +00:00
return acct;
}
Account* ChainDataModel::getAccount(QString name)
2015-07-10 21:37:22 +00:00
{
2015-07-13 19:41:06 +00:00
auto itr = m_accounts.get<::by_name>().find(name);
if( itr != m_accounts.get<::by_name>().end() )
{
return *itr;
}
auto acct = new Account(this);
acct->setProperty("id", --m_account_query_num );
2015-07-10 21:37:22 +00:00
acct->setProperty("name", name);
2015-07-13 19:41:06 +00:00
auto insert_result = m_accounts.insert( acct );
/** execute in app thread */
m_thread->async( [=](){
2015-07-13 19:41:06 +00:00
try {
auto result = m_db_api->lookup_account_names( {name.toStdString()} );
if( result.size() && result.front().valid() )
{
/** execute in main */
Q_EMIT queueExecute( [=](){
this->m_accounts.modify( insert_result.first,
[=]( Account* a ){
a->setProperty("id", result.front()->id.instance() );
2015-07-13 19:41:06 +00:00
}
);
});
}
else
{
/** execute in main */
Q_EMIT queueExecute( [=](){
acct->deleteLater();
m_accounts.erase( insert_result.first );
});
}
}
2015-07-13 19:41:06 +00:00
catch ( const fc::exception& e )
{
edump((e.to_detail_string()));
2015-07-13 19:41:06 +00:00
Q_EMIT exceptionThrown( QString::fromStdString(e.to_string()) );
}
});
return acct;
2015-07-10 21:37:22 +00:00
}
QQmlListProperty<Balance> Account::balances()
{
return QQmlListProperty<Balance>(this, m_balances);
}
2015-07-13 17:24:30 +00:00
2015-07-13 17:56:30 +00:00
GrapheneApplication::GrapheneApplication( QObject* parent )
:QObject( parent ),m_thread("app")
{
2015-07-13 18:14:58 +00:00
connect( this, &GrapheneApplication::queueExecute,
this, &GrapheneApplication::execute );
2015-07-13 17:56:30 +00:00
m_model = new ChainDataModel( m_thread, this );
2015-07-13 19:41:06 +00:00
connect( m_model, &ChainDataModel::queueExecute,
this, &GrapheneApplication::execute );
connect( m_model, &ChainDataModel::exceptionThrown,
this, &GrapheneApplication::exceptionThrown );
2015-07-13 17:56:30 +00:00
}
2015-07-13 18:14:58 +00:00
2015-07-13 17:56:30 +00:00
GrapheneApplication::~GrapheneApplication()
{
}
2015-07-13 18:14:58 +00:00
void GrapheneApplication::setIsConnected( bool v )
{
if( v != m_isConnected )
{
m_isConnected = v;
Q_EMIT isConnectedChanged( m_isConnected );
}
}
void GrapheneApplication::start( QString apiurl, QString user, QString pass )
2015-07-13 17:24:30 +00:00
{
2015-07-13 17:56:30 +00:00
if( !m_thread.is_current() )
{
m_done = m_thread.async( [=](){ return start( apiurl, user, pass ); } );
2015-07-13 18:14:58 +00:00
return;
2015-07-13 17:56:30 +00:00
}
try {
auto con = m_client.connect( apiurl.toStdString() );
auto apic = std::make_shared<fc::rpc::websocket_api_connection>(*con);
2015-07-13 18:14:58 +00:00
auto remote_api = apic->get_remote_api< login_api >(1);
2015-07-13 19:41:06 +00:00
auto db_api = apic->get_remote_api< database_api >(0);
2015-07-13 17:56:30 +00:00
2015-07-13 18:14:58 +00:00
if( !remote_api->login( user.toStdString(), pass.toStdString() ) )
{
2015-07-13 19:41:06 +00:00
Q_EMIT loginFailed();
2015-07-13 18:14:58 +00:00
return;
}
2015-07-13 17:56:30 +00:00
2015-07-13 19:41:06 +00:00
queueExecute( [=](){
m_model->setDatabaseAPI( db_api );
});
2015-07-13 18:14:58 +00:00
queueExecute( [=](){setIsConnected( true );} );
2015-07-13 17:56:30 +00:00
} catch ( const fc::exception& e )
{
2015-07-13 19:41:06 +00:00
Q_EMIT exceptionThrown( QString::fromStdString(e.to_string()) );
2015-07-13 17:56:30 +00:00
}
2015-07-13 18:14:58 +00:00
}
Q_SLOT void GrapheneApplication::execute( const std::function<void()>& func )const
{
func();
2015-07-13 17:24:30 +00:00
}