11#define LOC QString("MetaMethod: ")
21 const QString& ReturnName,
bool Slot)
23 m_requestTypes(RequestTypes),
27 static const std::vector<int> s_invalidTypes =
29 QMetaType::UnknownType, QMetaType::VoidStar, QMetaType::QObjectStar,
30 QMetaType::QVariantHash, QMetaType::QRect, QMetaType::QRectF,
31 QMetaType::QSize, QMetaType::QSizeF, QMetaType::QLine,
32 QMetaType::QLineF, QMetaType::QPoint, QMetaType::QPointF
36 static const std::vector<int> s_invalidParams =
38 QMetaType::UnknownType, QMetaType::VoidStar, QMetaType::QObjectStar,
39 QMetaType::QVariantHash, QMetaType::QRect, QMetaType::QRectF,
40 QMetaType::QSize, QMetaType::QSizeF, QMetaType::QLine,
41 QMetaType::QLineF, QMetaType::QPoint, QMetaType::QPointF,
42 QMetaType::QVariantMap, QMetaType::QStringList, QMetaType::QVariantList
45 int returntype = Method.returnType();
48#ifdef __cpp_lib_ranges_contains
49 if (std::ranges::contains(s_invalidTypes, returntype))
51 if (std::ranges::any_of(s_invalidTypes,
52 [&returntype](
int Type) {
return Type == returntype; }))
55 LOG(VB_HTTP, LOG_ERR,
LOC + QString(
"Method '%1' has unsupported return type '%2'").arg(Method.name().constData(), Method.typeName()));
61 if (Method.parameterCount() > (Q_METAMETHOD_INVOKE_MAX_ARGS - 1))
63 LOG(VB_HTTP, LOG_WARNING,
LOC + QString(
"Method '%1' takes more than %2 parameters; will probably fail")
64 .arg(Method.name().constData()).arg(Q_METAMETHOD_INVOKE_MAX_ARGS - 1));
76 if (returntype <= QMetaType::User)
77 if (QString(Method.name()).startsWith(QStringLiteral(
"Get"), Qt::CaseInsensitive))
91 m_types.emplace_back(returntype >= 0 ? returntype : 0);
92 m_names.emplace_back(Method.name());
95 auto names = Method.parameterNames();
96 auto types = Method.parameterTypes();
99 for (
int i = 0; i < names.size(); ++i)
101#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
104 int type = QMetaType::fromName(
types[i]).id();
109#ifdef __cpp_lib_ranges_contains
110 if (Slot && std::ranges::contains(s_invalidParams,
type))
112 if (Slot && std::ranges::any_of(s_invalidParams,
113 [&
type](
int Type) {
return type == Type; }))
116 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Method '%1' has unsupported parameter type '%2' (%3)")
117 .arg(Method.name().constData(),
types[i].constData()).arg(
type));
121 m_names.emplace_back(names[i]);
129 const QString &ReturnName,
bool Slot)
132 std::shared_ptr<MythHTTPMetaMethod>(
new MythHTTPMetaMethod(Index, Method, RequestTypes, ReturnName, Slot));
145#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
146 QByteArray typeName = QMetaType::typeName(Type);
148 QByteArray typeName = QMetaType(Type).name();
152#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
153 auto typeflags = QMetaType::typeFlags(Type);
155 auto typeflags = QMetaType(Type).flags();
157 if ((typeflags & QMetaType::IsEnumeration) == QMetaType::IsEnumeration)
162 if (
int index = typeName.lastIndexOf(
"::" ); index > -1)
164 QString enumname = typeName.mid(index + 2);
165#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
166 const auto * metaobject = QMetaType::metaObjectForType(Type);
168 const auto * metaobject = QMetaType(Type).metaObject();
172 int enumindex = metaobject->indexOfEnumerator(enumname.toUtf8().constData());
175 QMetaEnum metaEnum = metaobject->enumerator(enumindex);
176 value = metaEnum.keyToValue(Value.toUtf8().constData());
180 *(
static_cast<int*
>(Parameter)) = value;
185 if (typeName ==
"std::chrono::seconds")
187 *(
static_cast<std::chrono::seconds*
>(Parameter)) = std::chrono::seconds(Value.toInt());
193 case QMetaType::QVariant : *(
static_cast<QVariant *
>(Parameter)) = QVariant(Value);
break;
194 case QMetaType::Bool : *(
static_cast<bool *
>(Parameter)) =
ToBool(Value );
break;
195 case QMetaType::Char : *(
static_cast<char *
>(Parameter)) = (Value.length() > 0) ? Value.at(0).toLatin1() : 0;
break;
196 case QMetaType::UChar : *(
static_cast<unsigned char*
>(Parameter)) = (Value.length() > 0) ?
static_cast<unsigned char>(Value.at(0).toLatin1()) : 0;
break;
197 case QMetaType::QChar : *(
static_cast<QChar *
>(Parameter)) = (Value.length() > 0) ? Value.at(0) : QChar(0);
break;
198 case QMetaType::Short : *(
static_cast<short *
>(Parameter)) = Value.toShort();
break;
199 case QMetaType::UShort : *(
static_cast<ushort *
>(Parameter)) = Value.toUShort();
break;
200 case QMetaType::Int : *(
static_cast<int *
>(Parameter)) = Value.toInt();
break;
201 case QMetaType::UInt : *(
static_cast<uint *
>(Parameter)) = Value.toUInt();
break;
202 case QMetaType::Long : *(
static_cast<long *
>(Parameter)) = Value.toLong();
break;
203 case QMetaType::ULong : *(
static_cast<ulong *
>(Parameter)) = Value.toULong();
break;
204 case QMetaType::LongLong : *(
static_cast<qlonglong *
>(Parameter)) = Value.toLongLong();
break;
205 case QMetaType::ULongLong : *(
static_cast<qulonglong *
>(Parameter)) = Value.toULongLong();
break;
206 case QMetaType::Double : *(
static_cast<double *
>(Parameter)) = Value.toDouble();
break;
207 case QMetaType::Float : *(
static_cast<float *
>(Parameter)) = Value.toFloat();
break;
208 case QMetaType::QString : *(
static_cast<QString *
>(Parameter)) = Value;
break;
209 case QMetaType::QByteArray: *(
static_cast<QByteArray *
>(Parameter)) = Value.toUtf8();
break;
212 case QMetaType::QDateTime :
215#if QT_VERSION < QT_VERSION_CHECK(6,5,0)
216 dt.setTimeSpec(Qt::UTC);
218 dt.setTimeZone(QTimeZone(QTimeZone::UTC));
220 *(
static_cast<QDateTime*
>(Parameter)) = dt;
224 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Unknown QMetaType:%1 %2").arg(Type).arg(QString(typeName)));
238#
if QT_VERSION < QT_VERSION_CHECK(6,0,0)
241 Type == QMetaType::fromName(
"QFileInfo").
id()
244 return QVariant::fromValue<QFileInfo>(*(
static_cast<QFileInfo*
>(Value)));
246 if (Type > QMetaType::User)
248 QObject*
object = *(
static_cast<QObject**
>(Value));
249 return QVariant::fromValue<QObject*>(
object);
252#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
253 return {Type, Value};
255 return QVariant(QMetaType(Type), Value);
static const struct wl_interface * types[]
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QDateTime fromString(const QString &dtstr)
Converts kFilename && kISODate formats to QDateTime.