#include #include #include #include #include // If you want to extend the va Python pSelf interface, also add // the function to the va_methods table in vasingleton.cpp - otherwise they will not show up. // Documentation goes into vasingletondoc.hpp static IVANetClient* g_pVANetClient = nullptr; //!< Static pointer to VANetClient instance static PyObject* g_pVAError = nullptr; //!< Static pointer to error instance // Ugly definitions to ease try-catching VA exceptions #define VAPY_REQUIRE_CONN_TRY try { RequireCoreAvailable(); #define VAPY_CATCH_RETURN } catch (const CVAException& oError) { PyErr_SetString(PyExc_Exception, oError.ToString().c_str()); return NULL; } //! Helper for API dev static PyObject* va_not_implemented(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { VA_EXCEPT_NOT_IMPLEMENTED; return NULL; }; //! Raises an exception if core is not available static void RequireCoreAvailable() { if (!g_pVANetClient) VA_EXCEPT2(CVAException::NETWORK_ERROR, "VA client not available, please connect first"); if (!g_pVANetClient->GetCoreInstance()) VA_EXCEPT2(CVAException::NETWORK_ERROR, "VA client available, but access to VA interface failed. Please reconnect."); }; static PyObject* va_connect(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { if (!g_pVANetClient) g_pVANetClient = IVANetClient::Create(); if (g_pVANetClient->IsConnected()) { PyErr_Warn(pSelf, "Was still connected, forced disconnect."); g_pVANetClient->Disconnect(); } static const char * const _keywords[] = { "server", "port", NULL }; static _PyArg_Parser _parser = { "|si:connect", _keywords, 0 }; char* pcServerIP; int iServerPort = 12340; if (!_PyArg_ParseStack(ppArgs, nArgs, pKeywordNames, &_parser, pcServerIP, &iServerPort)) return NULL; std::string sServerIP = pcServerIP ? std::string(pcServerIP) : "localhost"; if (IVANetClient::VA_NO_ERROR == g_pVANetClient->Initialize(sServerIP, iServerPort)) return PyBool_FromLong(1); PyErr_SetString(PyExc_ConnectionError, std::string("Could not connect to " + sServerIP + " on " + std::to_string((long)iServerPort)).c_str()); return NULL; }; static PyObject* va_disconnect(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { if (g_pVANetClient) g_pVANetClient->Disconnect(); else PyErr_Warn(pSelf, "Was not connected, doing nothing. Use is_connected to avoid this message."); return PyBool_FromLong(1); }; static PyObject* va_is_connected(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { if (!g_pVANetClient) return PyBool_FromLong(0); else return PyBool_FromLong(g_pVANetClient->IsConnected()); }; static PyObject* va_reset(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { VAPY_REQUIRE_CONN_TRY; g_pVANetClient->GetCoreInstance()->Reset(); return PyBool_FromLong(1); VAPY_CATCH_RETURN; }; static PyObject* va_enumerate_modules(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { VAPY_REQUIRE_CONN_TRY; VA_EXCEPT_NOT_IMPLEMENTED; return NULL; VAPY_CATCH_RETURN; }; static PyObject* va_call_module(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { VAPY_REQUIRE_CONN_TRY; VA_EXCEPT_NOT_IMPLEMENTED; return NULL; VAPY_CATCH_RETURN; }; static PyObject* va_add_search_path(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { VAPY_REQUIRE_CONN_TRY; VA_EXCEPT_NOT_IMPLEMENTED; return NULL; VAPY_CATCH_RETURN; }; static PyObject* va_create_listener(PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames) { VAPY_REQUIRE_CONN_TRY; std::string sName = "PyListener"; int iID = g_pVANetClient->GetCoreInstance()->CreateListener(sName, IVACore::VA_AURAMODE_ALL); return PyLong_FromLong(iID); VAPY_CATCH_RETURN; };