diff --git a/Patronum/CMakeLists.txt b/Patronum/CMakeLists.txt index 37def94..20da5a2 100755 --- a/Patronum/CMakeLists.txt +++ b/Patronum/CMakeLists.txt @@ -11,7 +11,6 @@ project(Patronum LANGUAGES CXX) add_subdirectory(qt-solutions/qtservice) include(qt-solutions/CMake/ProjectOut.cmake) -include(qt-solutions/CMake/ccache.cmake) include(qt-solutions/CMake/Version.cmake) diff --git a/Patronum/src/controller.cpp b/Patronum/src/controller.cpp index 0a8faa7..faee93b 100644 --- a/Patronum/src/controller.cpp +++ b/Patronum/src/controller.cpp @@ -1,9 +1,13 @@ #include "controller.h" +#include "serviceprivate.h" namespace Patronum { Controller::Controller(const QString &name): - QtServiceController(name) -{ + QtServiceController(name) { + d_ptr = new ServicePrivate(name, this); +} + +void Controller::handleFeatures(const QList &features) { } diff --git a/Patronum/src/controller.h b/Patronum/src/controller.h index 85bc92f..8f90bdc 100644 --- a/Patronum/src/controller.h +++ b/Patronum/src/controller.h @@ -1,14 +1,25 @@ #ifndef CONTROLLER_H #define CONTROLLER_H #include "Patronum_global.h" +#include "icontroller.h" #include namespace Patronum { -class PATRONUM_LIBRARYSHARED_EXPORT Controller : public QtServiceController +class ServicePrivate; + +class PATRONUM_LIBRARYSHARED_EXPORT Controller : public QtServiceController, protected IController { public: - Controller(const QString & name); + Controller(const QString& name); + + // IControler interface +protected: + void handleFeatures(const QList &features); + +private: + ServicePrivate * d_ptr = nullptr; + }; } #endif // CONTROLLER_H diff --git a/Patronum/src/feature.cpp b/Patronum/src/feature.cpp new file mode 100644 index 0000000..7202c99 --- /dev/null +++ b/Patronum/src/feature.cpp @@ -0,0 +1,39 @@ +#include "feature.h" + +#include + +namespace Patronum { + +Feature::Feature(const QString &cmd, const QVariantList &arg) { + _cmd = cmd; + _arg = arg; +} + +QString Feature::cmd() const { + return _cmd; +} + +void Feature::setCmd(const QString &cmd) { + _cmd = cmd; +} + +QVariantList Feature::arg() const { + return _arg; +} + +void Feature::setArg(const QVariantList &arg) { + _arg = arg; +} + +QDataStream &operator<<(QDataStream &stream, const Feature &obj) { + stream << obj._cmd << obj._arg; + + return stream; +} + +QDataStream &operator>>(QDataStream &stream, Feature &obj) { + stream >> obj._cmd >> obj._arg; + return stream; +} + +} diff --git a/Patronum/src/feature.h b/Patronum/src/feature.h new file mode 100644 index 0000000..843425e --- /dev/null +++ b/Patronum/src/feature.h @@ -0,0 +1,36 @@ +#ifndef FEaTURE_H +#define FEaTURE_H + +#include +#include +#include +#include + +namespace Patronum { + +/** + * @brief The Feature class - it is atomic type for describe service command + */ + +class PATRONUM_LIBRARYSHARED_EXPORT Feature +{ +public: + Feature() = default; + Feature(const QString& cmd, const QVariantList& arg); + QString cmd() const; + void setCmd(const QString &cmd); + + QVariantList arg() const; + void setArg(const QVariantList &arg); + + friend QDataStream& operator<<(QDataStream& stream, const Feature& obj); + friend QDataStream& operator>>(QDataStream& stream, Feature& obj); + +private: + QString _cmd; + QVariantList _arg; +}; + + +} +#endif // FEaTURE_H diff --git a/Patronum/src/icontroller.cpp b/Patronum/src/icontroller.cpp new file mode 100644 index 0000000..fe62aeb --- /dev/null +++ b/Patronum/src/icontroller.cpp @@ -0,0 +1 @@ +#include "icontroller.h" diff --git a/Patronum/src/icontroller.h b/Patronum/src/icontroller.h new file mode 100644 index 0000000..401ae2e --- /dev/null +++ b/Patronum/src/icontroller.h @@ -0,0 +1,19 @@ +#ifndef ICONTROLER_H +#define ICONTROLER_H + +#include + + +namespace Patronum { + +class Feature; + +class IController +{ +public: + IController(); + virtual void handleFeatures(const QList& features) = 0; +}; +} + +#endif // ICONTROLER_H diff --git a/Patronum/src/iservice.cpp b/Patronum/src/iservice.cpp new file mode 100644 index 0000000..7accdc2 --- /dev/null +++ b/Patronum/src/iservice.cpp @@ -0,0 +1,8 @@ +#include "iservice.h" +namespace Patronum { + +IService::IService() +{ + +} +} diff --git a/Patronum/src/iservice.h b/Patronum/src/iservice.h new file mode 100644 index 0000000..1e56b67 --- /dev/null +++ b/Patronum/src/iservice.h @@ -0,0 +1,20 @@ +#ifndef ISERVICE_H +#define ISERVICE_H + +#include + +namespace Patronum { + +class Feature; + +class IService +{ +public: + IService(); + + virtual void handleReceve(const Feature& data) = 0; + virtual QList supportedFeatures() = 0; + +}; +} +#endif // ISERVICE_H diff --git a/Patronum/src/package.cpp b/Patronum/src/package.cpp new file mode 100644 index 0000000..651e479 --- /dev/null +++ b/Patronum/src/package.cpp @@ -0,0 +1,3 @@ +#include "package.h" + + diff --git a/Patronum/src/package.h b/Patronum/src/package.h new file mode 100644 index 0000000..4ea9e49 --- /dev/null +++ b/Patronum/src/package.h @@ -0,0 +1,22 @@ +#ifndef PACKAGE_H +#define PACKAGE_H + +#include + +namespace Patronum { + +enum class Command: char { + FeaturesRequest, + Features, + Feature +}; + +struct Package +{ + Command cmd; + char* data; +}; + +} + +#endif // PACKAGE_H diff --git a/Patronum/src/service.h b/Patronum/src/service.h index 9652f51..2a81dd9 100644 --- a/Patronum/src/service.h +++ b/Patronum/src/service.h @@ -1,14 +1,36 @@ #ifndef SERVICE_H #define SERVICE_H #include "Patronum_global.h" +#include "feature.h" +#include "iservice.h" +#include "localsocket.h" +#include "package.h" +#include "serviceprivate.h" #include namespace Patronum { + template -class PATRONUM_LIBRARYSHARED_EXPORT Service : public QtService +class PATRONUM_LIBRARYSHARED_EXPORT Service : public QtService, protected IService { public: - Service(); + Service(int argc, char **argv, const QString &name) + : QtService(argc, argv, name) { + d_ptr = new ServicePrivate(name, nullptr, this); + + } +// IService interface +protected: + void handleReceve(const Feature &data) { + Q_UNUSED(data) + }; + + QList supportedFeatures() { + return QList(); + } + +private: + ServicePrivate *d_ptr = nullptr; }; } diff --git a/Patronum/src/serviceprivate.cpp b/Patronum/src/serviceprivate.cpp new file mode 100644 index 0000000..adc832e --- /dev/null +++ b/Patronum/src/serviceprivate.cpp @@ -0,0 +1,96 @@ +#include "serviceprivate.h" + +#include "iservice.h" +#include "icontroller.h" +#include "localsocket.h" +#include "package.h" + +namespace Patronum { + +Patronum::ServicePrivate::ServicePrivate(const QString &name, IController *controller, IService *service, QObject *parent): + QObject(parent) { + _socket = new LocalSocket(name); + _service = service; + _controller = controller; + + QObject::connect(_socket, &LocalSocket::sigReceve, + this, &ServicePrivate::handleReceve); + +} + +void ServicePrivate::handleReceve(QByteArray data) { + + if (data.size() < 2) { + return; + } + + const Package *package = reinterpret_cast( data.data()); + + switch (package->cmd) { + + case Command::FeaturesRequest: { + + if (!_service) { + // to-do logs + break; + } + + if (!_socket->isValid()) { + // to-do logs + break; + } + + QList features = _service->supportedFeatures(); + QByteArray sendData; + QDataStream stream(&sendData, QIODevice::WriteOnly); + + stream << Command::Features << features; + if (!_socket->send(sendData)) { + // to-do logs + } + + break; + + } + case Command::Features: { + + if (!_controller) { + // to-do logs + break; + } + + QDataStream stream(package->data); + + QList features; + stream >> features; + + _controller->handleFeatures(features); + + break; + + } + case Command::Feature: { + if (!_service) { + // to-do logs + break; + } + + QDataStream stream(package->data); + + Feature feature; + stream >> feature; + _service->handleReceve(feature); + + break; + + } + default: { + // to-do add logs + break; + } + + } + +} + +} diff --git a/Patronum/src/serviceprivate.h b/Patronum/src/serviceprivate.h new file mode 100644 index 0000000..fea4f77 --- /dev/null +++ b/Patronum/src/serviceprivate.h @@ -0,0 +1,32 @@ +#ifndef SERVICEPRIVATE_H +#define SERVICEPRIVATE_H +#include +#include + +namespace Patronum { + +class LocalSocket; +class IService; +class IController; + +class ServicePrivate : public QObject +{ + Q_OBJECT +public: + ServicePrivate(const QString& name, IController* controller = nullptr, + IService* service = nullptr, QObject *parent = nullptr); + +signals: + void sigListFeatures(QList); + +private: + LocalSocket *_socket = nullptr; + IService *_service = nullptr; + IController *_controller = nullptr; + +private slots: + void handleReceve(QByteArray data); +}; + +} +#endif // SERVICEPRIVATE_H