XN_C_API XnStatus xnOSCreateProcess(const XnChar* strExecutable, XnUInt32 nArgs, const XnChar** pstrArgs, XN_PROCESS_ID* pProcID) { XnStatus nRetVal = XN_STATUS_OK; STARTUPINFO si; ZeroMemory(&si, sizeof(si)); PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi)); const XnUInt32 nSize = 1024; XnChar strArguments[nSize] = ""; XnUInt32 nDummy = 0; xnOSStrFormat(strArguments, nSize, &nDummy, "\"%s\"", strExecutable); for (XnUInt i = 0; i < nArgs; ++i) { XN_VALIDATE_STR_APPEND(strArguments, " \"", nSize, nRetVal); XN_VALIDATE_STR_APPEND(strArguments, pstrArgs[i], nSize, nRetVal); XN_VALIDATE_STR_APPEND(strArguments, "\"", nSize, nRetVal); } // let it start in the executable dir XnChar strDirName[XN_FILE_MAX_PATH]; nRetVal = xnOSGetDirName(strExecutable, strDirName, XN_FILE_MAX_PATH); XN_IS_STATUS_OK(nRetVal); if (0 == CreateProcess(strExecutable, strArguments, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, strDirName, &si, &pi)) { xnLogWarning(XN_MASK_OS, "Failed to start process! Win32 error code is %d.", GetLastError()); return XN_STATUS_OS_PROCESS_CREATION_FAILED; } *pProcID = pi.dwProcessId; return (XN_STATUS_OK); }
XnStatus XnDeviceManagerLoadAllDevices(const XnChar* strDir) { XnStatus nRetVal = XN_STATUS_OK; XnChar cpSearchString[XN_FILE_MAX_PATH] = ""; if (strDir == NULL) { strDir = XN_FILE_LOCAL_DIR; } // Build the search pattern string XN_VALIDATE_STR_APPEND(cpSearchString, strDir, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_DIR_SEP, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_PREFIX, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_DEVICE_FILE_PREFIX, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_ALL_WILDCARD, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_POSTFIX, XN_FILE_MAX_PATH, nRetVal); // Get a file list of Xiron devices XnChar acsFileList[XN_DEVICE_MANAGER_MAX_NUMBER_OF_DEVICES][XN_FILE_MAX_PATH]; XnUInt32 nFileCount = 0; xnLogVerbose(XN_MASK_DEVICE_MANAGER, "Searching for %s...", cpSearchString); nRetVal = xnOSGetFileList(cpSearchString, NULL, acsFileList, XN_DEVICE_MANAGER_MAX_NUMBER_OF_DEVICES, &nFileCount); if ((nRetVal != XN_STATUS_OS_FILE_NOT_FOUND) && (nRetVal != XN_STATUS_OK)) { return (nRetVal); } // now try to load each file for (XnUInt32 nIndex = 0; nIndex < nFileCount; ++nIndex) { xnLogVerbose(XN_MASK_DEVICE_MANAGER, "Trying to load a device '%s'...", acsFileList[nIndex]); nRetVal = XnDeviceManagerLoadDevice(acsFileList[nIndex], &g_pDeviceManager->aDevices[g_pDeviceManager->nDevicesCount]); if (nRetVal != XN_STATUS_OK) { xnLogWarning(XN_MASK_DEVICE_MANAGER, "'%s' is not a valid device: %s", acsFileList[nIndex], xnGetStatusString(nRetVal)); } else { xnLogInfo(XN_MASK_DEVICE_MANAGER, "device '%s' loaded.", acsFileList[nIndex]); g_pDeviceManager->nDevicesCount++; } } return (XN_STATUS_OK); }
XnStatus XnSensorClient::StartServerProcess() { XnStatus nRetVal = XN_STATUS_OK; const XnChar* strServerDir; #if (XN_PLATFORM == XN_PLATFORM_WIN32) strServerDir = ms_strDir; #elif (XN_PLATFORM == XN_PLATFORM_LINUX_X86 || XN_PLATFORM == XN_PLATFORM_LINUX_ARM) strServerDir = "/Users/nick/ros/other/ni/ni/ps_engine/bin"; #endif // we'll start it in it's directory XnChar strCurrDir[XN_FILE_MAX_PATH]; nRetVal = xnOSGetCurrentDir(strCurrDir, XN_FILE_MAX_PATH); XN_IS_STATUS_OK(nRetVal); nRetVal = xnOSSetCurrentDir(strServerDir); XN_IS_STATUS_OK(nRetVal); XnChar strProcessName[XN_FILE_MAX_PATH]; sprintf(strProcessName, "%s%sXnSensorServer", strServerDir, XN_FILE_DIR_SEP); #if (XN_PLATFORM == XN_PLATFORM_WIN32) XN_VALIDATE_STR_APPEND(strProcessName, ".exe", XN_FILE_MAX_PATH, nRetVal); #endif const XnChar* strArguments[] = { m_strConfigDir }; XN_PROCESS_ID procID; nRetVal = xnOSCreateProcess(strProcessName, 1, strArguments, &procID); // in any case, return to working dir xnOSSetCurrentDir(strCurrDir); // now check for errors XN_IS_STATUS_OK(nRetVal); return (XN_STATUS_OK); }
XN_DDK_API XnStatus XnDDKInitFromINIFile(const XnChar* cpINIFileName) { XnStatus nRetVal = XN_STATUS_OK; // Validate the input/output pointers (to make sure none of them is NULL) XN_VALIDATE_INPUT_PTR(cpINIFileName); // Was the DDK subsystem already initialized? if (g_XnDDKWasInit == FALSE) { // Init the Formats library nRetVal = XnFormatsInitFromINIFile(cpINIFileName); if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_ALREADY_INIT) return nRetVal; // read devices directory XnChar strDevicesDirectory[XN_INI_MAX_LEN] = ""; XnChar* pDir = NULL; if (XN_STATUS_OK == xnOSReadStringFromINI(cpINIFileName, "DDK", "DevicesDir", strDevicesDirectory, XN_INI_MAX_LEN)) { XN_VALIDATE_STR_APPEND(strDevicesDirectory, XN_FILE_DIR_SEP, XN_INI_MAX_LEN, nRetVal); pDir = strDevicesDirectory; } // Init DeviceManager nRetVal = XnDeviceManagerInit(pDir); if (nRetVal != XN_STATUS_OK && nRetVal != XN_STATUS_ALREADY_INIT) return nRetVal; g_XnDDKWasInit = TRUE; } else { // Trying to init twice... return (XN_STATUS_DDK_ALREADY_INIT); } // All is good... return (XN_STATUS_OK); }
XnStatus Context::loadLibraries(const char* directoryName) { XnStatus nRetVal; // Get a file list of Xiron devices XnInt32 nFileCount = 0; typedef XnChar FileName[XN_FILE_MAX_PATH]; FileName* acsFileList = NULL; #if (ONI_PLATFORM != ONI_PLATFORM_ANDROID_ARM) XnChar cpSearchString[XN_FILE_MAX_PATH] = ""; xnLogVerbose(XN_MASK_ONI_CONTEXT, "Looking for drivers in drivers repository '%s'", directoryName); // Build the search pattern string XN_VALIDATE_STR_APPEND(cpSearchString, directoryName, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_DIR_SEP, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_PREFIX, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_FILE_ALL_WILDCARD, XN_FILE_MAX_PATH, nRetVal); XN_VALIDATE_STR_APPEND(cpSearchString, XN_SHARED_LIBRARY_POSTFIX, XN_FILE_MAX_PATH, nRetVal); nRetVal = xnOSCountFiles(cpSearchString, &nFileCount); if (nRetVal != XN_STATUS_OK || nFileCount == 0) { xnLogError(XN_MASK_ONI_CONTEXT, "Found no drivers matching '%s'", cpSearchString); m_errorLogger.Append("Found no files matching '%s'", cpSearchString); return XN_STATUS_NO_MODULES_FOUND; } acsFileList = XN_NEW_ARR(FileName, nFileCount); nRetVal = xnOSGetFileList(cpSearchString, NULL, acsFileList, nFileCount, &nFileCount); #else // Android nFileCount = 3; acsFileList = XN_NEW_ARR(FileName, nFileCount); strcpy(acsFileList[0], "libPS1080.so"); strcpy(acsFileList[1], "libOniFile.so"); strcpy(acsFileList[2], "libPSLink.so"); #endif // Save directory XnChar workingDir[XN_FILE_MAX_PATH]; xnOSGetCurrentDir(workingDir, XN_FILE_MAX_PATH); // Change directory xnOSSetCurrentDir(directoryName); for (int i = 0; i < nFileCount; ++i) { DeviceDriver* pDeviceDriver = XN_NEW(DeviceDriver, acsFileList[i], m_frameManager, m_errorLogger); if (pDeviceDriver == NULL || !pDeviceDriver->isValid()) { xnLogVerbose(XN_MASK_ONI_CONTEXT, "Couldn't use file '%s' as a device driver", acsFileList[i]); m_errorLogger.Append("Couldn't understand file '%s' as a device driver", acsFileList[i]); XN_DELETE(pDeviceDriver); continue; } OniCallbackHandle dummy; pDeviceDriver->registerDeviceConnectedCallback(deviceDriver_DeviceConnected, this, dummy); pDeviceDriver->registerDeviceDisconnectedCallback(deviceDriver_DeviceDisconnected, this, dummy); pDeviceDriver->registerDeviceStateChangedCallback(deviceDriver_DeviceStateChanged, this, dummy); if (!pDeviceDriver->initialize()) { xnLogVerbose(XN_MASK_ONI_CONTEXT, "Couldn't use file '%s' as a device driver", acsFileList[i]); m_errorLogger.Append("Couldn't initialize device driver from file '%s'", acsFileList[i]); XN_DELETE(pDeviceDriver); continue; } m_cs.Lock(); m_deviceDrivers.AddLast(pDeviceDriver); m_cs.Unlock(); } // Return to directory xnOSSetCurrentDir(workingDir); if (m_deviceDrivers.Size() == 0) { xnLogError(XN_MASK_ONI_CONTEXT, "Found no valid drivers"); m_errorLogger.Append("Found no valid drivers in '%s'", directoryName); return XN_STATUS_NO_MODULES_FOUND; } XN_DELETE_ARR(acsFileList); return XN_STATUS_OK; }