9 #define LOC QString("MetaMethod: ")
19 const QString& ReturnName,
bool Slot)
21 m_requestTypes(RequestTypes),
25 static const std::vector<int> s_invalidTypes =
27 QMetaType::UnknownType, QMetaType::VoidStar, QMetaType::QObjectStar,
28 QMetaType::QVariantHash, QMetaType::QRect, QMetaType::QRectF,
29 QMetaType::QSize, QMetaType::QSizeF, QMetaType::QLine,
30 QMetaType::QLineF, QMetaType::QPoint, QMetaType::QPointF
34 static const std::vector<int> s_invalidParams =
36 QMetaType::UnknownType, QMetaType::VoidStar, QMetaType::QObjectStar,
37 QMetaType::QVariantHash, QMetaType::QRect, QMetaType::QRectF,
38 QMetaType::QSize, QMetaType::QSizeF, QMetaType::QLine,
39 QMetaType::QLineF, QMetaType::QPoint, QMetaType::QPointF,
40 QMetaType::QVariantMap, QMetaType::QStringList, QMetaType::QVariantList
43 int returntype = Method.returnType();
46 if (std::any_of(s_invalidTypes.cbegin(), s_invalidTypes.cend(), [&returntype](
int Type) { return Type == returntype; }))
48 LOG(VB_HTTP, LOG_ERR,
LOC + QString(
"Method '%1' has unsupported return type '%2'").arg(Method.name().constData(), Method.typeName()));
54 if (Method.parameterCount() > (Q_METAMETHOD_INVOKE_MAX_ARGS - 1))
56 LOG(VB_HTTP, LOG_WARNING,
LOC + QString(
"Method '%1' takes more than %2 parameters; will probably fail")
57 .arg(Method.name().constData()).arg(Q_METAMETHOD_INVOKE_MAX_ARGS - 1));
69 if (returntype <= QMetaType::User)
70 if (QString(Method.name()).startsWith(QStringLiteral(
"Get"), Qt::CaseInsensitive))
84 m_types.emplace_back(returntype >= 0 ? returntype : 0);
85 m_names.emplace_back(Method.name());
88 auto names = Method.parameterNames();
89 auto types = Method.parameterTypes();
92 for (
int i = 0; i < names.size(); ++i)
94 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
97 int type = QMetaType::fromName(
types[i]).id();
102 if (Slot && std::any_of(s_invalidParams.cbegin(), s_invalidParams.cend(), [&
type](
int Type) { return type == Type; }))
104 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Method '%1' has unsupported parameter type '%2' (%3)")
105 .arg(Method.name().constData(),
types[i].constData()).arg(
type));
109 m_names.emplace_back(names[i]);
117 const QString &ReturnName,
bool Slot)
120 std::shared_ptr<MythHTTPMetaMethod>(
new MythHTTPMetaMethod(Index, Method, RequestTypes, ReturnName, Slot));
134 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
135 auto typeflags = QMetaType::typeFlags(Type);
137 auto typeflags = QMetaType(Type).flags();
139 if ((typeflags & QMetaType::IsEnumeration) == QMetaType::IsEnumeration)
144 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
145 QByteArray
type = QMetaType::typeName(Type);
147 QByteArray
type = QMetaType(Type).name();
149 if (
int index =
type.lastIndexOf(
"::" ); index > -1)
151 QString enumname =
type.mid(index + 2);
152 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
153 const auto * metaobject = QMetaType::metaObjectForType(Type);
155 const auto * metaobject = QMetaType(Type).metaObject();
159 int enumindex = metaobject->indexOfEnumerator(enumname.toUtf8());
162 QMetaEnum metaEnum = metaobject->enumerator(enumindex);
163 value = metaEnum.keyToValue(Value.toUtf8());
167 *(
static_cast<int*
>(Parameter)) = value;
173 case QMetaType::QVariant : *(
static_cast<QVariant *
>(Parameter)) = QVariant(Value);
break;
174 case QMetaType::Bool : *(
static_cast<bool *
>(Parameter)) =
ToBool(Value );
break;
175 case QMetaType::Char : *(
static_cast<char *
>(Parameter)) = (Value.length() > 0) ? Value.at(0).toLatin1() : 0;
break;
176 case QMetaType::UChar : *(
static_cast<unsigned char*
>(Parameter)) = (Value.length() > 0) ?
static_cast<unsigned char>(Value.at(0).toLatin1()) : 0;
break;
177 case QMetaType::QChar : *(
static_cast<QChar *
>(Parameter)) = (Value.length() > 0) ? Value.at(0) : QChar(0);
break;
178 case QMetaType::Short : *(
static_cast<short *
>(Parameter)) = Value.toShort();
break;
179 case QMetaType::UShort : *(
static_cast<ushort *
>(Parameter)) = Value.toUShort();
break;
180 case QMetaType::Int : *(
static_cast<int *
>(Parameter)) = Value.toInt();
break;
181 case QMetaType::UInt : *(
static_cast<uint *
>(Parameter)) = Value.toUInt();
break;
182 case QMetaType::Long : *(
static_cast<long *
>(Parameter)) = Value.toLong();
break;
183 case QMetaType::ULong : *(
static_cast<ulong *
>(Parameter)) = Value.toULong();
break;
184 case QMetaType::LongLong : *(
static_cast<qlonglong *
>(Parameter)) = Value.toLongLong();
break;
185 case QMetaType::ULongLong : *(
static_cast<qulonglong *
>(Parameter)) = Value.toULongLong();
break;
186 case QMetaType::Double : *(
static_cast<double *
>(Parameter)) = Value.toDouble();
break;
187 case QMetaType::Float : *(
static_cast<float *
>(Parameter)) = Value.toFloat();
break;
188 case QMetaType::QString : *(
static_cast<QString *
>(Parameter)) = Value;
break;
189 case QMetaType::QByteArray: *(
static_cast<QByteArray *
>(Parameter)) = Value.toUtf8();
break;
192 case QMetaType::QDateTime :
195 dt.setTimeSpec(Qt::UTC);
196 *(
static_cast<QDateTime*
>(Parameter)) = dt;
212 #
if QT_VERSION < QT_VERSION_CHECK(6,0,0)
215 Type == QMetaType::fromName(
"QFileInfo").
id()
218 return QVariant::fromValue<QFileInfo>(*(
static_cast<QFileInfo*
>(Value)));
220 if (Type > QMetaType::User)
222 QObject*
object = *(
static_cast<QObject**
>(Value));
223 return QVariant::fromValue<QObject*>(
object);
226 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
227 return {Type, Value};
229 return QVariant(QMetaType(Type), Value);