#include "DOtherSide/DOtherSide.h" #include #include #include #include #include #include #include #include #include #include #include #include "DOtherSide/DOtherSideTypesCpp.h" #include "DOtherSide/OnSlotExecutedHandler.h" #include "DOtherSide/DynamicQObjectFactory.h" #include "DOtherSide/DynamicQObject.h" void convert_to_cstring(const QString& source, char** destination) { QByteArray array = source.toUtf8(); *destination = qstrdup(array.data()); } void dos_qcoreapplication_application_dir_path(char** result) { convert_to_cstring(QCoreApplication::applicationDirPath(), result); } void dos_qguiapplication_create() { static int argc = 1; static char empty[1] = {0}; static char* argv[] = {empty}; new QGuiApplication(argc, argv); } void dos_qguiapplication_delete() { delete qApp; } void dos_qguiapplication_exec() { qApp->exec(); } void dos_qguiapplication_quit() { qApp->quit(); } void dos_qapplication_create() { static int argc = 1; static char empty[1] = {0}; static char* argv[] = {empty}; new QApplication(argc, argv); } void dos_qapplication_delete() { delete qApp; } void dos_qapplication_exec() { qApp->exec(); } void dos_qapplication_quit() { qApp->quit(); } void dos_qqmlapplicationengine_create(void** vptr) { *vptr = new QQmlApplicationEngine(); } void dos_qqmlapplicationengine_load(void* vptr, const char* filename) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); engine->load(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + QDir::separator() + QString(filename))); } void dos_qqmlapplicationengine_load_url(void* vptr, void* url) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); QUrl* qurl = reinterpret_cast(url); engine->load(*qurl); } void dos_qqmlapplicationengine_load_data(void *vptr, const char *data) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); engine->loadData(data); } void dos_qqmlapplicationengine_add_import_path(void* vptr, const char* path) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); engine->addImportPath(QString(path)); } void dos_qqmlapplicationengine_context(void* vptr, void** context) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); engine->rootContext(); *context = engine->rootContext(); } void dos_qqmlapplicationengine_rootObjects(void* vptr, void*** array, int* array_length) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); QList list = engine->rootObjects(); auto objects = new QObject*[list.size()]; if (objects == nullptr) return; for (int i = 0; i < list.length(); i += 1) objects[i] = list.at(i); *array = reinterpret_cast(objects); *array_length = list.length(); } void dos_qqmlapplicationengine_delete(void* vptr) { QQmlApplicationEngine* engine = reinterpret_cast(vptr); delete engine; } void dos_qquickview_create(void** vptr) { *vptr = new QQuickView(); } void dos_qquickview_show(void* vptr) { QQuickView* view = reinterpret_cast(vptr); view->show(); } void dos_qquickview_delete(void* vptr) { QQuickView* view = reinterpret_cast(vptr); delete view; } void dos_qquickview_source(void* vptr, char** result) { QQuickView* view = reinterpret_cast(vptr); QUrl url = view->source(); convert_to_cstring(url.toString(), result); } void dos_qquickview_set_source(void* vptr, const char* filename) { QQuickView* view = reinterpret_cast(vptr); view->setSource(QUrl::fromLocalFile(QCoreApplication::applicationDirPath() + QDir::separator() + QString(filename))); } void dos_qquickview_set_source_url(void* vptr, void* url) { QQuickView* view = reinterpret_cast(vptr); QUrl* _url = reinterpret_cast(url); view->setSource(*_url); } void dos_qquickview_set_resize_mode(void* vptr, int resizeMode) { QQuickView* view = reinterpret_cast(vptr); view->setResizeMode((QQuickView::ResizeMode) resizeMode); } void dos_qquickview_rootContext(void* vptr, void** context) { QQuickView* view = reinterpret_cast(vptr); *context = view->rootContext(); } void dos_chararray_delete(char* ptr) { if (ptr) delete[] ptr; } void dos_qobjectptr_array_delete(void** ptr) { if (ptr) delete[] ptr; } void dos_qqmlcontext_baseUrl(void* vptr, char** result) { QQmlContext* context = reinterpret_cast(vptr); QUrl url = context->baseUrl(); convert_to_cstring(url.toString(), result); } void dos_qqmlcontext_setcontextproperty(void* vptr, const char* name, void* value) { QQmlContext* context = reinterpret_cast(vptr); auto variant = reinterpret_cast(value); context->setContextProperty(QString::fromUtf8(name), *variant); } void dos_qvariant_create(void** vptr) { *vptr = new QVariant(); } void dos_qvariant_create_int(void** vptr, int value) { *vptr = new QVariant(value); } void dos_qvariant_create_bool(void** vptr, bool value) { *vptr = new QVariant(value); } void dos_qvariant_create_string(void** vptr, const char* value) { *vptr = new QVariant(value); } void dos_qvariant_create_qvariant(void** vptr, void* other) { auto newQVariant = new QVariant(); auto otherQVariant = reinterpret_cast(other); *newQVariant = *otherQVariant; *vptr = newQVariant; } void dos_qvariant_create_qobject(void** vptr, void* value) { auto qobject = reinterpret_cast(value); auto variant = new QVariant(); variant->setValue(qobject); *vptr = variant; } void dos_qvariant_create_float(void** vptr, float value) { *vptr = new QVariant(value); } void dos_qvariant_create_double(void** vptr, double value) { *vptr = new QVariant(value); } void dos_qvariant_create_qabstractlistmodel(void** vptr, void* value) { auto qobject = reinterpret_cast(value); auto variant = new QVariant(); variant->setValue(qobject); *vptr = variant; } void dos_qvariant_isnull(void* vptr, bool* isNull) { auto variant = reinterpret_cast(vptr); *isNull = variant->isNull(); } void dos_qvariant_delete(void* vptr) { auto variant = reinterpret_cast(vptr); delete variant; } void dos_qvariant_assign(void* vptr, void* other) { auto leftQVariant = reinterpret_cast(vptr); auto rightQVariant = reinterpret_cast(other); *leftQVariant = *rightQVariant; } void dos_qvariant_toInt(void* vptr, int* value) { auto variant = reinterpret_cast(vptr); *value = variant->toInt(); } void dos_qvariant_toBool(void* vptr, bool* value) { auto variant = reinterpret_cast(vptr); *value = variant->toBool(); } void dos_qvariant_toFloat(void* vptr, float* value) { auto variant = reinterpret_cast(vptr); *value = variant->toFloat(); } void dos_qvariant_toDouble(void* vptr, double* value) { auto variant = reinterpret_cast(vptr); *value = variant->toDouble(); } void dos_qvariant_toString(void* vptr, char** ptr) { auto variant = reinterpret_cast(vptr); convert_to_cstring(variant->toString(), ptr); } void dos_qvariant_toQObject(void* vptr, void** value) { auto variant = reinterpret_cast(vptr); *value = variant->value(); } void dos_qvariant_setInt(void* vptr, int value) { auto variant = reinterpret_cast(vptr); *variant = value; } void dos_qvariant_setBool(void* vptr, bool value) { auto variant = reinterpret_cast(vptr); *variant = value; } void dos_qvariant_setFloat(void* vptr, float value) { auto variant = reinterpret_cast(vptr); *variant = value; } void dos_qvariant_setDouble(void* vptr, double value) { auto variant = reinterpret_cast(vptr); *variant = value; } void dos_qvariant_setString(void* vptr, const char* value) { auto variant = reinterpret_cast(vptr); *variant = value; } void dos_qvariant_setQObject(void* vptr, void* value) { auto variant = reinterpret_cast(vptr); auto qobject = reinterpret_cast(value); variant->setValue(qobject); } void dos_qvariant_setQAbstractListModel(void* vptr, void* value) { auto variant = reinterpret_cast(vptr); auto qobject = reinterpret_cast(value); variant->setValue(qobject); } void dos_qobject_delete(void* vptr) { auto qobject = reinterpret_cast(vptr); qobject->disconnect(); delete qobject; } void dos_qobject_signal_emit(void* vptr, const char* name, int parametersCount, void** parameters) { auto qobject = reinterpret_cast(vptr); auto dynamicQObject = dynamic_cast(qobject); auto transformation = [](void* vptr)->QVariant{return *(reinterpret_cast(vptr));}; const std::vector variants = DOS::toVector(parameters, parametersCount, transformation); dynamicQObject->emitSignal(QString::fromStdString(name), variants); } void dos_qobject_signal_connect(void* senderVPtr, const char* signal, void* receiverVPtr, const char* method, int type, bool* result) { auto sender = reinterpret_cast(senderVPtr); auto receiver = reinterpret_cast(receiverVPtr); *result = QObject::connect(sender, signal, receiver, method, (Qt::ConnectionType) type); } void dos_qobject_signal_disconnect(void* senderVPtr, const char* signal, void* receiverVPtr, const char* method, bool* result) { auto sender = reinterpret_cast(senderVPtr); auto receiver = reinterpret_cast(receiverVPtr); *result = QObject::disconnect(sender, signal, receiver, method); } void dos_qobject_objectName(void* vptr, char** result) { QObject* object = reinterpret_cast(vptr); convert_to_cstring(object->objectName(), result); } void dos_qobject_findChild(void* vptr, const char* name, int options, void** child) { QObject* object = reinterpret_cast(vptr); *child = object->findChild(QString::fromUtf8(name), (Qt::FindChildOptions) options); } void dos_qmodelindex_create(void** vptr) { auto index = new QModelIndex(); *vptr = index; } void dos_qmodelindex_delete(void* vptr) { auto index = reinterpret_cast(vptr); delete index; } void dos_qmodelindex_row(void* vptr, int* row) { auto index = reinterpret_cast(vptr); *row = index->row(); } void dos_qmodelindex_column(void* vptr, int* column) { auto index = reinterpret_cast(vptr); *column = index->column(); } void dos_qmodelindex_isValid(void* vptr, bool* isValid) { auto index = reinterpret_cast(vptr); *isValid = index->isValid(); } void dos_qmodelindex_data(void* vptr, int role, void* data) { auto index = reinterpret_cast(vptr); auto result = reinterpret_cast(data); *result = index->data(role); } void dos_qmodelindex_parent(void* vptr, void* parent) { auto index = reinterpret_cast(vptr); auto parentIndex = reinterpret_cast(parent); *parentIndex = index->parent(); } void dos_qmodelindex_child(void* vptr, int row, int column, void* child) { auto index = reinterpret_cast(vptr); auto childIndex = reinterpret_cast(child); *childIndex = index->child(row, column); } void dos_qmodelindex_sibling(void* vptr, int row, int column, void* sibling) { auto index = reinterpret_cast(vptr); auto siblingIndex = reinterpret_cast(sibling); *siblingIndex = index->sibling(row, column); } void dos_qhash_int_qbytearray_create(QHashIntQByteArrayVoidPtr* vptr) { *vptr = new QHash(); } void dos_qhash_int_qbytearray_delete(QHashIntQByteArrayVoidPtr vptr) { auto qHash = reinterpret_cast*>(vptr); delete qHash; } void dos_qhash_int_qbytearray_insert(QHashIntQByteArrayVoidPtr vptr, int key, const char* value) { auto qHash = reinterpret_cast*>(vptr); qHash->insert(key, QByteArray(value)); } void dos_qhash_int_qbytearray_value(QHashIntQByteArrayVoidPtr vptr, int key, char** result) { auto qHash = reinterpret_cast*>(vptr); QByteArray value = qHash->value(key); *result = qstrdup(value.data()); } void dos_qresource_register(const char* filename) { QResource::registerResource(QString::fromUtf8(filename)); } void dos_qurl_create(void** vptr, const char* url, int parsingMode) { *vptr = new QUrl(QString::fromUtf8(url), (QUrl::ParsingMode) parsingMode); } void dos_qurl_delete(void* vptr) { QUrl* url = reinterpret_cast(vptr); delete url; } void dos_qurl_to_string(void* vptr, char** result) { QUrl* url = reinterpret_cast(vptr); convert_to_cstring(url->toString(), result); } void dos_qobjectfactory_create(void **vptr, SignalDefinitions signalDefinitions, SlotDefinitions slotDefinitions, PropertyDefinitions propertyDefinitions) { *vptr = new DOS::DynamicQObjectFactory(DOS::toVector(signalDefinitions), DOS::toVector(slotDefinitions), DOS::toVector(propertyDefinitions)); } void dos_qobjectfactory_delete(void *vptr) { auto factory = reinterpret_cast(vptr); delete factory; } void dos_qobjectfactory_create_qobject(void *vptr, void* dObjectPointer, DObjectCallback dObjectCallback, void **result) { auto factory = reinterpret_cast(vptr); *result = factory->create(DOS::OnSlotExecutedHandler(dObjectPointer, dObjectCallback)); }