12#define LOC QString("MetaMethod: ")
22 const QString& ReturnName,
bool Slot)
24 m_requestTypes(RequestTypes),
28 static const std::vector<int> s_invalidTypes =
30 QMetaType::UnknownType, QMetaType::VoidStar, QMetaType::QObjectStar,
31 QMetaType::QVariantHash, QMetaType::QRect, QMetaType::QRectF,
32 QMetaType::QSize, QMetaType::QSizeF, QMetaType::QLine,
33 QMetaType::QLineF, QMetaType::QPoint, QMetaType::QPointF
37 static const std::vector<int> s_invalidParams =
39 QMetaType::UnknownType, QMetaType::VoidStar, QMetaType::QObjectStar,
40 QMetaType::QVariantHash, QMetaType::QRect, QMetaType::QRectF,
41 QMetaType::QSize, QMetaType::QSizeF, QMetaType::QLine,
42 QMetaType::QLineF, QMetaType::QPoint, QMetaType::QPointF,
43 QMetaType::QVariantMap, QMetaType::QStringList, QMetaType::QVariantList
46 int returntype = Method.returnType();
49#ifdef __cpp_lib_ranges_contains
50 if (std::ranges::contains(s_invalidTypes, returntype))
52 if (std::ranges::any_of(s_invalidTypes,
53 [&returntype](
int Type) {
return Type == returntype; }))
56 LOG(VB_HTTP, LOG_ERR,
LOC + QString(
"Method '%1' has unsupported return type '%2'").arg(Method.name().constData(), Method.typeName()));
62 if (Method.parameterCount() > (Q_METAMETHOD_INVOKE_MAX_ARGS - 1))
64 LOG(VB_HTTP, LOG_WARNING,
LOC + QString(
"Method '%1' takes more than %2 parameters; will probably fail")
65 .arg(Method.name().constData()).arg(Q_METAMETHOD_INVOKE_MAX_ARGS - 1));
77 if (returntype <= QMetaType::User)
78 if (QString(Method.name()).startsWith(QStringLiteral(
"Get"), Qt::CaseInsensitive))
92 m_types.emplace_back(returntype >= 0 ? returntype : 0);
93 m_names.emplace_back(Method.name());
96 auto names = Method.parameterNames();
97 auto types = Method.parameterTypes();
100 for (
int i = 0; i < names.size(); ++i)
102#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
105 int type = QMetaType::fromName(
types[i]).id();
110#ifdef __cpp_lib_ranges_contains
111 if (Slot && std::ranges::contains(s_invalidParams,
type))
113 if (Slot && std::ranges::any_of(s_invalidParams,
114 [&
type](
int Type) {
return type == Type; }))
117 LOG(VB_GENERAL, LOG_ERR,
LOC + QString(
"Method '%1' has unsupported parameter type '%2' (%3)")
118 .arg(Method.name().constData(),
types[i].constData()).arg(
type));
122 m_names.emplace_back(names[i]);
130 const QString &ReturnName,
bool Slot)
133 std::shared_ptr<MythHTTPMetaMethod>(
new MythHTTPMetaMethod(Index, Method, RequestTypes, ReturnName, Slot));
146#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
147 QByteArray typeName = QMetaType::typeName(Type);
149 QByteArray typeName = QMetaType(Type).name();
153#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
154 auto typeflags = QMetaType::typeFlags(Type);
156 auto typeflags = QMetaType(Type).flags();
158 if ((typeflags & QMetaType::IsEnumeration) == QMetaType::IsEnumeration)
163 if (
int index = typeName.lastIndexOf(
"::" ); index > -1)
165 QString enumname = typeName.mid(index + 2);
166#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
167 const auto * metaobject = QMetaType::metaObjectForType(Type);
169 const auto * metaobject = QMetaType(Type).metaObject();
173 int enumindex = metaobject->indexOfEnumerator(enumname.toUtf8().constData());
176 QMetaEnum metaEnum = metaobject->enumerator(enumindex);
177 value = metaEnum.keyToValue(Value.toUtf8().constData());
181 *(
static_cast<int*
>(Parameter)) = value;
186 if (typeName ==
"std::chrono::seconds")
188 *(
static_cast<std::chrono::seconds*
>(Parameter)) = std::chrono::seconds(Value.toInt());
194 case QMetaType::QVariant : *(
static_cast<QVariant *
>(Parameter)) = QVariant(Value);
break;
195 case QMetaType::Bool : *(
static_cast<bool *
>(Parameter)) =
ToBool(Value );
break;
196 case QMetaType::Char : *(
static_cast<char *
>(Parameter)) = (Value.length() > 0) ? Value.at(0).toLatin1() : 0;
break;
197 case QMetaType::UChar : *(
static_cast<unsigned char*
>(Parameter)) = (Value.length() > 0) ?
static_cast<unsigned char>(Value.at(0).toLatin1()) : 0;
break;
198 case QMetaType::QChar : *(
static_cast<QChar *
>(Parameter)) = (Value.length() > 0) ? Value.at(0) : QChar(0);
break;
199 case QMetaType::Short : *(
static_cast<short *
>(Parameter)) = Value.toShort();
break;
200 case QMetaType::UShort : *(
static_cast<ushort *
>(Parameter)) = Value.toUShort();
break;
201 case QMetaType::Int : *(
static_cast<int *
>(Parameter)) = Value.toInt();
break;
202 case QMetaType::UInt : *(
static_cast<uint *
>(Parameter)) = Value.toUInt();
break;
203 case QMetaType::Long : *(
static_cast<long *
>(Parameter)) = Value.toLong();
break;
204 case QMetaType::ULong : *(
static_cast<ulong *
>(Parameter)) = Value.toULong();
break;
205 case QMetaType::LongLong : *(
static_cast<qlonglong *
>(Parameter)) = Value.toLongLong();
break;
206 case QMetaType::ULongLong : *(
static_cast<qulonglong *
>(Parameter)) = Value.toULongLong();
break;
207 case QMetaType::Double : *(
static_cast<double *
>(Parameter)) = Value.toDouble();
break;
208 case QMetaType::Float : *(
static_cast<float *
>(Parameter)) = Value.toFloat();
break;
209 case QMetaType::QString : *(
static_cast<QString *
>(Parameter)) = Value;
break;
210 case QMetaType::QByteArray: *(
static_cast<QByteArray *
>(Parameter)) = Value.toUtf8();
break;
213 case QMetaType::QDateTime :
216#if QT_VERSION < QT_VERSION_CHECK(6,5,0)
217 dt.setTimeSpec(Qt::UTC);
219 dt.setTimeZone(QTimeZone(QTimeZone::UTC));
221 *(
static_cast<QDateTime*
>(Parameter)) = dt;
225 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Unknown QMetaType:%1 %2").arg(Type).arg(QString(typeName)));
239#
if QT_VERSION < QT_VERSION_CHECK(6,0,0)
242 Type == QMetaType::fromName(
"QFileInfo").
id()
245 return QVariant::fromValue<QFileInfo>(*(
static_cast<QFileInfo*
>(Value)));
247 if (Type > QMetaType::User)
249 QObject*
object = *(
static_cast<QObject**
>(Value));
250 return QVariant::fromValue<QObject*>(
object);
253#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
254 return {Type, Value};
256 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.