14 #define LOC QString("HTTPService: ")
17 : m_name(MetaService->m_name),
18 m_staticMetaService(MetaService)
29 QString& method =
Request->m_fileName;
34 if (method ==
"wsdl") {
38 if ( method ==
"xsd" )
41 if (
Request->m_queries.contains(
"type" ))
49 LOG(VB_HTTP, LOG_DEBUG,
LOC + QString(
"Looking for method '%1'").arg(method));
53 if (path == method) { handler = handle;
break; }
55 if (handler ==
nullptr)
59 LOG(VB_HTTP, LOG_DEBUG,
LOC +
"Failed to find method");
64 if (handler->m_protected)
66 LOG(VB_HTTP, LOG_INFO,
LOC +
"Authentication required for this call");
70 if (handler->m_types.empty())
74 Request->m_allowed = handler->m_requestTypes;
81 size_t typecount = std::min(handler->m_types.size(),
static_cast<size_t>(100));
86 std::array<void*, 100> param {
nullptr};
87 std::array<int, 100>
types { 0 };
90 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
91 param[0] = handler->m_types[0] == 0 ? nullptr : QMetaType::create(handler->m_types[0]);
93 param[0] = handler->m_types[0] == 0 ? nullptr : QMetaType(handler->m_types[0]).create();
95 types[0] = handler->m_types[0];
101 while (count < typecount)
103 auto name = handler->m_names[count];
104 auto value =
Request->m_queries.value(name.toLower(),
"");
105 auto type = handler->m_types[count];
110 error = QString(
"Unknown parameter type '%1'").arg(name);
114 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
115 auto * newparam = QMetaType::create(
type);
117 auto * newparam = QMetaType(
type).create();
119 param[count] = handler->CreateParameter(newparam,
type, value);
124 if (count == typecount)
127 QVariant returnvalue;
129 if (qt_metacall(QMetaObject::InvokeMetaMethod, handler->m_index, param.data()) >= 0)
130 LOG(VB_GENERAL, LOG_ERR,
"qt_metacall error");
134 returnvalue = handler->CreateReturnValue(
types[0], param[0]);
137 catch( QString &msg ) {
138 LOG(VB_GENERAL, LOG_ERR,
"Service Exception: " + msg);
146 if (!returnvalue.isValid())
151 else if (returnvalue.canConvert<QFileInfo>())
155 auto info = returnvalue.value<QFileInfo>();
156 QString
file = info.absoluteFilePath();
157 if (
file.size() == 0)
159 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Invalid request for unknown file"));
166 if (!httpfile->open(QIODevice::ReadOnly))
168 LOG(VB_GENERAL, LOG_WARNING,
LOC + QString(
"Failed to open '%1'").arg(
file));
174 httpfile->m_lastModified = info.lastModified();
176 LOG(VB_HTTP, LOG_DEBUG,
LOC + QString(
"Last modified: %2")
192 if (returnvalue.canConvert<QObject*>())
194 LOG(VB_HTTP, LOG_DEBUG,
LOC +
"Deleting object");
195 auto *
object = returnvalue.value<QObject*>();
202 for (
size_t i = 0; i < typecount; ++i)
204 if ((param[i] !=
nullptr) && (
types[i] != 0))
206 #if QT_VERSION < QT_VERSION_CHECK(6,0,0)
207 QMetaType::destroy(
types[i], param[i]);
209 QMetaType(
types[i]).destroy(param[i]);
215 if (count != typecount)