static vrpn_ConnectionPtr getVRPNConnection(connection::ConnectionPtr const &conn) { vrpn_ConnectionPtr ret; if (std::string(conn->getConnectionKindID()) == osvr::connection::getVRPNConnectionKindID()) { ret = vrpn_ConnectionPtr( static_cast<vrpn_Connection *>(conn->getUnderlyingObject())); } return ret; }
OSVR_ReturnCode osvrAnalysisSyncInit(OSVR_IN_PTR OSVR_PluginRegContext ctx, OSVR_IN_STRZ const char *name, OSVR_IN_PTR OSVR_DeviceInitOptions options, OSVR_OUT_PTR OSVR_DeviceToken *device, OSVR_OUT_PTR OSVR_ClientContext *clientCtx) { if (!ctx) { OSVR_DEV_VERBOSE("osvrAnalysisSyncInit: can't use a null plugin " "registration context."); return OSVR_RETURN_FAILURE; } if (!name || !(name[0])) { OSVR_DEV_VERBOSE( "osvrAnalysisSyncInit: can't use a null or empty device name."); return OSVR_RETURN_FAILURE; } OSVR_VALIDATE_OUTPUT_PTR(device, "device token"); OSVR_VALIDATE_OUTPUT_PTR(clientCtx, "client context"); auto initialResult = osvrDeviceSyncInitWithOptions(ctx, name, options, device); if (initialResult == OSVR_RETURN_FAILURE) { OSVR_DEV_VERBOSE( "osvrAnalysisSyncInit: couldn't create initial device token."); return OSVR_RETURN_FAILURE; } /// Dig the VRPN connection out of the server. auto osvrConn = osvr::connection::Connection::retrieveConnection( osvr::pluginhost::PluginSpecificRegistrationContext::get(ctx) .getParent()); auto vrpnConn = extractVrpnConnection(*osvrConn); /// Create a client context here /// @todo Use an interface factory that handles relative paths. auto clientCtxSmart = osvr::common::wrapSharedContext( osvr::client::createAnalysisClientContext( "org.osvr.analysisplugin" /**< @todo */, "localhost" /**< @todo */, vrpn_ConnectionPtr(vrpnConn))); auto &dev = **device; /// pass ownership dev.acquireObject(clientCtxSmart); /// register client context update dev.setPreConnectionInteract([=] { clientCtxSmart->update(); }); /// finally return the client context too. *clientCtx = clientCtxSmart.get(); return OSVR_RETURN_SUCCESS; }