Revision control

Copy as Markdown

// Copyright (C) 2017 Ford Motor Company
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QREMOTEOBJECTSOURCE_H
#define QREMOTEOBJECTSOURCE_H
#include <QtCore/qscopedpointer.h>
#include <QtRemoteObjects/qtremoteobjectglobal.h>
#include <QtCore/qmetaobject.h>
QT_BEGIN_NAMESPACE
namespace QtPrivate {
//Based on compile time checks for static connect() from qobjectdefs_impl.h
template <class ObjectType, typename Func1, typename Func2>
int qtro_property_index(Func1, Func2, const char *propName)
{
typedef QtPrivate::FunctionPointer<Func1> Type1;
typedef QtPrivate::FunctionPointer<Func2> Type2;
//compilation error if the arguments do not match.
Q_STATIC_ASSERT_X(int(Type1::ArgumentCount) >= int(Type2::ArgumentCount),
"Argument counts are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename Type1::Arguments, typename Type2::Arguments>::value),
"Arguments are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename Type1::ReturnType, typename Type2::ReturnType>::value),
"Return types are not compatible.");
return ObjectType::staticMetaObject.indexOfProperty(propName);
}
template <class ObjectType, typename Func1, typename Func2>
int qtro_signal_index(Func1 func, Func2, int *count, int const **types)
{
typedef QtPrivate::FunctionPointer<Func1> Type1;
typedef QtPrivate::FunctionPointer<Func2> Type2;
//compilation error if the arguments do not match.
Q_STATIC_ASSERT_X(int(Type1::ArgumentCount) >= int(Type2::ArgumentCount),
"Argument counts are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename Type1::Arguments, typename Type2::Arguments>::value),
"Arguments are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename Type1::ReturnType, typename Type2::ReturnType>::value),
"Return types are not compatible.");
const QMetaMethod sig = QMetaMethod::fromSignal(func);
*count = Type2::ArgumentCount;
*types = QtPrivate::ConnectionTypes<typename Type2::Arguments>::types();
return sig.methodIndex();
}
template <class ObjectType, typename Func1, typename Func2>
void qtro_method_test(Func1, Func2)
{
typedef QtPrivate::FunctionPointer<Func1> Type1;
typedef QtPrivate::FunctionPointer<Func2> Type2;
//compilation error if the arguments do not match.
Q_STATIC_ASSERT_X(int(Type1::ArgumentCount) >= int(Type2::ArgumentCount),
"Argument counts are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename Type1::Arguments, typename Type2::Arguments>::value),
"Arguments are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename Type1::ReturnType, typename Type2::ReturnType>::value),
"Return types are not compatible.");
}
Q_REMOTEOBJECTS_EXPORT
int qtro_method_index_impl(const QMetaObject *staticMetaObj, const char *className,
const char *methodName, int *count, const int **types);
template <class ObjectType, typename Func1, typename Func2>
int qtro_method_index(Func1, Func2, const char *methodName, int *count, int const **types)
{
typedef QtPrivate::FunctionPointer<Func1> Type1;
typedef QtPrivate::FunctionPointer<Func2> Type2;
//compilation error if the arguments do not match.
Q_STATIC_ASSERT_X(int(Type1::ArgumentCount) >= int(Type2::ArgumentCount),
"Argument counts are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::CheckCompatibleArguments<typename Type1::Arguments, typename Type2::Arguments>::value),
"Arguments are not compatible.");
Q_STATIC_ASSERT_X((QtPrivate::AreArgumentsCompatible<typename Type1::ReturnType, typename Type2::ReturnType>::value),
"Return types are not compatible.");
*count = Type2::ArgumentCount;
*types = QtPrivate::ConnectionTypes<typename Type2::Arguments>::types();
return qtro_method_index_impl(&ObjectType::staticMetaObject,
ObjectType::staticMetaObject.className(), methodName, count,
types);
}
Q_REMOTEOBJECTS_EXPORT
QByteArray qtro_enum_signature_impl(const QMetaObject &mo, const char *enumName);
template <class ObjectType>
QByteArray qtro_enum_signature(const char *enumName)
{
return qtro_enum_signature_impl(ObjectType::staticMetaObject, enumName);
}
QByteArray qtro_classinfo_signature(const QMetaObject *metaObject);
}
// TODO ModelInfo just needs roles, and no need for SubclassInfo
class QAbstractItemModel;
struct ModelInfo
{
QAbstractItemModel *ptr;
QString name;
QByteArray roles;
};
class Q_REMOTEOBJECTS_EXPORT SourceApiMap
{
protected:
SourceApiMap() {}
public:
virtual ~SourceApiMap();
virtual QString name() const = 0;
virtual QString typeName() const = 0;
virtual QByteArray className() const { return typeName().toLatin1().append("Source"); }
virtual int enumCount() const = 0;
virtual int propertyCount() const = 0;
virtual int signalCount() const = 0;
virtual int methodCount() const = 0;
virtual int sourceEnumIndex(int index) const = 0;
virtual int sourcePropertyIndex(int index) const = 0;
virtual int sourceSignalIndex(int index) const = 0;
virtual int sourceMethodIndex(int index) const = 0;
virtual int signalParameterCount(int index) const = 0;
virtual int signalParameterType(int sigIndex, int paramIndex) const = 0;
virtual const QByteArray signalSignature(int index) const = 0;
virtual QByteArrayList signalParameterNames(int index) const = 0;
virtual int methodParameterCount(int index) const = 0;
virtual int methodParameterType(int methodIndex, int paramIndex) const = 0;
virtual const QByteArray methodSignature(int index) const = 0;
virtual QMetaMethod::MethodType methodType(int index) const = 0;
virtual const QByteArray typeName(int index) const = 0;
virtual QByteArrayList methodParameterNames(int index) const = 0;
virtual int propertyIndexFromSignal(int index) const = 0;
virtual int propertyRawIndexFromSignal(int index) const = 0;
virtual QByteArray objectSignature() const = 0;
virtual bool isDynamic() const { return false; }
virtual bool isAdapterSignal(int) const { return false; }
virtual bool isAdapterMethod(int) const { return false; }
virtual bool isAdapterProperty(int) const { return false; }
QList<ModelInfo> m_models;
QList<SourceApiMap *> m_subclasses;
};
QT_END_NAMESPACE
#endif