#include #include #include #include "controller.hxx" static Controller* controller; static QQmlApplicationEngine* engine; static QString* certFile = nullptr; using namespace QICClient; static Client* shop = nullptr; static Catalog* allProducts = nullptr; extern "C" { void sign_up(char const*, char const*, void (*)(icclient_response*)); struct icclient_catalog* catalog(char const*, char const*); } Controller::Controller(QObject* parent) : QObject{parent} { controller = this; engine = qobject_cast(parent); engine->load(QUrl{QStringLiteral("qrc:/main.qml")}); auto window = engine->rootObjects()[0]; connect(window, SIGNAL(signUp(QString)), this, SLOT(signUp(QString))); } void Controller::signUp(QString const& brand) { #ifdef __ANDROID__ QString certAsset{CA_BUNDLE}; certFile = new QString{QDir{ QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) }.absolutePath() % certAsset.remove(0, certAsset.lastIndexOf("/"))}; QFile{"assets:" % certAsset}.copy(*certFile); #endif sign_up(brand.toLatin1().constData(), certFile ? certFile->toLatin1().constData() : nullptr, [](icclient_response* response) { const_cast(response->data)[response->numBytes] = '\0'; QString brand{response->data}; icclient_free_response(response); auto window = engine->rootObjects()[0]; QMetaObject::invokeMethod(window, "push", Q_ARG(QVariant, "Link"), Q_ARG(QVariant, brand)); controller->connect(window, SIGNAL(pushed()), controller, SIGNAL(pushed())); controller->connect(controller, &Controller::pushed, [window]() { controller->connect(window->findChild("link"), SIGNAL(catalog(QString)), controller, SLOT(catalog(QString))); }); }); } void Controller::catalog(QString const& brand) { QString sampleUrl{QString{SECURE_SERVER} % "/" % brand}; QString imageDir{"/" % brand % "/images"}; shop = new Client{sampleUrl.toLatin1().constData(), imageDir.toLatin1().constData(), certFile ? certFile->toLatin1().constData() : nullptr}; if (certFile) { delete certFile; certFile = nullptr; } connect(shop, &Client::gotCatalog, [sampleUrl,imageDir](QString const& response) { allProducts = new Catalog{::catalog(response.toLatin1().constData(), imageDir.toLatin1().constData())}; engine->rootContext()->setContextProperty("catalog", allProducts); QMetaObject::invokeMethod(engine->rootObjects()[0]->findChild("link"), "push", Q_ARG(QVariant, "Catalog"), Q_ARG(QVariant, QString{sampleUrl % "/images/"})); }); shop->allProducts(); } Controller::~Controller() { if (certFile) delete certFile; if (allProducts) delete allProducts; if (shop) delete shop; }