/*
Copyright (C) 2019 Filippo Cucchetto.
Contact: https://github.com/filcuc/dotherside
This file is part of the DOtherSide library.
The DOtherSide library is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the license, or (at your opinion) any later version.
The DOtherSide library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the DOtherSide library. If not, see .
*/
#include "DOtherSide/DOtherSide.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef QT_QUICKCONTROLS2_LIB
#include
#endif
#include
#include
#include "DOtherSide/DOtherSideTypesCpp.h"
#include "DOtherSide/DosQMetaObject.h"
#include "DOtherSide/DosQObject.h"
#include "DOtherSide/DosQObjectImpl.h"
#include "DOtherSide/DosQAbstractItemModel.h"
#include "DOtherSide/DosQDeclarative.h"
#include "DOtherSide/DosQQuickImageProvider.h"
#include "DOtherSide/DOtherSideSingleInstance.h"
#include "DOtherSide/Status/DockShowAppEvent.h"
#include "DOtherSide/Status/OSThemeEvent.h"
#include "DOtherSide/Status/UrlSchemeEvent.h"
#include "DOtherSide/Status/OSNotification.h"
#include "DOtherSide/Status/KeychainManager.h"
#include "DOtherSide/Status/SoundManager.h"
#ifdef MONITORING
#include
#include "StatusDesktop/Monitoring/Monitor.h"
#endif
namespace {
void register_meta_types()
{
qRegisterMetaType>();
#ifdef MONITORING
qmlRegisterSingletonType("Monitoring", 1 , 0, "Monitor", &Monitor::qmlInstance);
#endif
}
}
// jrainville: I'm not sure where to put this, but it works like so
namespace {
QTranslator g_translator;
}
class QMLNetworkAccessFactory : public QQmlNetworkAccessManagerFactory
{
public:
static QString tmpPath;
QMLNetworkAccessFactory()
: QQmlNetworkAccessManagerFactory()
{
}
QNetworkAccessManager* create(QObject* parent) override;
};
QString QMLNetworkAccessFactory::tmpPath = "";
QNetworkAccessManager* QMLNetworkAccessFactory::create(QObject* parent)
{
QNetworkAccessManager* manager = new QNetworkAccessManager(parent);
QNetworkDiskCache* cache = new QNetworkDiskCache(manager);
qDebug() << "Network Cache Dir: " << QMLNetworkAccessFactory::tmpPath ;
cache->setCacheDirectory(QMLNetworkAccessFactory::tmpPath);
manager->setCache(cache);
return manager;
}
void dos_add_self_signed_certificate(const char* pemCertificateContent) {
QSslConfiguration defaultConfig = QSslConfiguration::defaultConfiguration();
QList certList = defaultConfig.caCertificates();
QByteArray data(pemCertificateContent);
const auto certs = QSslCertificate::fromData(data, QSsl::Pem);
for (const QSslCertificate &cert : certs) {
certList += cert;
}
// According to the docs, caCertificates() should have returned
// the system certificates (https://doc.qt.io/archives/qt-5.14/qsslconfiguration.html#systemCaCertificates)
// but looks like there's a bug in QT, because caCertificates()
// returns an empty list. Without this, we end up not being
// able to load stickers or gifs
certList.append(defaultConfig.systemCaCertificates());
defaultConfig.setCaCertificates(certList);
QSslConfiguration::setDefaultConfiguration(defaultConfig);
}
char *convert_to_cstring(const QByteArray &array)
{
return qstrdup(array.data());
}
char *convert_to_cstring(const QString &source)
{
return convert_to_cstring(source.toUtf8());
}
char *dos_qguiapplication_application_dir_path()
{
return convert_to_cstring(QGuiApplication::applicationDirPath());
}
void dos_qguiapplication_enable_hdpi(const char *uiScaleFilePath)
{
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
QFile scaleFile(QString::fromUtf8(uiScaleFilePath));
if (scaleFile.open(QIODevice::ReadOnly)) {
const auto scale = scaleFile.readAll();
qputenv("QT_SCALE_FACTOR", scale);
}
}
void dos_qguiapplication_initialize_opengl()
{
QGuiApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
}
void dos_qguiapplication_try_enable_threaded_renderer()
{
if(QSysInfo::kernelType() == "darwin" && QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
{
//Threaded renderer is crashing on M1 Macs
return;
}
qputenv("QSG_RENDER_LOOP", "threaded");
}
// This catches the QT and QML logs and outputs them.
// This is necessary on Windows, because otherwise we do not get any logs at all
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QByteArray localMsg = msg.toLocal8Bit();
const char *file = context.file ? context.file : "";
const char *function = context.function ? context.function : "";
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtInfoMsg:
fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
default:
fprintf(stderr, "Default: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
break;
}
}
void dos_qguiapplication_create()
{
// The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program,
// and retain their last-stored values between program startup and program termination.
// In other words: argv strings can't be string literals!
const auto toCharPtr = [](const QString& str) {
auto bytes = str.toLocal8Bit();
char *data = new char[bytes.size() + 1];
strcpy(data, bytes.data());
return data; // we don't care about memory leak here
};
#ifdef QML_DEBUG_PORT
static int argc = 2;
static char *argv[] = {toCharPtr(QStringLiteral("Status")), toCharPtr(QString("-qmljsdebugger=port:%1,block").arg(QML_DEBUG_PORT))};
#else
static int argc = 1;
static char *argv[] = {toCharPtr(QStringLiteral("Status"))};
#endif
// NOTE: https://github.com/status-im/status-desktop/issues/6930
// We increase js stack size to prevent "Maximum call stack size exceeded" on UI loading.
qputenv("QV4_JS_MAX_STACK_SIZE", "10485760");
qputenv("QT_QUICK_CONTROLS_HOVER_ENABLED", "1");
qInstallMessageHandler(myMessageOutput);
new QGuiApplication(argc, argv);
register_meta_types();
}
void dos_qguiapplication_clipboard_setText(const char* text)
{
QGuiApplication::clipboard()->setText(text);
}
char* dos_qguiapplication_clipboard_getText()
{
auto clipboardText = QGuiApplication::clipboard()->text();
return convert_to_cstring(clipboardText);
}
void dos_qguiapplication_clipboard_setImage(const char* text)
{
QByteArray btArray = QString(text).split("base64,")[1].toUtf8();
QImage image;
image.loadFromData(QByteArray::fromBase64(btArray));
Q_ASSERT(!image.isNull());
QGuiApplication::clipboard()->setImage(image);
}
void dos_qguiapplication_clipboard_setImageByUrl(const char* url)
{
static thread_local QNetworkAccessManager manager;
manager.setAutoDeleteReplies(true);
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url)));
QObject::connect(reply, &QNetworkReply::finished, [reply]() {
if(reply->error() == QNetworkReply::NoError) {
QByteArray btArray = reply->readAll();
QImage image;
image.loadFromData(btArray);
Q_ASSERT(!image.isNull());
QGuiApplication::clipboard()->setImage(image);
}
else {
qWarning() << "dos_qguiapplication_clipboard_setImageByUrl: Downloading image failed!";
}
});
}
void dos_qguiapplication_download_image(const char *imageSource, const char *filePath)
{
// Extract file path that can be used to save the image
const QString fileL = QFile::decodeName(filePath);
// Get current Date/Time information to use in naming of the image file
const QString dateTimeString = QDateTime::currentDateTime().toString("dd-MM-yyyy_hh-mm-ss");
// Extract the image data to be able to load and save into a QImage
const QByteArray btArray = QString(imageSource).split("base64,")[1].toUtf8();
QImage image;
image.loadFromData(QByteArray::fromBase64(btArray));
image.save(fileL + "/image_" + dateTimeString + ".png");
}
void dos_qguiapplication_download_imageByUrl(const char *url, const char *filePath)
{
static thread_local QNetworkAccessManager manager;
manager.setAutoDeleteReplies(true);
QNetworkReply *reply = manager.get(QNetworkRequest(QUrl(url)));
const auto path = QFile::decodeName(filePath);
QObject::connect(reply, &QNetworkReply::finished, [reply, path] {
if(reply->error() == QNetworkReply::NoError) {
// Get current Date/Time information to use in naming of the image file
const QString dateTimeString = QDateTime::currentDateTime().toString("dd-MM-yyyy_hh-mm-ss");
// Extract the image data to be able to load and save into a QImage
QByteArray btArray = reply->readAll();
QImage image;
image.loadFromData(btArray);
Q_ASSERT(!image.isNull());
image.save(path + "/image_" + dateTimeString + ".png");
}
else {
qWarning() << "dos_qguiapplication_download_imageByUrl: Downloading image failed!";
}
});
}
void dos_qguiapplication_delete()
{
delete qGuiApp;
}
void dos_qguiapplication_exec()
{
qGuiApp->exec();
}
void dos_qguiapplication_quit()
{
// This way we will be safe for quitting the app (avoid potential crashes).
QMetaObject::invokeMethod(qGuiApp, "quit", Qt::QueuedConnection);
}
void dos_qguiapplication_icon(const char *filename)
{
qGuiApp->setWindowIcon(QIcon(filename));
}
void dos_qguiapplication_installEventFilter(::DosEvent* vptr)
{
auto qobject = static_cast(vptr);
qGuiApp->installEventFilter(qobject);
}
::DosQQmlApplicationEngine *dos_qqmlapplicationengine_create()
{
#ifdef MONITORING
auto engine = new QQmlApplicationEngine();
auto disabledValue = QStringLiteral("0");
if (QProcessEnvironment::systemEnvironment().value(
QStringLiteral("DISABLE_MONITORING_WINDOW"), disabledValue) == disabledValue)
Monitor::instance().initialize(engine);
return engine;
#else
return new QQmlApplicationEngine();
#endif
}
::DosQQmlNetworkAccessManagerFactory *dos_qqmlnetworkaccessmanagerfactory_create(const char* tmpPath)
{
QMLNetworkAccessFactory::tmpPath = tmpPath;
return new QMLNetworkAccessFactory();
}
void dos_qqmlnetworkaccessmanager_clearconnectioncache(::DosQQmlNetworkAccessManager *vptr)
{
auto netAccMgr = static_cast(vptr);
netAccMgr->clearConnectionCache();
}
void dos_qqmlnetworkaccessmanager_setnetworkaccessible(::DosQQmlNetworkAccessManager *vptr, int accessibility)
{
auto netAccMgr = static_cast(vptr);
auto accessible = static_cast(accessibility);
netAccMgr->setNetworkAccessible(accessible);
}
::DosQQmlNetworkAccessManager dos_qqmlapplicationengine_getNetworkAccessManager(::DosQQmlApplicationEngine *vptr)
{
auto engine = static_cast(vptr);
engine->networkAccessManager();
}
void dos_qqmlapplicationengine_setNetworkAccessManagerFactory(::DosQQmlApplicationEngine *vptr, ::DosQQmlNetworkAccessManagerFactory *factory)
{
auto engine = static_cast(vptr);
auto namFactory = static_cast(factory);
engine->setNetworkAccessManagerFactory(namFactory);
}
void dos_qqmlapplicationengine_load(::DosQQmlApplicationEngine *vptr, const char *filename)
{
auto engine = static_cast(vptr);
QObject::connect(
engine, &QQmlApplicationEngine::objectCreated, qGuiApp,
[](QObject *obj, const QUrl &objUrl) {
if (!obj) {
qWarning() << "Error while loading QML:" << objUrl;
QCoreApplication::exit(EXIT_FAILURE);
}
},
Qt::QueuedConnection);
engine->load(QUrl::fromLocalFile(QGuiApplication::applicationDirPath() + QDir::separator() + QString(filename)));
}
void dos_qqmlapplicationengine_load_url(::DosQQmlApplicationEngine *vptr, ::DosQUrl *url)
{
auto engine = static_cast(vptr);
auto qurl = static_cast(url);
QObject::connect(
engine, &QQmlApplicationEngine::objectCreated, qGuiApp,
[](QObject *obj, const QUrl &objUrl) {
if (!obj) {
qWarning() << "Error while loading QML:" << objUrl;
QCoreApplication::exit(EXIT_FAILURE);
}
},
Qt::QueuedConnection);
engine->load(*qurl);
}
void dos_qqmlapplicationengine_load_data(::DosQQmlApplicationEngine *vptr, const char *data)
{
auto engine = static_cast(vptr);
engine->loadData(data);
}
void dos_qguiapplication_load_translation(::DosQQmlApplicationEngine *vptr, const char* translationPackage, bool shouldRetranslate)
{
if (!g_translator.isEmpty()) {
QGuiApplication::removeTranslator(&g_translator);
}
if (g_translator.load(translationPackage)) {
bool success = QGuiApplication::installTranslator(&g_translator);
auto engine = static_cast(vptr);
if (engine && success && shouldRetranslate)
engine->retranslate();
} else {
printf("Failed to load translation file %s\n", translationPackage);
}
}
void dos_qqmlapplicationengine_add_import_path(::DosQQmlApplicationEngine *vptr, const char *path)
{
auto engine = static_cast(vptr);
engine->addImportPath(QString(path));
}
::DosQQmlContext *dos_qqmlapplicationengine_context(::DosQQmlApplicationEngine *vptr)
{
auto engine = static_cast(vptr);
engine->rootContext();
return engine->rootContext();
}
void dos_qqmlapplicationengine_addImageProvider(DosQQmlApplicationEngine *vptr, const char* name, DosQQuickImageProvider *vptr_i)
{
auto engine = static_cast(vptr);
auto provider = static_cast(vptr_i);
engine->addImageProvider(QString(name), provider);
}
void dos_qqmlapplicationengine_delete(::DosQQmlApplicationEngine *vptr)
{
auto engine = static_cast(vptr);
delete engine;
}
::DosQQuickImageProvider *dos_qquickimageprovider_create(RequestPixmapCallback callback)
{
return new DosImageProvider(callback);
}
void dos_qquickimageprovider_delete(::DosQQuickImageProvider *vptr)
{
auto provider = static_cast(vptr);
delete provider;
}
::DosPixmap *dos_qpixmap_create()
{
return new QPixmap();
}
::DosPixmap *dos_qpixmap_create_qpixmap(const DosPixmap *other)
{
auto pixmap = static_cast(other);
return new QPixmap(pixmap ? *pixmap : QPixmap());
}
::DosPixmap *dos_qpixmap_create_width_and_height(int width, int height)
{
return new QPixmap(width, height);
}
void dos_qpixmap_delete(DosPixmap *vptr)
{
auto pixmap = static_cast(vptr);
delete pixmap;
}
void dos_qpixmap_load(DosPixmap *vptr, const char* filepath, const char* format)
{
auto pixmap = static_cast(vptr);
pixmap->load(QString(filepath), format);
}
void dos_qpixmap_loadFromData(DosPixmap *vptr, const unsigned char* data, unsigned int len)
{
auto pixmap = static_cast(vptr);
pixmap->loadFromData(data, len);
}
void dos_qpixmap_fill(DosPixmap *vptr, unsigned char r, unsigned char g, unsigned char b, unsigned char a)
{
auto pixmap = static_cast(vptr);
pixmap->fill(QColor(r, g, b, a));
}
void dos_qpixmap_assign(DosPixmap *vptr, const DosPixmap *other)
{
if (vptr) {
auto lhs = static_cast(vptr);
auto rhs = static_cast(other);
*lhs = rhs ? *rhs : QPixmap();
}
}
bool dos_qpixmap_isNull(DosPixmap *vptr)
{
auto pixmap = static_cast(vptr);
return pixmap->isNull();
}
::DosQQuickView *dos_qquickview_create()
{
return new QQuickView();
}
void dos_qquickview_show(::DosQQuickView *vptr)
{
auto view = static_cast(vptr);
view->show();
}
void dos_qquickview_delete(::DosQQuickView *vptr)
{
auto view = static_cast(vptr);
delete view;
}
char *dos_qquickview_source(const ::DosQQuickView *vptr)
{
auto view = static_cast(vptr);
QUrl url = view->source();
return convert_to_cstring(url.toString());
}
void dos_qquickview_set_source(::DosQQuickView *vptr, const char *filename)
{
auto view = static_cast(vptr);
view->setSource(QUrl::fromLocalFile(QGuiApplication::applicationDirPath() + QDir::separator() + QString(filename)));
}
void dos_qquickview_set_source_url(::DosQQuickView *vptr, ::DosQUrl *url)
{
auto view = static_cast(vptr);
auto _url = static_cast(url);
view->setSource(*_url);
}
void dos_qquickview_set_resize_mode(::DosQQuickView *vptr, int resizeMode)
{
auto view = static_cast(vptr);
view->setResizeMode(static_cast(resizeMode));
}
::DosQQmlContext *dos_qquickview_rootContext(::DosQQuickView *vptr)
{
auto view = static_cast(vptr);
return view->rootContext();
}
void dos_chararray_delete(char *ptr)
{
if (ptr) delete[] ptr;
}
void dos_qvariantarray_delete(DosQVariantArray *ptr)
{
if (!ptr || !ptr->data)
return;
// Delete each variant
for (int i = 0; i < ptr->size; ++i)
dos_qvariant_delete(ptr->data[i]);
// Delete the array
delete[] ptr->data;
ptr->data = nullptr;
ptr->size = 0;
// Delete the wrapped struct
delete ptr;
}
char *dos_qqmlcontext_baseUrl(const ::DosQQmlContext *vptr)
{
auto context = static_cast(vptr);
QUrl url = context->baseUrl();
return convert_to_cstring(url.toString());
}
void dos_qqmlcontext_setcontextproperty(::DosQQmlContext *vptr, const char *name, ::DosQVariant *value)
{
auto context = static_cast(vptr);
auto variant = static_cast(value);
context->setContextProperty(QString::fromUtf8(name), *variant);
#ifdef MONITORING
Monitor::instance().addContextPropertyName(QString::fromUtf8(name));
#endif
}
::DosQVariant *dos_qvariant_create()
{
return new QVariant();
}
::DosQVariant *dos_qvariant_create_int(int value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_longlong(long long value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_ulonglong(unsigned long long value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_bool(bool value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_string(const char *value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_qvariant(const ::DosQVariant *other)
{
auto otherQVariant = static_cast(other);
auto result = new QVariant();
*result = *otherQVariant;
return result;
}
::DosQVariant *dos_qvariant_create_qobject(::DosQObject *value)
{
auto qobject = static_cast(value);
auto result = new QVariant();
result->setValue(qobject);
return result;
}
::DosQVariant *dos_qvariant_create_float(float value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_double(double value)
{
return new QVariant(value);
}
::DosQVariant *dos_qvariant_create_array(int size, ::DosQVariant **array)
{
QList data;
data.reserve(size);
for (int i = 0; i < size; ++i)
data << *(static_cast(array[i]));
return new QVariant(data);
}
bool dos_qvariant_isnull(const DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->isNull();
}
void dos_qvariant_delete(::DosQVariant *vptr)
{
auto variant = static_cast(vptr);
delete variant;
}
void dos_qvariant_assign(::DosQVariant *vptr, const DosQVariant *other)
{
auto leftQVariant = static_cast(vptr);
auto rightQVariant = static_cast(other);
*leftQVariant = *rightQVariant;
}
int dos_qvariant_toInt(const ::DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->toInt();
}
long long dos_qvariant_toLongLong(const ::DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->toLongLong();
}
unsigned long long dos_qvariant_toULongLong(const ::DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->toULongLong();
}
bool dos_qvariant_toBool(const ::DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->toBool();
}
float dos_qvariant_toFloat(const DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->toFloat();
}
double dos_qvariant_toDouble(const DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->toDouble();
}
char *dos_qvariant_toString(const DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return convert_to_cstring(variant->toString());
}
DosQVariantArray *dos_qvariant_toArray(const DosQVariant *vptr)
{
auto variant = static_cast(vptr);
QVariantList data = variant->toList();
auto result = new DosQVariantArray();
result->size = data.size();
result->data = new DosQVariant*[result->size];
for (int i = 0; i < result->size; ++i)
result->data[i] = new QVariant(data[i]);
return result;
}
::DosQObject *dos_qvariant_toQObject(const DosQVariant *vptr)
{
auto variant = static_cast(vptr);
return variant->value();
}
void dos_qvariant_setInt(::DosQVariant *vptr, int value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setLongLong(::DosQVariant *vptr, long long value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setULongLong(::DosQVariant *vptr, unsigned long long value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setBool(::DosQVariant *vptr, bool value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setFloat(::DosQVariant *vptr, float value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setDouble(::DosQVariant *vptr, double value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setString(::DosQVariant *vptr, const char *value)
{
auto variant = static_cast(vptr);
*variant = value;
}
void dos_qvariant_setQObject(::DosQVariant *vptr, ::DosQObject *value)
{
auto variant = static_cast(vptr);
auto qobject = static_cast(value);
variant->setValue(qobject);
}
void dos_qvariant_setArray(::DosQVariant *vptr, int size, ::DosQVariant **array)
{
auto variant = static_cast(vptr);
QVariantList data;
data.reserve(size);
for (int i = 0; i < size; ++i)
data << *(static_cast(array[i]));
variant->setValue(data);
}
::DosQMetaObject *dos_qobject_qmetaobject()
{
return new DOS::DosIQMetaObjectHolder(std::make_shared());
}
::DosQObject *dos_qobject_create(void *dObjectPointer, ::DosQMetaObject *metaObject, ::DObjectCallback dObjectCallback)
{
auto metaObjectHolder = static_cast(metaObject);
auto dosQObject = new DOS::DosQObject(dObjectPointer, metaObjectHolder->data(), dObjectCallback);
QQmlEngine::setObjectOwnership(dosQObject, QQmlEngine::CppOwnership);
return static_cast(dosQObject);
}
void dos_qobject_delete(::DosQObject *vptr)
{
auto qobject = static_cast(vptr);
qobject->disconnect();
delete qobject;
}
void dos_qobject_deleteLater(::DosQObject *vptr)
{
auto qobject = static_cast(vptr);
qobject->deleteLater();
}
void dos_qobject_signal_emit(::DosQObject *vptr, const char *name, int parametersCount, void **parameters)
{
auto qobject = static_cast(vptr);
auto dynamicQObject = dynamic_cast(qobject);
auto transformation = [](void *vptr)->QVariant{return *(static_cast(vptr));};
const std::vector variants = DOS::toVector(parameters, parametersCount, transformation);
dynamicQObject->emitSignal(qobject, QString::fromStdString(name), variants);
}
bool dos_qobject_signal_connect(::DosQObject *senderVPtr,
const char *signal,
::DosQObject *receiverVPtr,
const char *method,
int type)
{
auto sender = static_cast(senderVPtr);
auto receiver = static_cast(receiverVPtr);
return QObject::connect(sender, signal, receiver, method, static_cast(type));
}
bool dos_qobject_signal_disconnect(::DosQObject *senderVPtr,
const char *signal,
::DosQObject *receiverVPtr,
const char *method)
{
auto sender = static_cast(senderVPtr);
auto receiver = static_cast(receiverVPtr);
return QObject::disconnect(sender, signal, receiver, method);
}
char *dos_qobject_objectName(const ::DosQObject *vptr)
{
auto object = static_cast(vptr);
return convert_to_cstring(object->objectName());
}
void dos_qobject_setObjectName(::DosQObject *vptr, const char *name)
{
auto object = static_cast(vptr);
object->setObjectName(QString::fromUtf8(name));
}
::DosQVariant *dos_qobject_property(DosQObject *vptr, const char *propertyName) {
auto object = static_cast(vptr);
auto result = new QVariant(object->property(propertyName));
return static_cast(result);
}
bool dos_qobject_setProperty(::DosQObject *vptr, const char *propertyName, ::DosQVariant *dosValue){
auto object = static_cast(vptr);
auto value = static_cast(dosValue);
return object->setProperty(propertyName, *value);
}
::DosQModelIndex *dos_qmodelindex_create()
{
return new QModelIndex();
}
::DosQModelIndex *dos_qmodelindex_create_qmodelindex(::DosQModelIndex *other_vptr)
{
auto other = static_cast(other_vptr);
return new QModelIndex(*other);
}
void dos_qmodelindex_delete(::DosQModelIndex *vptr)
{
auto index = static_cast(vptr);
delete index;
}
int dos_qmodelindex_row(const ::DosQModelIndex *vptr)
{
auto index = static_cast(vptr);
return index->row();
}
int dos_qmodelindex_column(const ::DosQModelIndex *vptr)
{
auto index = static_cast(vptr);
return index->column();
}
bool dos_qmodelindex_isValid(const ::DosQModelIndex *vptr)
{
auto index = static_cast(vptr);
return index->isValid();
}
::DosQVariant *dos_qmodelindex_data(const ::DosQModelIndex *vptr, int role)
{
auto index = static_cast(vptr);
auto result = new QVariant(index->data(role));
return static_cast(result);
}
::DosQModelIndex *dos_qmodelindex_parent(const ::DosQModelIndex *vptr)
{
auto index = static_cast(vptr);
auto result = new QModelIndex(index->parent());
return static_cast(result);
}
::DosQModelIndex *dos_qmodelindex_child(const ::DosQModelIndex *vptr, int row, int column)
{
auto index = static_cast(vptr);
auto result = new QModelIndex(index->child(row, column));
return static_cast(result);
}
::DosQModelIndex *dos_qmodelindex_sibling(const ::DosQModelIndex *vptr, int row, int column)
{
auto index = static_cast(vptr);
auto result = new QModelIndex(index->sibling(row, column));
return static_cast(result);
}
void dos_qmodelindex_assign(::DosQModelIndex *l, const ::DosQModelIndex *r)
{
auto li = static_cast(l);
auto ri = static_cast(r);
*li = *ri;
}
void *dos_qmodelindex_internalPointer(DosQModelIndex *vptr)
{
auto index = static_cast(vptr);
return index->internalPointer();
}
::DosQHashIntQByteArray *dos_qhash_int_qbytearray_create()
{
return new QHash();
}
void dos_qhash_int_qbytearray_delete(::DosQHashIntQByteArray *vptr)
{
auto qHash = static_cast*>(vptr);
delete qHash;
}
void dos_qhash_int_qbytearray_insert(::DosQHashIntQByteArray *vptr, int key, const char *value)
{
auto qHash = static_cast*>(vptr);
qHash->insert(key, QByteArray(value));
}
char *dos_qhash_int_qbytearray_value(const ::DosQHashIntQByteArray *vptr, int key)
{
auto qHash = static_cast*>(vptr);
return convert_to_cstring(qHash->value(key));
}
void dos_qresource_register(const char *filename)
{
QResource::registerResource(QString::fromUtf8(filename));
}
::DosQUrl *dos_qurl_create(const char *url, int parsingMode)
{
return new QUrl(QString::fromUtf8(url), static_cast(parsingMode));
}
void dos_qurl_delete(::DosQUrl *vptr)
{
auto url = static_cast(vptr);
delete url;
}
char *dos_qurl_to_string(const ::DosQUrl *vptr)
{
auto url = static_cast(vptr);
return convert_to_cstring(url->toString());
}
bool dos_qurl_isValid(const ::DosQUrl *vptr)
{
auto url = static_cast(vptr);
return url->isValid();
}
::DosQMetaObject *dos_qmetaobject_create(::DosQMetaObject *superClassVPtr,
const char *className,
const ::SignalDefinitions *signalDefinitions,
const ::SlotDefinitions *slotDefinitions,
const ::PropertyDefinitions *propertyDefinitions)
{
Q_ASSERT(superClassVPtr);
auto superClassHolder = static_cast(superClassVPtr);
Q_ASSERT(superClassHolder);
auto data = superClassHolder->data();
Q_ASSERT(data);
auto metaObject = std::make_shared(data,
QString::fromUtf8(className),
DOS::toVector(*signalDefinitions),
DOS::toVector(*slotDefinitions),
DOS::toVector(*propertyDefinitions));
return new DOS::DosIQMetaObjectHolder(std::move(metaObject));
}
void dos_signal(::DosQObject *vptr, const char *signal, const char *slot) //
{
auto qobject = static_cast(vptr);
std::string signal_copy = signal;
std::string slot_copy = slot;
QMetaObject::invokeMethod(qobject, slot_copy.c_str(), Qt::QueuedConnection, Q_ARG(QString, signal_copy.c_str()));
}
void dos_qmetaobject_delete(::DosQMetaObject *vptr)
{
auto factory = static_cast(vptr);
delete factory;
}
::DosQMetaObject *dos_qabstracttablemodel_qmetaobject()
{
return new DOS::DosIQMetaObjectHolder(std::make_shared());
}
::DosQAbstractListModel *dos_qabstracttablemodel_create(void *dObjectPointer,
::DosQMetaObject *metaObjectPointer,
::DObjectCallback dObjectCallback,
::DosQAbstractItemModelCallbacks *callbacks)
{
auto metaObjectHolder = static_cast(metaObjectPointer);
auto model = new DOS::DosQAbstractTableModel(dObjectPointer,
metaObjectHolder->data(),
dObjectCallback,
*callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast(model);
}
DosQModelIndex *dos_qabstracttablemodel_index(DosQAbstractTableModel *vptr, int row, int column, DosQModelIndex *dosParent)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto parent = static_cast(dosParent);
auto result = new QModelIndex(model->defaultIndex(row, column, *parent));
return static_cast(result);
}
DosQModelIndex *dos_qabstracttablemodel_parent(DosQAbstractTableModel *vptr, DosQModelIndex *dosChild)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto child = static_cast(dosChild);
auto result = new QModelIndex(model->defaultParent(*child));
return static_cast(result);
}
::DosQMetaObject *dos_qabstractlistmodel_qmetaobject()
{
return new DOS::DosIQMetaObjectHolder(std::make_shared());
}
::DosQAbstractListModel *dos_qabstractlistmodel_create(void *dObjectPointer,
::DosQMetaObject *metaObjectPointer,
::DObjectCallback dObjectCallback,
::DosQAbstractItemModelCallbacks *callbacks)
{
auto metaObjectHolder = static_cast(metaObjectPointer);
auto model = new DOS::DosQAbstractListModel(dObjectPointer,
metaObjectHolder->data(),
dObjectCallback,
*callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast(model);
}
DosQModelIndex *dos_qabstractlistmodel_index(DosQAbstractListModel *vptr, int row, int column, DosQModelIndex *dosParent)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto parent = static_cast(dosParent);
auto result = new QModelIndex(model->defaultIndex(row, column, *parent));
return static_cast(result);
}
DosQModelIndex *dos_qabstractlistmodel_parent(DosQAbstractListModel *vptr, DosQModelIndex *dosChild)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto child = static_cast(dosChild);
auto result = new QModelIndex(model->defaultParent(*child));
return static_cast(result);
}
int dos_qabstractlistmodel_columnCount(DosQAbstractListModel *vptr, DosQModelIndex *dosParent)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto parent = static_cast(dosParent);
return model->defaultColumnCount(*parent);
}
::DosQMetaObject *dos_qabstractitemmodel_qmetaobject()
{
return new DOS::DosIQMetaObjectHolder(std::make_shared());
}
::DosQAbstractItemModel *dos_qabstractitemmodel_create(void *dObjectPointer,
::DosQMetaObject *metaObjectPointer,
::DObjectCallback dObjectCallback,
::DosQAbstractItemModelCallbacks *callbacks)
{
auto metaObjectHolder = static_cast(metaObjectPointer);
auto model = new DOS::DosQAbstractItemModel(dObjectPointer,
metaObjectHolder->data(),
dObjectCallback,
*callbacks);
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
return static_cast(model);
}
void dos_qabstractitemmodel_beginInsertRows(::DosQAbstractItemModel *vptr, ::DosQModelIndex *parentIndex, int first, int last)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(parentIndex);
model->publicBeginInsertRows(*index, first, last);
}
void dos_qabstractitemmodel_endInsertRows(::DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicEndInsertRows();
}
void dos_qabstractitemmodel_beginRemoveRows(::DosQAbstractItemModel *vptr, ::DosQModelIndex *parentIndex, int first, int last)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(parentIndex);
model->publicBeginRemoveRows(*index, first, last);
}
void dos_qabstractitemmodel_endRemoveRows(::DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicEndRemoveRows();
}
void dos_qabstractitemmodel_beginMoveRows(DosQAbstractItemModel* vptr, ::DosQModelIndex* sourceParent, int sourceFirst, int sourceLast,
DosQModelIndex* destinationParent, int destinationChild)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto sourceIndex = static_cast(sourceParent);
auto destIndex = static_cast(destinationParent);
model->publicBeginMoveRows(*sourceIndex, sourceFirst, sourceLast, *destIndex, destinationChild);
}
void dos_qabstractitemmodel_endMoveRows(DosQAbstractItemModel* vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicEndMoveRows();
}
void dos_qabstractitemmodel_beginInsertColumns(::DosQAbstractItemModel *vptr, ::DosQModelIndex *parentIndex, int first, int last)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(parentIndex);
model->publicBeginInsertColumns(*index, first, last);
}
void dos_qabstractitemmodel_endInsertColumns(::DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicEndInsertColumns();
}
void dos_qabstractitemmodel_beginRemoveColumns(::DosQAbstractItemModel *vptr, ::DosQModelIndex *parentIndex, int first, int last)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(parentIndex);
model->publicBeginRemoveColumns(*index, first, last);
}
void dos_qabstractitemmodel_endRemoveColumns(::DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicEndRemoveColumns();
}
void dos_qabstractitemmodel_beginResetModel(::DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicBeginResetModel();
}
void dos_qabstractitemmodel_endResetModel(::DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
model->publicEndResetModel();
}
void dos_qabstractitemmodel_dataChanged(::DosQAbstractItemModel *vptr,
const ::DosQModelIndex *topLeftIndex,
const ::DosQModelIndex *bottomRightIndex,
int *rolesArrayPtr,
int rolesArrayLength)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto topLeft = static_cast(topLeftIndex);
auto bottomRight = static_cast(bottomRightIndex);
auto roles = QVector(rolesArrayPtr, rolesArrayPtr + rolesArrayLength);
model->publicDataChanged(*topLeft, *bottomRight, roles);
}
DosQModelIndex *dos_qabstractitemmodel_createIndex(::DosQAbstractItemModel *vptr,
int row, int column, void *data)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
return new QModelIndex(model->publicCreateIndex(row, column, data));
}
bool dos_qabstractitemmodel_setData(DosQAbstractItemModel *vptr,
DosQModelIndex *dosIndex, DosQVariant *dosValue, int role)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(dosIndex);
auto value = static_cast(dosValue);
return model->defaultSetData(*index, *value, role);
}
DosQHashIntQByteArray *dos_qabstractitemmodel_roleNames(DosQAbstractItemModel *vptr)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto result = new QHash(model->defaultRoleNames());
return static_cast(result);
}
int dos_qabstractitemmodel_flags(DosQAbstractItemModel *vptr, DosQModelIndex *dosIndex)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(dosIndex);
return static_cast(model->defaultFlags(*index));
}
DosQVariant *dos_qabstractitemmodel_headerData(DosQAbstractItemModel *vptr, int section, int orientation, int role)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto result = new QVariant(model->defaultHeaderData(section, static_cast(orientation), role));
return static_cast(result);
}
bool dos_qabstractitemmodel_hasChildren(DosQAbstractItemModel *vptr, DosQModelIndex *dosParentIndex)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto parentIndex = static_cast(dosParentIndex);
return model->defaultHasChildren(*parentIndex);
}
bool dos_qabstractitemmodel_hasIndex(DosQAbstractItemModel *vptr, int row, int column, DosQModelIndex *dosParentIndex)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto index = static_cast(dosParentIndex);
return model->hasIndex(row, column, *index);
}
bool dos_qabstractitemmodel_canFetchMore(DosQAbstractItemModel *vptr, DosQModelIndex *dosParentIndex)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto parentIndex = static_cast(dosParentIndex);
return model->defaultCanFetchMore(*parentIndex);
}
void dos_qabstractitemmodel_fetchMore(DosQAbstractItemModel *vptr, DosQModelIndex *dosParentIndex)
{
auto object = static_cast(vptr);
auto model = dynamic_cast(object);
auto parentIndex = static_cast(dosParentIndex);
model->defaultFetchMore(*parentIndex);
}
int dos_qdeclarative_qmlregistertype(const ::QmlRegisterType *cArgs)
{
auto holder = static_cast(cArgs->staticMetaObject);
DOS::QmlRegisterType args;
args.major = cArgs->major;
args.minor = cArgs->minor;
args.uri = cArgs->uri;
args.qml = cArgs->qml;
args.staticMetaObject = holder->data();
args.createDObject = cArgs->createDObject;
args.deleteDObject = cArgs->deleteDObject;
return DOS::dosQmlRegisterType(std::move(args));
}
int dos_qdeclarative_qmlregistersingletontype(const ::QmlRegisterType *cArgs)
{
auto holder = static_cast(cArgs->staticMetaObject);
DOS::QmlRegisterType args;
args.major = cArgs->major;
args.minor = cArgs->minor;
args.uri = cArgs->uri;
args.qml = cArgs->qml;
args.staticMetaObject = holder->data();
args.createDObject = cArgs->createDObject;
args.deleteDObject = cArgs->deleteDObject;
return DOS::dosQmlRegisterSingletonType(std::move(args));
}
void dos_qquickstyle_set_style(const char *style)
{
#ifdef QT_QUICKCONTROLS2_LIB
QQuickStyle::setStyle(QString::fromUtf8(style));
#else
std::cerr << "Library has not QtQuickControls2 support" << std::endl;
#endif
}
void dos_qquickstyle_set_fallback_style(const char *style)
{
#ifdef QT_QUICKCONTROLS2_LIB
QQuickStyle::setFallbackStyle(QString::fromUtf8(style));
#else
std::cerr << "Library has no QtQuickControls2 support" << std::endl;
#endif
}
void dos_qguiapplication_process_events(DosQEventLoopProcessEventFlag flags)
{
qGuiApp->processEvents(static_cast(flags));
}
void dos_qguiapplication_process_events_timed(DosQEventLoopProcessEventFlag flags, int ms)
{
qGuiApp->processEvents(static_cast(flags), ms);
}
::DosQNetworkConfigurationManager *dos_qncm_create()
{
auto *ncm = new QNetworkConfigurationManager();
auto netcfgList = ncm->allConfigurations(QNetworkConfiguration::Active);
for (auto& x : netcfgList) {
qDebug() << "Connection type: " << x.bearerType() << " - name: " << x.name() << " -purpose: " << x.purpose();
}
return ncm;
}
void dos_qncm_delete(::DosQNetworkConfigurationManager *vptr)
{
auto ncm = static_cast(vptr);
delete ncm;
}
char *dos_plain_text(char* htmlString)
{
return convert_to_cstring(QTextDocumentFragment::fromHtml( htmlString ).toPlainText().toUtf8());
}
char *dos_escape_html(char* input)
{
return convert_to_cstring(QString(input).toHtmlEscaped().toUtf8());
}
char *dos_image_resizer(char* imagePath, int maxSize, char* tmpDirPath)
{
QImage img(imagePath);
img.setColorSpace(QColorSpace::SRgb);
int w = img.width();
int h = img.height();
QPixmap pixmap;
pixmap = pixmap.fromImage(img.scaled(maxSize < w ? maxSize : w, maxSize < h ? maxSize : h, Qt::KeepAspectRatio, Qt::SmoothTransformation));
auto newFilePath = tmpDirPath + QUuid::createUuid().toString(QUuid::WithoutBraces) + ".jpg";
QFile file(newFilePath);
file.open(QIODevice::WriteOnly);
pixmap.save(&file, "jpeg", 75);
file.close();
return convert_to_cstring(newFilePath.toUtf8());
}
char *dos_qurl_fromUserInput(char* input)
{
return convert_to_cstring(QUrl::fromUserInput(QString(input)).toString());
}
char *dos_qurl_host(char* url)
{
return convert_to_cstring(QUrl(QString(url)).host());
}
char *dos_qurl_replaceHostAndAddPath(char* url, char* newScheme, char* newHost, char* pathPrefix)
{
auto newQurl = QUrl(QString(url));
newQurl.setHost(newHost);
if(QString(newScheme).compare("") != 0){
newQurl.setScheme(newScheme);
}
if (QString(pathPrefix).compare("") != 0){
newQurl.setPath(QString(pathPrefix) + newQurl.path());
}
return convert_to_cstring(newQurl.toString());
}
DosSingleInstance *dos_singleinstance_create(const char *uniqueName, const char *eventStr)
{
return new SingleInstance(QString::fromUtf8(uniqueName), QString::fromUtf8(eventStr));
}
void dos_singleinstance_delete(DosSingleInstance *vptr)
{
auto dsi = static_cast(vptr);
delete dsi;
}
bool dos_singleinstance_isfirst(DosSingleInstance *vptr)
{
auto dsi = static_cast