packages feed

hsqml-0.1.0: cbits/HsQMLManager.cpp

#include <QMetaType>

#include "HsQMLManager.h"

QMutex gMutex;
HsQMLManager* gManager;
int gLogLevel;

HsQMLManager::HsQMLManager(
    int& argc,
    char** argv,
    void (*freeFun)(HsFunPtr),
    void (*freeStable)(HsStablePtr))
    : mApp(argc, argv)
    , mFreeFun(freeFun)
    , mFreeStable(freeStable)
{
}

HsQMLManager::~HsQMLManager()
{
}

void HsQMLManager::run()
{
    mApp.exec();

    // Delete engines once the event loop returns
    for (QVector<HsQMLEngine*>::iterator it = mEngines.begin();
            it != mEngines.end(); ++it) {
        delete *it;
    }
    mEngines.clear();
}

void HsQMLManager::freeFun(HsFunPtr funPtr)
{
    mFreeFun(funPtr);
}

void HsQMLManager::freeStable(HsStablePtr stablePtr)
{
    mFreeStable(stablePtr);
}

void HsQMLManager::createEngine(HsQMLEngineConfig config)
{
    mEngines.push_back(new HsQMLEngine(config));
}

extern "C" void hsqml_init(
    void (*free_fun)(HsFunPtr),
    void (*free_stable)(HsStablePtr))
{
    gMutex.lock();
    if (!gManager) {
        qRegisterMetaType<HsQMLEngineConfig>("HsQMLEngineConfig");

        int* argcp = new int[1];
        *argcp = 1;
        char** argv = new char*[1];
        argv[0] = new char[1];
        argv[0][0] = '\0';
        gManager = new HsQMLManager(*argcp, argv, free_fun, free_stable);
    }
    gMutex.unlock();
}

extern "C" void hsqml_run()
{
    Q_ASSERT (gManager);
    gManager->run();
}

extern "C" void hsqml_set_debug_loglevel(int level)
{
    gLogLevel = level;
}