diff options
Diffstat (limited to 'src/libs/installer/remoteobject.h')
-rw-r--r-- | src/libs/installer/remoteobject.h | 110 |
1 files changed, 46 insertions, 64 deletions
diff --git a/src/libs/installer/remoteobject.h b/src/libs/installer/remoteobject.h index ecd86c984..ddd512588 100644 --- a/src/libs/installer/remoteobject.h +++ b/src/libs/installer/remoteobject.h @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2022 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -35,8 +35,10 @@ #include <QCoreApplication> #include <QDataStream> -#include <QObject> #include <QLocalSocket> +#include <QObject> +#include <QVariant> + namespace QInstaller { @@ -50,45 +52,65 @@ public: virtual ~RemoteObject() = 0; bool isConnectedToServer() const; - void callRemoteMethod(const QString &name); - template<typename T1, typename T2> - void callRemoteMethod(const QString &name, const T1 &arg, const T2 &arg2) + template<typename... Args> + void callRemoteMethodDefaultReply(const QString &name, const Args&... args) { - writeData(name, arg, arg2, dummy); + const QString reply = sendReceivePacket<QString>(name, args...); + Q_ASSERT(reply == QLatin1String(Protocol::DefaultReply)); } - template<typename T1, typename T2, typename T3> - void callRemoteMethod(const QString &name, const T1 &arg, const T2 &arg2, const T3 & arg3) + template<typename T, typename... Args> + T callRemoteMethod(const QString &name, const Args&... args) const { - writeData(name, arg, arg2, arg3); + return sendReceivePacket<T>(name, args...); } - template<typename T> - T callRemoteMethod(const QString &name) const +protected: + bool authorize(); + bool connectToServer(const QVariantList &arguments = QVariantList()); + +private: + + template<typename T, typename... Args> + T sendReceivePacket(const QString &name, const Args&... args) const { - return callRemoteMethod<T>(name, dummy, dummy, dummy); + writeData(name, args...); + while (m_socket->bytesToWrite()) + m_socket->waitForBytesWritten(); + + return readData<T>(name); } - template<typename T, typename T1> - T callRemoteMethod(const QString &name, const T1 &arg) const + template <class T> int writeObject(QDataStream& out, const T& t) const { - return callRemoteMethod<T>(name, arg, dummy, dummy); + static_assert(!std::is_pointer<T>::value, "Pointer passed to remote server"); +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + out << t; +#else + if constexpr (std::is_same<T, QAnyStringView>::value) + out << t.toString(); + else + out << t; +#endif + + return 0; } - template<typename T, typename T1, typename T2> - T callRemoteMethod(const QString &name, const T1 & arg, const T2 &arg2) const + template<typename... Args> + void writeData(const QString &name, const Args&... args) const { - return callRemoteMethod<T>(name, arg, arg2, dummy); + QByteArray data; + QDataStream out(&data, QIODevice::WriteOnly); + + (void)std::initializer_list<int>{writeObject(out, args)...}; + sendPacket(m_socket, name.toLatin1(), data); + m_socket->flush(); } - template<typename T, typename T1, typename T2, typename T3> - T callRemoteMethod(const QString &name, const T1 &arg, const T2 &arg2, const T3 &arg3) const + template<typename T> + T readData(const QString &name) const { - writeData(name, arg, arg2, arg3); - while (m_socket->bytesToWrite()) - m_socket->waitForBytesWritten(); - QByteArray command; QByteArray data; while (!receivePacket(m_socket, &command, &data)) { @@ -110,46 +132,6 @@ public: return result; } -protected: - bool authorize(); - bool connectToServer(const QVariantList &arguments = QVariantList()); - - // Use this structure to allow derived classes to manipulate the template - // function signature of the callRemoteMethod templates, since most of the - // generated functions will differ in return type rather given arguments. - struct Dummy {}; Dummy *dummy; - -private: - template<typename T> bool isValueType(T) const - { - return true; - } - - template<typename T> bool isValueType(T *dummy) const - { - // Force compiler error while passing anything different then Dummy* to the function. - // It really doesn't make sense to send any pointer over to the server, so bail early. - Q_UNUSED(static_cast<Dummy*> (dummy)) - return false; - } - - template<typename T1, typename T2, typename T3> - void writeData(const QString &name, const T1 &arg, const T2 &arg2, const T3 &arg3) const - { - QByteArray data; - QDataStream out(&data, QIODevice::WriteOnly); - - if (isValueType(arg)) - out << arg; - if (isValueType(arg2)) - out << arg2; - if (isValueType(arg3)) - out << arg3; - - sendPacket(m_socket, name.toLatin1(), data); - m_socket->flush(); - } - private: QString m_type; QLocalSocket *m_socket; |