#ifndef CLIENTCORE_H #define CLIENTCORE_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include class ClientCore : public QObject { Q_OBJECT public: ClientCore(QObject* parent = nullptr); ~ClientCore(); public slots: bool SendFrame(QSharedPointer frame); void Disconnect(); public slots: void DoConnect(const QString& ip, quint16 port); public: void Instance(); bool Connect(const QString& ip, quint16 port); bool Send(QSharedPointer frame); bool Send(const char* data, qint64 len); bool IsConnect(); template bool Send(const T& info, FrameBufferType type, const QString& tid) { auto f = GetBuffer(info, type, tid); return Send(f); } template QSharedPointer GetBuffer(const T& info, FrameBufferType type, const QString& tid) { auto f = QSharedPointer::create(); f->tid = tid; f->data = infoPack(info); f->type = type; return f; } static bool syncInvoke(ClientCore* context, QSharedPointer frame) { bool result = false; bool success = QMetaObject::invokeMethod(context, "SendFrame", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, result), Q_ARG(QSharedPointer, frame)); if (!success) { return false; } return result; } signals: void sigDisconnect(); void sigPath(const QString& path); void sigClients(const InfoClientVec& clients); void sigFiles(const DirFileInfoVec& files); void sigReqSend(QSharedPointer frame); void sigReqDown(QSharedPointer frame); void sigTransDone(QSharedPointer frame); void sigCanSend(QSharedPointer frame); void sigCanotSend(QSharedPointer frame); void sigCanotDown(QSharedPointer frame); void sigCanDown(QSharedPointer frame); void sigFileBuffer(QSharedPointer frame); void sigTransFailed(QSharedPointer frame); void sigFileInfo(QSharedPointer frame); void sigOffline(QSharedPointer frame); void sigYourId(QSharedPointer frame); void sigMsgAsk(QSharedPointer frame); void sigMsgAnswer(QSharedPointer frame); signals: void conSuccess(); void connecting(); void conFailed(); private: void onReadyRead(); void onDisconnected(); void handleAsk(QSharedPointer frame); private: void UseFrame(QSharedPointer frame); public: void SetRemoteID(const QString& id); QString GetRemoteID(); QString GetOwnID(); public: QMutex conMutex_; QString ownID_; QString remoteID_; QMutex sockMut_; QTcpSocket* socket_{}; QByteArray recvBuffer_; bool connected_{false}; LocalFile localFile_; }; // Socket Worker Thread class SocketWorker : public QThread { Q_OBJECT public: SocketWorker(ClientCore* core, QObject* parent = nullptr); ~SocketWorker(); protected: void run() override; private: ClientCore* core_{}; }; // HeatBeat to Server class HeatBeat : public QThread { Q_OBJECT public: HeatBeat(ClientCore* core, QObject* parent = nullptr); ~HeatBeat() override; public: void Stop(); protected: void run() override; private: bool isRun_{false}; ClientCore* core_{}; }; #endif // CLIENTCORE_H