-
Notifications
You must be signed in to change notification settings - Fork 0
/
AsyncDevice.cpp
71 lines (61 loc) · 1.88 KB
/
AsyncDevice.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "AsyncDevice.h"
#include "FakeDevice.h"
AsyncDevice::AsyncDevice(DeviceInterface::UPtr io)
: m_io(std::move(io))
{
}
void AsyncDevice::startReadFile(int fileId)
{
m_fileId = fileId;
m_fileData = QString();
sendCommand<FileStatus>(OpenFile{fileId}, &AsyncDevice::onOpenFinished);
}
void AsyncDevice::onOpenFinished(FileStatus status)
{
if (status != FileStatus::Success) {
emit this->failed(conversions::toString(status));
return;
}
sendCommand<GetFileResult>(GetFile{m_fileId}, &AsyncDevice::onReadFinished);
}
void AsyncDevice::onReadFinished(GetFileResult result)
{
if (result.status != FileStatus::Success) {
emit this->failed(conversions::toString(result.status));
return;
}
m_fileData = result.data;
sendCommand<FileStatus>(CloseFile{m_fileId}, &AsyncDevice::onCloseFinished);
}
void AsyncDevice::onCloseFinished(FileStatus status)
{
if (status != FileStatus::Success) {
emit this->failed(conversions::toString(status));
return;
}
emit success(m_fileData);
}
template<typename ReplyType>
void AsyncDevice::sendCommand(const Command &cmd, void (AsyncDevice::*onReplyReceived)(ReplyType))
{
m_lastCommand = m_io->sendReport(cmd, [this, onReplyReceived] (DeviceInterface::IOStatus status) {
if (status != DeviceInterface::IOStatus::Success) {
emit this->failed(conversions::toString(status));
return;
}
m_lastReply = m_io->getReply([this, onReplyReceived] (const DeviceInterface::ReplyResult &result) {
if (result.status != DeviceInterface::IOStatus::Success) {
emit this->failed(conversions::toString(result.status));
return;
}
try {
auto reply = std::get<Reply>(result.reply);
QMetaObject::invokeMethod(this, [this, onReplyReceived, concreteReply = std::get<ReplyType>(reply)] {
(this->*onReplyReceived)(concreteReply);
});
} catch (const std::exception &ex) {
emit this->failed(QString(ex.what()));
}
});
});
}