arkpar
10 years ago
2 changed files with 190 additions and 0 deletions
@ -0,0 +1,81 @@ |
|||||
|
/*
|
||||
|
This file is part of cpp-ethereum. |
||||
|
|
||||
|
cpp-ethereum is free software: you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation, either version 3 of the License, or |
||||
|
(at your option) any later version. |
||||
|
|
||||
|
cpp-ethereum is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
*/ |
||||
|
/** @file CodeModel.cpp
|
||||
|
* @author Arkadiy Paronyan arkadiy@ethdev.com |
||||
|
* @date 2014 |
||||
|
* Ethereum IDE client. |
||||
|
*/ |
||||
|
|
||||
|
#include "CodeModel.h" |
||||
|
|
||||
|
namespace dev |
||||
|
{ |
||||
|
namespace mix |
||||
|
{ |
||||
|
|
||||
|
void BackgroundWorker::queueCodeChange(int _jobId, QString const& _content) |
||||
|
{ |
||||
|
m_model->runCompilationJob(_jobId, _content); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
CodeModel::CodeModel(QObject* _parent) : QObject(_parent), m_backgroundWorker(this) |
||||
|
{ |
||||
|
m_backgroundWorker.moveToThread(&m_backgroundThread); |
||||
|
|
||||
|
connect(this, &CodeModel::compilationComplete, this, &CodeModel::onCompilationComplete, Qt::QueuedConnection); |
||||
|
connect(this, &CodeModel::scheduleCompilationJob, &m_backgroundWorker, &BackgroundWorker::queueCodeChange, Qt::QueuedConnection); |
||||
|
m_backgroundThread.start(); |
||||
|
} |
||||
|
|
||||
|
CodeModel::~CodeModel() |
||||
|
{ |
||||
|
stop(); |
||||
|
disconnect(this); |
||||
|
} |
||||
|
|
||||
|
void CodeModel::stop() |
||||
|
{ |
||||
|
///@todo: cancel bg job
|
||||
|
m_backgroundThread.exit(); |
||||
|
m_backgroundThread.wait(); |
||||
|
} |
||||
|
|
||||
|
void CodeModel::registerCodeChange(const QString &_code) |
||||
|
{ |
||||
|
// launch the background thread
|
||||
|
m_backgroundJobId++; |
||||
|
emit scheduleCompilationJob(m_backgroundJobId, _code); |
||||
|
} |
||||
|
|
||||
|
void CodeModel::onCompilationComplete(std::shared_ptr<CompilationResult> _compilationResult) |
||||
|
{ |
||||
|
m_result.swap(_compilationResult); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void CodeModel::runCompilationJob(int _jobId, QString const& _content) |
||||
|
{ |
||||
|
if (_jobId != m_backgroundJobId) |
||||
|
return; //obsolete job
|
||||
|
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
} |
||||
|
} |
@ -0,0 +1,109 @@ |
|||||
|
/*
|
||||
|
This file is part of cpp-ethereum. |
||||
|
|
||||
|
cpp-ethereum is free software: you can redistribute it and/or modify |
||||
|
it under the terms of the GNU General Public License as published by |
||||
|
the Free Software Foundation, either version 3 of the License, or |
||||
|
(at your option) any later version. |
||||
|
|
||||
|
cpp-ethereum is distributed in the hope that it will be useful, |
||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
GNU General Public License for more details. |
||||
|
|
||||
|
You should have received a copy of the GNU General Public License |
||||
|
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
*/ |
||||
|
/** @file CodeModel.h
|
||||
|
* @author Arkadiy Paronyan arkadiy@ethdev.com |
||||
|
* @date 2014 |
||||
|
* Ethereum IDE client. |
||||
|
*/ |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <QObject> |
||||
|
#include <QThread> |
||||
|
#include <libdevcore/Common.h> |
||||
|
|
||||
|
namespace dev |
||||
|
{ |
||||
|
namespace mix |
||||
|
{ |
||||
|
|
||||
|
class CodeModel; |
||||
|
class QContractDefinition; |
||||
|
|
||||
|
class BackgroundWorker: public QObject |
||||
|
{ |
||||
|
Q_OBJECT |
||||
|
|
||||
|
public: |
||||
|
BackgroundWorker(CodeModel* _model): QObject(), m_model(_model) {} |
||||
|
|
||||
|
public slots: |
||||
|
void queueCodeChange(int _jobId, QString const& _content); |
||||
|
private: |
||||
|
CodeModel* m_model; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
class CompilationResult : public QObject |
||||
|
{ |
||||
|
Q_OBJECT |
||||
|
Q_PROPERTY(QContractDefinition const* contract READ contract) |
||||
|
|
||||
|
public: |
||||
|
QContractDefinition const* contract() { return m_contract; } |
||||
|
|
||||
|
private: |
||||
|
bool m_successfull; |
||||
|
QContractDefinition* m_contract; |
||||
|
QString m_hexCode; |
||||
|
QString m_compilerMessage; ///< @todo: use some structure here
|
||||
|
dev::bytes m_bytes; |
||||
|
///@todo syntax highlighting, etc
|
||||
|
}; |
||||
|
|
||||
|
class CodeModel : public QObject |
||||
|
{ |
||||
|
enum Status |
||||
|
{ |
||||
|
Idle, |
||||
|
Compiling, |
||||
|
}; |
||||
|
|
||||
|
Q_OBJECT |
||||
|
|
||||
|
public: |
||||
|
CodeModel(QObject* _parent); |
||||
|
~CodeModel(); |
||||
|
|
||||
|
CompilationResult* getLastCompilationResult(); |
||||
|
|
||||
|
signals: |
||||
|
void statusChanged(Status _from, Status _to); |
||||
|
void compilationComplete(std::shared_ptr<CompilationResult> _compilationResult); |
||||
|
void scheduleCompilationJob(int _jobId, QString const& _content); |
||||
|
|
||||
|
public slots: |
||||
|
void registerCodeChange(QString const& _code); |
||||
|
|
||||
|
private slots: |
||||
|
void onCompilationComplete(std::shared_ptr<CompilationResult> _compilationResult); |
||||
|
|
||||
|
private: |
||||
|
void runCompilationJob(int _jobId, QString const& _content); |
||||
|
void stop(); |
||||
|
|
||||
|
std::shared_ptr<CompilationResult> m_result; |
||||
|
QThread m_backgroundThread; |
||||
|
BackgroundWorker m_backgroundWorker; |
||||
|
int m_backgroundJobId = 0; //protects from starting obsolete compilation job
|
||||
|
|
||||
|
friend class BackgroundWorker; |
||||
|
}; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
} |
Loading…
Reference in new issue