CCIMXDesktop
 
Loading...
Searching...
No Matches
DataProtocolizedController.h
1#ifndef DATAPROTOCOLIZEDCONTROLLER_H
2#define DATAPROTOCOLIZEDCONTROLLER_H
3#include "DataHeader.h"
4#include "DataSinkerRouter.h"
5#include <QObject>
6class QSaveFile;
7class ISinkerRouter;
8class QElapsedTimer;
9class DataSinker;
10class DataProtocolizedController : public QObject {
11 Q_OBJECT
12public:
13 explicit DataProtocolizedController(QObject* parent = nullptr, ISinkerRouter* sinker = new DataSinkerRouter);
14 ISinkerRouter* get_router() const { return router; }
15
20 void reset();
21
22public slots:
23 void sendData(
24 DataSinker* send_sinker,
25 int chunkSize = DataHeaderUtils::DEF_CHUNK_SZ,
26 qint64 startOffset = 0);
27 void onBytes(const QByteArray& bytes);
28signals:
29 // frame is ready to be sent to other places
30 void frameReady(const QByteArray& frame);
31 // process for sendings
32 void sendProgress(quint64 sent, quint64 total);
33 // receiving process
34 void receiveProgress(const QString& fileId, quint64 received, quint64 total);
35 // parse dead :(
36 void protocolError(const QString& reason);
37 // parsing dead
38 void parsingBad();
39 // OK buffer
40 void bufferOk(DataSinker* okSinker);
41
42private:
43 static constexpr int PARSE_TIMEOUT_MS = 5000;
44 void sendStartFrame(quint64 fileId,
45 const QString& name,
46 quint64 totalSize);
47 void sendDataFrame(quint64 fileId,
48 quint64 offset,
49 const QByteArray& chunk,
50 quint64 totalSize);
51 void sendEndFrame(quint64 fileId,
52 quint64 totalSize);
53
54 void parse();
55
56 bool parseHeader();
57 bool parseName();
58 bool parseData();
59
60 bool ensureSize(int need) const;
61
62 DataHeaderUtils::DataHeader internal_header;
63 QByteArray rx_buffer;
64 quint64 sendFileSize { 0 };
65 quint64 sendFileHasSent { 0 };
66 DataHeaderUtils::CurrentState state {
67 DataHeaderUtils::CurrentState::ReadingHeader
68 };
69
70 QString curFileIdStr; // string 形式的 fileId(方便信号里传)
71 quint64 curReceived { 0 };
72
73 DataSinker* send_sinker { nullptr };
74 DataSinker* receive_sinker { nullptr };
75 ISinkerRouter* router;
76 QElapsedTimer* elapsed_timeout;
77};
78
79#endif // DATAPROTOCOLIZEDCONTROLLER_H
Definition DataProtocolizedController.h:10
void reset()
reset reset the protocal machines
Definition DataProtocolizedController.cpp:286
Definition DataSinkerRouter.h:4
Definition DataSinker.h:8
Definition ISinkerRouter.h:5
Definition DataHeader.h:8