#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 //! 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 = { "Oi:connect", _keywords, 0 }; PyObject* pServer; PyObject* pPort; if( !_PyArg_ParseStack( ppArgs, nArgs, pKeywordNames, &_parser, &pServer, &pPort ) ) return PyBool_FromLong( 0 ); std::string sServerIP = "localhost"; char* pcServerIP = nullptr; if( PyArg_ParseTuple( pPort, "i", &pcServerIP ) ) sServerIP = std::string( pcServerIP ); int iServerPort = 12340; int* piServerPort = nullptr; if( PyArg_ParseTuple( pPort, "i", &piServerPort ) ) iServerPort = *piServerPort; 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(); 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 ) { RequireCoreAvailable(); g_pVANetClient->GetCoreInstance()->Reset(); return PyBool_FromLong( 1 ); } static PyObject* va_enumerate_modules( PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames ) { RequireCoreAvailable(); VA_EXCEPT_NOT_IMPLEMENTED; return NULL; } static PyObject* va_call_module( PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames ) { RequireCoreAvailable(); VA_EXCEPT_NOT_IMPLEMENTED; return NULL; } static PyObject* va_add_search_path( PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames ) { RequireCoreAvailable(); VA_EXCEPT_NOT_IMPLEMENTED; return NULL; } static PyObject* va_create_listener( PyObject* pSelf, PyObject** ppArgs, Py_ssize_t nArgs, PyObject* pKeywordNames ) { RequireCoreAvailable(); std::string sName = "PyListener"; int iID = g_pVANetClient->GetCoreInstance()->CreateListener( sName, IVACore::VA_AURAMODE_ALL ); return PyLong_FromLong( iID ); }