From 3d0cbee3f6f127a1ad699ba79fd21e712b935495 Mon Sep 17 00:00:00 2001 From: Rony Kubat Date: Tue, 19 Mar 2013 19:36:04 -0400 Subject: [PATCH] Allow initialization ini files to be located other than just the executable path. --- Include/OniCAPI.h | 2 +- Include/OpenNI.h | 5 +++-- Source/Core/OniContext.cpp | 24 +++++++++++++++--------- Source/Core/OniContext.h | 2 +- Source/Core/OpenNI.cpp | 4 ++-- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/Include/OniCAPI.h b/Include/OniCAPI.h index be3512e1..93a217fa 100644 --- a/Include/OniCAPI.h +++ b/Include/OniCAPI.h @@ -29,7 +29,7 @@ /******************************************** General APIs */ /** Initialize OpenNI2. Use ONI_API_VERSION as the version. */ -ONI_C_API OniStatus oniInitialize(int apiVersion); +ONI_C_API OniStatus oniInitialize(int apiVersion, const char* iniFileParentDirectory); /** Shutdown OpenNI2 */ ONI_C_API void oniShutdown(); diff --git a/Include/OpenNI.h b/Include/OpenNI.h index 5fc3b0bf..07ffc5dd 100644 --- a/Include/OpenNI.h +++ b/Include/OpenNI.h @@ -1947,10 +1947,11 @@ class OpenNI Initialize the library. This will load all available drivers, and see which devices are available It is forbidden to call any other method in OpenNI before calling @ref initialize(). + @param iniFileParentDirectory The path the the parent directory containing the OpenNI ini configuration files. */ - static Status initialize() + static Status initialize(const char* iniFileParentDirectory = NULL) { - return (Status)oniInitialize(ONI_API_VERSION); // provide version of API, to make sure proper struct sizes are used + return (Status)oniInitialize(ONI_API_VERSION, iniFileParentDirectory); // provide version of API, to make sure proper struct sizes are used } /** diff --git a/Source/Core/OniContext.cpp b/Source/Core/OniContext.cpp index 9752daf8..ee5aa430 100644 --- a/Source/Core/OniContext.cpp +++ b/Source/Core/OniContext.cpp @@ -22,6 +22,8 @@ #include "OniStreamFrameHolder.h" #include +#include + static const char* ONI_CONFIGURATION_FILE = XN_FILE_LOCAL_DIR "OpenNI.ini"; #if (XN_PLATFORM == XN_PLATFORM_WIN32) && (_M_X64) static const char* ONI_ENV_VAR_DRIVERS_REPOSITORY = "OPENNI2_DRIVERS_PATH64"; @@ -44,7 +46,7 @@ Context::~Context() s_valid = FALSE; } -OniStatus Context::initialize() +OniStatus Context::initialize(const char* iniFileParentDirectory) { XnBool repositoryOverridden = FALSE; XnChar repositoryFromINI[XN_FILE_MAX_PATH] = {0}; @@ -68,35 +70,39 @@ OniStatus Context::initialize() s_valid = TRUE; // Read configuration file + std::string configurationFilePath(ONI_CONFIGURATION_FILE); + if (iniFileParentDirectory) { + configurationFilePath = std::string(iniFileParentDirectory) + XN_FILE_DIR_SEP + ONI_CONFIGURATION_FILE; + } XnBool configurationFileExists = FALSE; - rc = xnOSDoesFileExist(ONI_CONFIGURATION_FILE, &configurationFileExists); + rc = xnOSDoesFileExist(configurationFilePath.c_str(), &configurationFileExists); if (configurationFileExists) { - rc = xnOSReadStringFromINI(ONI_CONFIGURATION_FILE, "Device", "Override", m_overrideDevice, XN_FILE_MAX_PATH); + rc = xnOSReadStringFromINI(configurationFilePath.c_str(), "Device", "Override", m_overrideDevice, XN_FILE_MAX_PATH); if (rc != XN_STATUS_OK) { xnLogVerbose(XN_LOG_MASK_ALL, "No override device in configuration file"); } XnInt32 nValue; - rc = xnOSReadIntFromINI(ONI_CONFIGURATION_FILE, "Log", "Verbosity", &nValue); + rc = xnOSReadIntFromINI(configurationFilePath.c_str(), "Log", "Verbosity", &nValue); if (rc == XN_STATUS_OK) { xnLogSetMaskMinSeverity(XN_LOG_MASK_ALL, (XnLogSeverity)nValue); } - rc = xnOSReadIntFromINI(ONI_CONFIGURATION_FILE, "Log", "LogToConsole", &nValue); + rc = xnOSReadIntFromINI(configurationFilePath.c_str(), "Log", "LogToConsole", &nValue); if (rc == XN_STATUS_OK) { xnLogSetConsoleOutput(nValue == 1); } - rc = xnOSReadIntFromINI(ONI_CONFIGURATION_FILE, "Log", "LogToFile", &nValue); + rc = xnOSReadIntFromINI(configurationFilePath.c_str(), "Log", "LogToFile", &nValue); if (rc == XN_STATUS_OK) { xnLogSetFileOutput(nValue == 1); } - rc = xnOSReadStringFromINI(ONI_CONFIGURATION_FILE, "Drivers", "Repository", repositoryFromINI, XN_FILE_MAX_PATH); + rc = xnOSReadStringFromINI(configurationFilePath.c_str(), "Drivers", "Repository", repositoryFromINI, XN_FILE_MAX_PATH); if (rc == XN_STATUS_OK) { repositoryOverridden = TRUE; @@ -104,7 +110,7 @@ OniStatus Context::initialize() } else { - xnLogVerbose(XN_LOG_MASK_ALL, "Couldn't find configuration file '%s'", ONI_CONFIGURATION_FILE); + xnLogVerbose(XN_LOG_MASK_ALL, "Couldn't find configuration file '%s'", configurationFilePath.c_str()); } xnLogVerbose(XN_LOG_MASK_ALL, "OpenNI %s", ONI_VERSION_STRING); @@ -112,7 +118,7 @@ OniStatus Context::initialize() // Use path specified in ini file if (repositoryOverridden) { - xnLogVerbose(XN_LOG_MASK_ALL, "Using '%s' as driver path, as configured in file '%s'", repositoryFromINI, ONI_CONFIGURATION_FILE); + xnLogVerbose(XN_LOG_MASK_ALL, "Using '%s' as driver path, as configured in file '%s'", repositoryFromINI, configurationFilePath.c_str()); rc = loadLibraries(repositoryFromINI); return OniStatusFromXnStatus(rc); } diff --git a/Source/Core/OniContext.h b/Source/Core/OniContext.h index d6b278f0..b630e234 100644 --- a/Source/Core/OniContext.h +++ b/Source/Core/OniContext.h @@ -57,7 +57,7 @@ class Context Context(); ~Context(); - OniStatus initialize(); + OniStatus initialize(const char* iniFileParentDirectory = NULL); void shutdown(); OniStatus registerDeviceConnectedCallback(OniDeviceInfoCallback handler, void* pCookie, OniCallbackHandle& handle); diff --git a/Source/Core/OpenNI.cpp b/Source/Core/OpenNI.cpp index f8831649..fef081d4 100644 --- a/Source/Core/OpenNI.cpp +++ b/Source/Core/OpenNI.cpp @@ -26,10 +26,10 @@ oni::implementation::Context g_Context; -ONI_C_API OniStatus oniInitialize(int /*apiVersion*/) +ONI_C_API OniStatus oniInitialize(int /*apiVersion*/, const char* iniFileParentDirectory) { g_Context.clearErrorLogger(); - OniStatus rc = g_Context.initialize(); + OniStatus rc = g_Context.initialize(iniFileParentDirectory); return rc; }