Skip to content

Commit

Permalink
Implement invoke
Browse files Browse the repository at this point in the history
  • Loading branch information
beckdave committed Feb 18, 2024
1 parent df69e30 commit 2881474
Showing 1 changed file with 49 additions and 41 deletions.
90 changes: 49 additions & 41 deletions inc/finalmq/Qt/qt.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
#include "finalmq/Qt/qtdata.fmq.h"

#include <algorithm>
//#include <QCommonStyle>
#include <array>


using finalmq::RemoteEntity;
using finalmq::RemoteEntityContainer;
Expand Down Expand Up @@ -387,50 +388,51 @@ class QtInvoker : public RemoteEntity
{
init();

registerCommand<GeneralMessage>("{objectid}/{method}", [](const RequestContextPtr& requestContext, const std::shared_ptr<GeneralMessage>& request) {
registerCommand<GeneralMessage>("{objectid}/{method}", [this](const RequestContextPtr& requestContext, const std::shared_ptr<GeneralMessage>& request) {
bool found = false;

assert(request);

ZeroCopyBuffer buffer;
SerializerQt serializerQt(buffer, SerializerQt::Mode::WRAPPED_BY_QVARIANTLIST);
ParserProto parserProto(serializerQt, request->data.data(), request->data.size());
parserProto.parseStruct(request->type);

QByteArray bufferByteArray;
bufferByteArray.reserve(static_cast<int>(buffer.size()));
const std::list<std::string>& chunks = buffer.chunks();
for (const auto& chunk : chunks)
const std::string* objId = requestContext->getMetainfo("PATH_objectid");
const std::string* methodName = requestContext->getMetainfo("PATH_method");
if (objId && methodName)
{
bufferByteArray.append(chunk.data(), static_cast<int>(chunk.size()));
}
ZeroCopyBuffer buffer;
SerializerQt serializerQt(buffer, SerializerQt::Mode::WRAPPED_BY_QVARIANTLIST);
ParserProto parserProto(serializerQt, request->data.data(), request->data.size());
parserProto.parseStruct(request->type);

QByteArray bufferByteArray;
bufferByteArray.reserve(static_cast<int>(buffer.size()));
const std::list<std::string>& chunks = buffer.chunks();
for (const auto& chunk : chunks)
{
bufferByteArray.append(chunk.data(), static_cast<int>(chunk.size()));
}

QVariantList parameters;
QDataStream s(bufferByteArray);
s >> parameters;

QVariantList parameters;
QDataStream s(bufferByteArray);
s >> parameters;

//bool ok = metaMethod.invoke(
// object,
// Qt::DirectConnection,
// returnArgument,
// arguments.value(0),
// arguments.value(1),
// arguments.value(2),
// arguments.value(3),
// arguments.value(4),
// arguments.value(5),
// arguments.value(6),
// arguments.value(7),
// arguments.value(8),
// arguments.value(9)
//);

//const std::string* objId = requestContext->getMetainfo("PATH_objectid");
//const std::string* methodName = requestContext->getMetainfo("PATH_method");
//if (objId && methodName)
//{
// const std::string typeName = getTypeName(*objId, *methodName);
//}
std::array<QGenericArgument, 10> genericArguments;
for (int i = 0; i < parameters.length(); ++i)
{
const QVariant& parameter = parameters[i];
genericArguments[i] = QGenericArgument(parameter.typeName(), parameter.constData());
}

QObject* obj;
QMetaMethod metaMethod;
const std::string& typeName = getTypeName(*objId, *methodName, obj, metaMethod);
if ((obj != nullptr) && metaMethod.isValid() && (typeName == request->type))
{
found = false;
metaMethod.invoke(obj,
genericArguments[0], genericArguments[1], genericArguments[2],
genericArguments[3], genericArguments[4], genericArguments[5],
genericArguments[6], genericArguments[7], genericArguments[8], genericArguments[9]);
}
}
if (!found)
{
// not found
Expand Down Expand Up @@ -545,13 +547,19 @@ class QtInvoker : public RemoteEntity
}

std::string getTypeName(const std::string& objId, const std::string& methodName)
{
QObject* obj;
QMetaMethod metaMethod;
return getTypeName(objId, methodName, obj, metaMethod);
}

std::string getTypeName(const std::string& objId, const std::string& methodName, QObject*& obj, QMetaMethod& metaMethod)
{
std::string typeOfGeneralMessage{};
QObject* obj = findObject(QString::fromUtf8(objId.c_str()));
obj = findObject(QString::fromUtf8(objId.c_str()));
if (obj)
{
const QMetaObject* metaObject = obj->metaObject();
QMetaMethod metaMethod;
QMetaProperty metaProperty;
if (metaObject)
{
Expand Down

0 comments on commit 2881474

Please sign in to comment.