зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1635608 - Update OpenVR source code to use Unix line endings r=daoshengmu
This change simply changes line endings to make diffing easier with updates from OpenVR, which have Unix line endings. Further, .clang-format-ignore, does not seem to work for wildcard to match a directory and subdirectory, so all files are listed individually. Differential Revision: https://phabricator.services.mozilla.com/D74100
This commit is contained in:
Родитель
9dac54fd5b
Коммит
59be1c47cd
|
@ -106,6 +106,24 @@ gfx/qcms/.*
|
||||||
gfx/sfntly/.*
|
gfx/sfntly/.*
|
||||||
gfx/skia/.*
|
gfx/skia/.*
|
||||||
gfx/vr/service/openvr/.*
|
gfx/vr/service/openvr/.*
|
||||||
|
gfx/vr/service/openvr/headers/openvr.h
|
||||||
|
gfx/vr/service/openvr/src/README
|
||||||
|
gfx/vr/service/openvr/src/dirtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/dirtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/envvartools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/envvartools_public.h
|
||||||
|
gfx/vr/service/openvr/src/hmderrors_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/hmderrors_public.h
|
||||||
|
gfx/vr/service/openvr/src/ivrclientcore.h
|
||||||
|
gfx/vr/service/openvr/src/openvr_api_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/pathtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/pathtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/sharedlibtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/sharedlibtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/strtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/strtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/vrpathregistry_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/vrpathregistry_public.h
|
||||||
gfx/wgpu/.*
|
gfx/wgpu/.*
|
||||||
gfx/wr/.*
|
gfx/wr/.*
|
||||||
gfx/ycbcr/.*
|
gfx/ycbcr/.*
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,39 +1,39 @@
|
||||||
This is the source code for the OpenVR API client binding library which connects
|
This is the source code for the OpenVR API client binding library which connects
|
||||||
OpenVR applications to the SteamVR runtime, taking into account the version
|
OpenVR applications to the SteamVR runtime, taking into account the version
|
||||||
of the OpenVR interface they were compiled against.
|
of the OpenVR interface they were compiled against.
|
||||||
|
|
||||||
The client binding library - openvr_api.dll on Windows, openvr_api.so on
|
The client binding library - openvr_api.dll on Windows, openvr_api.so on
|
||||||
Linux, and openvr_api.dylib or OpenVR.framework on macOS - knows how to find
|
Linux, and openvr_api.dylib or OpenVR.framework on macOS - knows how to find
|
||||||
and read the SteamVR runtime installation information which allows it to
|
and read the SteamVR runtime installation information which allows it to
|
||||||
find and dynamically connect to the installed runtime. In combination with the
|
find and dynamically connect to the installed runtime. In combination with the
|
||||||
interface version identifiers from /include/openvr.h which are baked
|
interface version identifiers from /include/openvr.h which are baked
|
||||||
into applications at the time they are built, the OpenVR API client
|
into applications at the time they are built, the OpenVR API client
|
||||||
binding library captures and conveys to the SteamVR runtime the version
|
binding library captures and conveys to the SteamVR runtime the version
|
||||||
of the OpenVR API interface behavior that the application expects.
|
of the OpenVR API interface behavior that the application expects.
|
||||||
|
|
||||||
Applications carry with them a private/local copy of the client binding
|
Applications carry with them a private/local copy of the client binding
|
||||||
library when they ship, and they should install it locally to their
|
library when they ship, and they should install it locally to their
|
||||||
application. Applications should not install the client binding library
|
application. Applications should not install the client binding library
|
||||||
globally or attempt to link to a globally installed client binding library.
|
globally or attempt to link to a globally installed client binding library.
|
||||||
Doing so negates at least part of the ability for the client binding library
|
Doing so negates at least part of the ability for the client binding library
|
||||||
to accurately reflect the version of the OpenVR API that the application
|
to accurately reflect the version of the OpenVR API that the application
|
||||||
was built against, and so hinders compatibility support in the face of
|
was built against, and so hinders compatibility support in the face of
|
||||||
API changes.
|
API changes.
|
||||||
|
|
||||||
Most applications should simply link to and redistribute with their application
|
Most applications should simply link to and redistribute with their application
|
||||||
the pre-built client binding library found in the /bin directory of this
|
the pre-built client binding library found in the /bin directory of this
|
||||||
repository. Some small number of applications which have specific requirements
|
repository. Some small number of applications which have specific requirements
|
||||||
around redistributing only binaries they build themselves should build
|
around redistributing only binaries they build themselves should build
|
||||||
the client library from this source and either statically link it into
|
the client library from this source and either statically link it into
|
||||||
their application or redistribute the binary they build.
|
their application or redistribute the binary they build.
|
||||||
|
|
||||||
This is a cmake project, to build it use the version of cmake appropriate
|
This is a cmake project, to build it use the version of cmake appropriate
|
||||||
for your platform. For example, to build on a POSIX system simply perform
|
for your platform. For example, to build on a POSIX system simply perform
|
||||||
|
|
||||||
cd src; mkdir _build; cd _build; cmake ..; make
|
cd src; mkdir _build; cd _build; cmake ..; make
|
||||||
|
|
||||||
and you will end up with the static library /src/bin/<arch>/libopenvr_api.a
|
and you will end up with the static library /src/bin/<arch>/libopenvr_api.a
|
||||||
|
|
||||||
To build a shared library, pass -DBUILD_SHARED=1 to cmake.
|
To build a shared library, pass -DBUILD_SHARED=1 to cmake.
|
||||||
To build as a framework on apple platforms, pass -DBUILD_FRAMEWORK=1 to cmake.
|
To build as a framework on apple platforms, pass -DBUILD_FRAMEWORK=1 to cmake.
|
||||||
To see a complete list of configurable build options, use `cmake -LAH`
|
To see a complete list of configurable build options, use `cmake -LAH`
|
||||||
|
|
|
@ -1,101 +1,101 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#include "dirtools_public.h"
|
#include "dirtools_public.h"
|
||||||
#include "strtools_public.h"
|
#include "strtools_public.h"
|
||||||
#include "pathtools_public.h"
|
#include "pathtools_public.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#else
|
#else
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( OSX )
|
#if defined( OSX )
|
||||||
#include <sys/syslimits.h>
|
#include <sys/syslimits.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: utility function to create dirs & subdirs
|
// Purpose: utility function to create dirs & subdirs
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool BCreateDirectoryRecursive( const char *pchPath )
|
bool BCreateDirectoryRecursive( const char *pchPath )
|
||||||
{
|
{
|
||||||
// Does it already exist?
|
// Does it already exist?
|
||||||
if ( Path_IsDirectory( pchPath ) )
|
if ( Path_IsDirectory( pchPath ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// copy the path into something we can munge
|
// copy the path into something we can munge
|
||||||
int len = (int)strlen( pchPath );
|
int len = (int)strlen( pchPath );
|
||||||
char *path = (char *)malloc( len + 1 );
|
char *path = (char *)malloc( len + 1 );
|
||||||
strcpy( path, pchPath );
|
strcpy( path, pchPath );
|
||||||
|
|
||||||
// Walk backwards to first non-existing dir that we find
|
// Walk backwards to first non-existing dir that we find
|
||||||
char *s = path + len - 1;
|
char *s = path + len - 1;
|
||||||
|
|
||||||
const char slash = Path_GetSlash();
|
const char slash = Path_GetSlash();
|
||||||
while ( s > path )
|
while ( s > path )
|
||||||
{
|
{
|
||||||
if ( *s == slash )
|
if ( *s == slash )
|
||||||
{
|
{
|
||||||
*s = '\0';
|
*s = '\0';
|
||||||
bool bExists = Path_IsDirectory( path );
|
bool bExists = Path_IsDirectory( path );
|
||||||
*s = slash;
|
*s = slash;
|
||||||
|
|
||||||
if ( bExists )
|
if ( bExists )
|
||||||
{
|
{
|
||||||
++s;
|
++s;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
--s;
|
--s;
|
||||||
}
|
}
|
||||||
|
|
||||||
// and then move forwards from there
|
// and then move forwards from there
|
||||||
|
|
||||||
while ( *s )
|
while ( *s )
|
||||||
{
|
{
|
||||||
if ( *s == slash )
|
if ( *s == slash )
|
||||||
{
|
{
|
||||||
*s = '\0';
|
*s = '\0';
|
||||||
BCreateDirectory( path );
|
BCreateDirectory( path );
|
||||||
*s = slash;
|
*s = slash;
|
||||||
}
|
}
|
||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bRetVal = BCreateDirectory( path );
|
bool bRetVal = BCreateDirectory( path );
|
||||||
free( path );
|
free( path );
|
||||||
return bRetVal;
|
return bRetVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Creates the directory, returning true if it is created, or if it already existed
|
// Purpose: Creates the directory, returning true if it is created, or if it already existed
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool BCreateDirectory( const char *pchPath )
|
bool BCreateDirectory( const char *pchPath )
|
||||||
{
|
{
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
std::wstring wPath = UTF8to16( pchPath );
|
std::wstring wPath = UTF8to16( pchPath );
|
||||||
if ( ::CreateDirectoryW( wPath.c_str(), NULL ) )
|
if ( ::CreateDirectoryW( wPath.c_str(), NULL ) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if ( ::GetLastError() == ERROR_ALREADY_EXISTS )
|
if ( ::GetLastError() == ERROR_ALREADY_EXISTS )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
int i = mkdir( pchPath, S_IRWXU | S_IRWXG | S_IRWXO );
|
int i = mkdir( pchPath, S_IRWXU | S_IRWXG | S_IRWXO );
|
||||||
if ( i == 0 )
|
if ( i == 0 )
|
||||||
return true;
|
return true;
|
||||||
if ( errno == EEXIST )
|
if ( errno == EEXIST )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern bool BCreateDirectoryRecursive( const char *pchPath );
|
extern bool BCreateDirectoryRecursive( const char *pchPath );
|
||||||
extern bool BCreateDirectory( const char *pchPath );
|
extern bool BCreateDirectory( const char *pchPath );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,46 +1,46 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#include "envvartools_public.h"
|
#include "envvartools_public.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
#undef GetEnvironmentVariable
|
#undef GetEnvironmentVariable
|
||||||
#undef SetEnvironmentVariable
|
#undef SetEnvironmentVariable
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
std::string GetEnvironmentVariable( const char *pchVarName )
|
std::string GetEnvironmentVariable( const char *pchVarName )
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
char rchValue[32767]; // max size for an env var on Windows
|
char rchValue[32767]; // max size for an env var on Windows
|
||||||
DWORD cChars = GetEnvironmentVariableA( pchVarName, rchValue, sizeof( rchValue ) );
|
DWORD cChars = GetEnvironmentVariableA( pchVarName, rchValue, sizeof( rchValue ) );
|
||||||
if( cChars == 0 )
|
if( cChars == 0 )
|
||||||
return "";
|
return "";
|
||||||
else
|
else
|
||||||
return rchValue;
|
return rchValue;
|
||||||
#elif defined(POSIX)
|
#elif defined(POSIX)
|
||||||
char *pchValue = getenv( pchVarName );
|
char *pchValue = getenv( pchVarName );
|
||||||
if( pchValue )
|
if( pchValue )
|
||||||
return pchValue;
|
return pchValue;
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
#else
|
#else
|
||||||
#error "Unsupported Platform"
|
#error "Unsupported Platform"
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SetEnvironmentVariable( const char *pchVarName, const char *pchVarValue )
|
bool SetEnvironmentVariable( const char *pchVarName, const char *pchVarValue )
|
||||||
{
|
{
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
return 0 != SetEnvironmentVariableA( pchVarName, pchVarValue );
|
return 0 != SetEnvironmentVariableA( pchVarName, pchVarValue );
|
||||||
#elif defined(POSIX)
|
#elif defined(POSIX)
|
||||||
if( pchVarValue == NULL )
|
if( pchVarValue == NULL )
|
||||||
return 0 == unsetenv( pchVarName );
|
return 0 == unsetenv( pchVarName );
|
||||||
else
|
else
|
||||||
return 0 == setenv( pchVarName, pchVarValue, 1 );
|
return 0 == setenv( pchVarName, pchVarValue, 1 );
|
||||||
#else
|
#else
|
||||||
#error "Unsupported Platform"
|
#error "Unsupported Platform"
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
std::string GetEnvironmentVariable( const char *pchVarName );
|
std::string GetEnvironmentVariable( const char *pchVarName );
|
||||||
bool SetEnvironmentVariable( const char *pchVarName, const char *pchVarValue );
|
bool SetEnvironmentVariable( const char *pchVarName, const char *pchVarValue );
|
||||||
|
|
|
@ -1,229 +1,229 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#include "openvr.h"
|
#include "openvr.h"
|
||||||
#include "hmderrors_public.h"
|
#include "hmderrors_public.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
using namespace vr;
|
using namespace vr;
|
||||||
|
|
||||||
#define RETURN_ENUM_AS_STRING(enumValue) case enumValue: return #enumValue;
|
#define RETURN_ENUM_AS_STRING(enumValue) case enumValue: return #enumValue;
|
||||||
|
|
||||||
|
|
||||||
const char *GetEnglishStringForHmdError( vr::EVRInitError eError )
|
const char *GetEnglishStringForHmdError( vr::EVRInitError eError )
|
||||||
{
|
{
|
||||||
switch( eError )
|
switch( eError )
|
||||||
{
|
{
|
||||||
case VRInitError_None: return "No Error (0)";
|
case VRInitError_None: return "No Error (0)";
|
||||||
|
|
||||||
case VRInitError_Init_InstallationNotFound: return "Installation Not Found (100)";
|
case VRInitError_Init_InstallationNotFound: return "Installation Not Found (100)";
|
||||||
case VRInitError_Init_InstallationCorrupt: return "Installation Corrupt (101)";
|
case VRInitError_Init_InstallationCorrupt: return "Installation Corrupt (101)";
|
||||||
case VRInitError_Init_VRClientDLLNotFound: return "vrclient Shared Lib Not Found (102)";
|
case VRInitError_Init_VRClientDLLNotFound: return "vrclient Shared Lib Not Found (102)";
|
||||||
case VRInitError_Init_FileNotFound: return "File Not Found (103)";
|
case VRInitError_Init_FileNotFound: return "File Not Found (103)";
|
||||||
case VRInitError_Init_FactoryNotFound: return "Factory Function Not Found (104)";
|
case VRInitError_Init_FactoryNotFound: return "Factory Function Not Found (104)";
|
||||||
case VRInitError_Init_InterfaceNotFound: return "Interface Not Found (105)";
|
case VRInitError_Init_InterfaceNotFound: return "Interface Not Found (105)";
|
||||||
case VRInitError_Init_InvalidInterface: return "Invalid Interface (106)";
|
case VRInitError_Init_InvalidInterface: return "Invalid Interface (106)";
|
||||||
case VRInitError_Init_UserConfigDirectoryInvalid: return "User Config Directory Invalid (107)";
|
case VRInitError_Init_UserConfigDirectoryInvalid: return "User Config Directory Invalid (107)";
|
||||||
case VRInitError_Init_HmdNotFound: return "Hmd Not Found (108)";
|
case VRInitError_Init_HmdNotFound: return "Hmd Not Found (108)";
|
||||||
case VRInitError_Init_NotInitialized: return "Not Initialized (109)";
|
case VRInitError_Init_NotInitialized: return "Not Initialized (109)";
|
||||||
case VRInitError_Init_PathRegistryNotFound: return "Installation path could not be located (110)";
|
case VRInitError_Init_PathRegistryNotFound: return "Installation path could not be located (110)";
|
||||||
case VRInitError_Init_NoConfigPath: return "Config path could not be located (111)";
|
case VRInitError_Init_NoConfigPath: return "Config path could not be located (111)";
|
||||||
case VRInitError_Init_NoLogPath: return "Log path could not be located (112)";
|
case VRInitError_Init_NoLogPath: return "Log path could not be located (112)";
|
||||||
case VRInitError_Init_PathRegistryNotWritable: return "Unable to write path registry (113)";
|
case VRInitError_Init_PathRegistryNotWritable: return "Unable to write path registry (113)";
|
||||||
case VRInitError_Init_AppInfoInitFailed: return "App info manager init failed (114)";
|
case VRInitError_Init_AppInfoInitFailed: return "App info manager init failed (114)";
|
||||||
case VRInitError_Init_Retry: return "Internal Retry (115)";
|
case VRInitError_Init_Retry: return "Internal Retry (115)";
|
||||||
case VRInitError_Init_InitCanceledByUser: return "User Canceled Init (116)";
|
case VRInitError_Init_InitCanceledByUser: return "User Canceled Init (116)";
|
||||||
case VRInitError_Init_AnotherAppLaunching: return "Another app was already launching (117)";
|
case VRInitError_Init_AnotherAppLaunching: return "Another app was already launching (117)";
|
||||||
case VRInitError_Init_SettingsInitFailed: return "Settings manager init failed (118)";
|
case VRInitError_Init_SettingsInitFailed: return "Settings manager init failed (118)";
|
||||||
case VRInitError_Init_ShuttingDown: return "VR system shutting down (119)";
|
case VRInitError_Init_ShuttingDown: return "VR system shutting down (119)";
|
||||||
case VRInitError_Init_TooManyObjects: return "Too many tracked objects (120)";
|
case VRInitError_Init_TooManyObjects: return "Too many tracked objects (120)";
|
||||||
case VRInitError_Init_NoServerForBackgroundApp: return "Not starting vrserver for background app (121)";
|
case VRInitError_Init_NoServerForBackgroundApp: return "Not starting vrserver for background app (121)";
|
||||||
case VRInitError_Init_NotSupportedWithCompositor: return "The requested interface is incompatible with the compositor and the compositor is running (122)";
|
case VRInitError_Init_NotSupportedWithCompositor: return "The requested interface is incompatible with the compositor and the compositor is running (122)";
|
||||||
case VRInitError_Init_NotAvailableToUtilityApps: return "This interface is not available to utility applications (123)";
|
case VRInitError_Init_NotAvailableToUtilityApps: return "This interface is not available to utility applications (123)";
|
||||||
case VRInitError_Init_Internal: return "vrserver internal error (124)";
|
case VRInitError_Init_Internal: return "vrserver internal error (124)";
|
||||||
case VRInitError_Init_HmdDriverIdIsNone: return "Hmd DriverId is invalid (125)";
|
case VRInitError_Init_HmdDriverIdIsNone: return "Hmd DriverId is invalid (125)";
|
||||||
case VRInitError_Init_HmdNotFoundPresenceFailed: return "Hmd Not Found Presence Failed (126)";
|
case VRInitError_Init_HmdNotFoundPresenceFailed: return "Hmd Not Found Presence Failed (126)";
|
||||||
case VRInitError_Init_VRMonitorNotFound: return "VR Monitor Not Found (127)";
|
case VRInitError_Init_VRMonitorNotFound: return "VR Monitor Not Found (127)";
|
||||||
case VRInitError_Init_VRMonitorStartupFailed: return "VR Monitor startup failed (128)";
|
case VRInitError_Init_VRMonitorStartupFailed: return "VR Monitor startup failed (128)";
|
||||||
case VRInitError_Init_LowPowerWatchdogNotSupported: return "Low Power Watchdog Not Supported (129)";
|
case VRInitError_Init_LowPowerWatchdogNotSupported: return "Low Power Watchdog Not Supported (129)";
|
||||||
case VRInitError_Init_InvalidApplicationType: return "Invalid Application Type (130)";
|
case VRInitError_Init_InvalidApplicationType: return "Invalid Application Type (130)";
|
||||||
case VRInitError_Init_NotAvailableToWatchdogApps: return "Not available to watchdog apps (131)";
|
case VRInitError_Init_NotAvailableToWatchdogApps: return "Not available to watchdog apps (131)";
|
||||||
case VRInitError_Init_WatchdogDisabledInSettings: return "Watchdog disabled in settings (132)";
|
case VRInitError_Init_WatchdogDisabledInSettings: return "Watchdog disabled in settings (132)";
|
||||||
case VRInitError_Init_VRDashboardNotFound: return "VR Dashboard Not Found (133)";
|
case VRInitError_Init_VRDashboardNotFound: return "VR Dashboard Not Found (133)";
|
||||||
case VRInitError_Init_VRDashboardStartupFailed: return "VR Dashboard startup failed (134)";
|
case VRInitError_Init_VRDashboardStartupFailed: return "VR Dashboard startup failed (134)";
|
||||||
case VRInitError_Init_VRHomeNotFound: return "VR Home Not Found (135)";
|
case VRInitError_Init_VRHomeNotFound: return "VR Home Not Found (135)";
|
||||||
case VRInitError_Init_VRHomeStartupFailed: return "VR home startup failed (136)";
|
case VRInitError_Init_VRHomeStartupFailed: return "VR home startup failed (136)";
|
||||||
case VRInitError_Init_RebootingBusy: return "Rebooting In Progress (137)";
|
case VRInitError_Init_RebootingBusy: return "Rebooting In Progress (137)";
|
||||||
case VRInitError_Init_FirmwareUpdateBusy: return "Firmware Update In Progress (138)";
|
case VRInitError_Init_FirmwareUpdateBusy: return "Firmware Update In Progress (138)";
|
||||||
case VRInitError_Init_FirmwareRecoveryBusy: return "Firmware Recovery In Progress (139)";
|
case VRInitError_Init_FirmwareRecoveryBusy: return "Firmware Recovery In Progress (139)";
|
||||||
case VRInitError_Init_USBServiceBusy: return "USB Service Busy (140)";
|
case VRInitError_Init_USBServiceBusy: return "USB Service Busy (140)";
|
||||||
|
|
||||||
case VRInitError_Driver_Failed: return "Driver Failed (200)";
|
case VRInitError_Driver_Failed: return "Driver Failed (200)";
|
||||||
case VRInitError_Driver_Unknown: return "Driver Not Known (201)";
|
case VRInitError_Driver_Unknown: return "Driver Not Known (201)";
|
||||||
case VRInitError_Driver_HmdUnknown: return "HMD Not Known (202)";
|
case VRInitError_Driver_HmdUnknown: return "HMD Not Known (202)";
|
||||||
case VRInitError_Driver_NotLoaded: return "Driver Not Loaded (203)";
|
case VRInitError_Driver_NotLoaded: return "Driver Not Loaded (203)";
|
||||||
case VRInitError_Driver_RuntimeOutOfDate: return "Driver runtime is out of date (204)";
|
case VRInitError_Driver_RuntimeOutOfDate: return "Driver runtime is out of date (204)";
|
||||||
case VRInitError_Driver_HmdInUse: return "HMD already in use by another application (205)";
|
case VRInitError_Driver_HmdInUse: return "HMD already in use by another application (205)";
|
||||||
case VRInitError_Driver_NotCalibrated: return "Device is not calibrated (206)";
|
case VRInitError_Driver_NotCalibrated: return "Device is not calibrated (206)";
|
||||||
case VRInitError_Driver_CalibrationInvalid: return "Device Calibration is invalid (207)";
|
case VRInitError_Driver_CalibrationInvalid: return "Device Calibration is invalid (207)";
|
||||||
case VRInitError_Driver_HmdDisplayNotFound: return "HMD detected over USB, but Monitor not found (208)";
|
case VRInitError_Driver_HmdDisplayNotFound: return "HMD detected over USB, but Monitor not found (208)";
|
||||||
case VRInitError_Driver_TrackedDeviceInterfaceUnknown: return "Driver Tracked Device Interface unknown (209)";
|
case VRInitError_Driver_TrackedDeviceInterfaceUnknown: return "Driver Tracked Device Interface unknown (209)";
|
||||||
// case VRInitError_Driver_HmdDisplayNotFoundAfterFix: return "HMD detected over USB, but Monitor not found after attempt to fix (210)"; // taken out upon Ben's request: He thinks that there is no need to separate that error from 208
|
// case VRInitError_Driver_HmdDisplayNotFoundAfterFix: return "HMD detected over USB, but Monitor not found after attempt to fix (210)"; // taken out upon Ben's request: He thinks that there is no need to separate that error from 208
|
||||||
case VRInitError_Driver_HmdDriverIdOutOfBounds: return "Hmd DriverId is our of bounds (211)";
|
case VRInitError_Driver_HmdDriverIdOutOfBounds: return "Hmd DriverId is our of bounds (211)";
|
||||||
case VRInitError_Driver_HmdDisplayMirrored: return "HMD detected over USB, but Monitor may be mirrored instead of extended (212)";
|
case VRInitError_Driver_HmdDisplayMirrored: return "HMD detected over USB, but Monitor may be mirrored instead of extended (212)";
|
||||||
|
|
||||||
case VRInitError_IPC_ServerInitFailed: return "VR Server Init Failed (300)";
|
case VRInitError_IPC_ServerInitFailed: return "VR Server Init Failed (300)";
|
||||||
case VRInitError_IPC_ConnectFailed: return "Connect to VR Server Failed (301)";
|
case VRInitError_IPC_ConnectFailed: return "Connect to VR Server Failed (301)";
|
||||||
case VRInitError_IPC_SharedStateInitFailed: return "Shared IPC State Init Failed (302)";
|
case VRInitError_IPC_SharedStateInitFailed: return "Shared IPC State Init Failed (302)";
|
||||||
case VRInitError_IPC_CompositorInitFailed: return "Shared IPC Compositor Init Failed (303)";
|
case VRInitError_IPC_CompositorInitFailed: return "Shared IPC Compositor Init Failed (303)";
|
||||||
case VRInitError_IPC_MutexInitFailed: return "Shared IPC Mutex Init Failed (304)";
|
case VRInitError_IPC_MutexInitFailed: return "Shared IPC Mutex Init Failed (304)";
|
||||||
case VRInitError_IPC_Failed: return "Shared IPC Failed (305)";
|
case VRInitError_IPC_Failed: return "Shared IPC Failed (305)";
|
||||||
case VRInitError_IPC_CompositorConnectFailed: return "Shared IPC Compositor Connect Failed (306)";
|
case VRInitError_IPC_CompositorConnectFailed: return "Shared IPC Compositor Connect Failed (306)";
|
||||||
case VRInitError_IPC_CompositorInvalidConnectResponse: return "Shared IPC Compositor Invalid Connect Response (307)";
|
case VRInitError_IPC_CompositorInvalidConnectResponse: return "Shared IPC Compositor Invalid Connect Response (307)";
|
||||||
case VRInitError_IPC_ConnectFailedAfterMultipleAttempts: return "Shared IPC Connect Failed After Multiple Attempts (308)";
|
case VRInitError_IPC_ConnectFailedAfterMultipleAttempts: return "Shared IPC Connect Failed After Multiple Attempts (308)";
|
||||||
|
|
||||||
case VRInitError_Compositor_Failed: return "Compositor failed to initialize (400)";
|
case VRInitError_Compositor_Failed: return "Compositor failed to initialize (400)";
|
||||||
case VRInitError_Compositor_D3D11HardwareRequired: return "Compositor failed to find DX11 hardware (401)";
|
case VRInitError_Compositor_D3D11HardwareRequired: return "Compositor failed to find DX11 hardware (401)";
|
||||||
case VRInitError_Compositor_FirmwareRequiresUpdate: return "Compositor requires mandatory firmware update (402)";
|
case VRInitError_Compositor_FirmwareRequiresUpdate: return "Compositor requires mandatory firmware update (402)";
|
||||||
case VRInitError_Compositor_OverlayInitFailed: return "Compositor initialization succeeded, but overlay init failed (403)";
|
case VRInitError_Compositor_OverlayInitFailed: return "Compositor initialization succeeded, but overlay init failed (403)";
|
||||||
case VRInitError_Compositor_ScreenshotsInitFailed: return "Compositor initialization succeeded, but screenshot init failed (404)";
|
case VRInitError_Compositor_ScreenshotsInitFailed: return "Compositor initialization succeeded, but screenshot init failed (404)";
|
||||||
case VRInitError_Compositor_UnableToCreateDevice: return "Compositor unable to create graphics device (405)";
|
case VRInitError_Compositor_UnableToCreateDevice: return "Compositor unable to create graphics device (405)";
|
||||||
|
|
||||||
// Oculus
|
// Oculus
|
||||||
case VRInitError_VendorSpecific_UnableToConnectToOculusRuntime: return "Unable to connect to Oculus Runtime (1000)";
|
case VRInitError_VendorSpecific_UnableToConnectToOculusRuntime: return "Unable to connect to Oculus Runtime (1000)";
|
||||||
|
|
||||||
// Lighthouse
|
// Lighthouse
|
||||||
case VRInitError_VendorSpecific_HmdFound_CantOpenDevice: return "HMD found, but can not open device (1101)";
|
case VRInitError_VendorSpecific_HmdFound_CantOpenDevice: return "HMD found, but can not open device (1101)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart: return "HMD found, but unable to request config (1102)";
|
case VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart: return "HMD found, but unable to request config (1102)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_NoStoredConfig: return "HMD found, but no stored config (1103)";
|
case VRInitError_VendorSpecific_HmdFound_NoStoredConfig: return "HMD found, but no stored config (1103)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck: return "HMD found, but failed configuration check (1113)";
|
case VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck: return "HMD found, but failed configuration check (1113)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_ConfigTooBig: return "HMD found, but config too big (1104)";
|
case VRInitError_VendorSpecific_HmdFound_ConfigTooBig: return "HMD found, but config too big (1104)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_ConfigTooSmall: return "HMD found, but config too small (1105)";
|
case VRInitError_VendorSpecific_HmdFound_ConfigTooSmall: return "HMD found, but config too small (1105)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UnableToInitZLib: return "HMD found, but unable to init ZLib (1106)";
|
case VRInitError_VendorSpecific_HmdFound_UnableToInitZLib: return "HMD found, but unable to init ZLib (1106)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion: return "HMD found, but problems with the data (1107)";
|
case VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion: return "HMD found, but problems with the data (1107)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart: return "HMD found, but problems with the data (1108)";
|
case VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart: return "HMD found, but problems with the data (1108)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart: return "HMD found, but problems with the data (1109)";
|
case VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart: return "HMD found, but problems with the data (1109)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext: return "HMD found, but problems with the data (1110)";
|
case VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext: return "HMD found, but problems with the data (1110)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UserDataAddressRange: return "HMD found, but problems with the data (1111)";
|
case VRInitError_VendorSpecific_HmdFound_UserDataAddressRange: return "HMD found, but problems with the data (1111)";
|
||||||
case VRInitError_VendorSpecific_HmdFound_UserDataError: return "HMD found, but problems with the data (1112)";
|
case VRInitError_VendorSpecific_HmdFound_UserDataError: return "HMD found, but problems with the data (1112)";
|
||||||
|
|
||||||
case VRInitError_Steam_SteamInstallationNotFound: return "Unable to find Steam installation (2000)";
|
case VRInitError_Steam_SteamInstallationNotFound: return "Unable to find Steam installation (2000)";
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return GetIDForVRInitError( eError );
|
return GetIDForVRInitError( eError );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *GetIDForVRInitError( vr::EVRInitError eError )
|
const char *GetIDForVRInitError( vr::EVRInitError eError )
|
||||||
{
|
{
|
||||||
switch( eError )
|
switch( eError )
|
||||||
{
|
{
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_None );
|
RETURN_ENUM_AS_STRING( VRInitError_None );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Unknown );
|
RETURN_ENUM_AS_STRING( VRInitError_Unknown );
|
||||||
|
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationCorrupt );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationCorrupt );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRClientDLLNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRClientDLLNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_FileNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_FileNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_FactoryNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_FactoryNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_InterfaceNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_InterfaceNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidInterface );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidInterface );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_UserConfigDirectoryInvalid );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_UserConfigDirectoryInvalid );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_HmdNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_HmdNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NotInitialized );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NotInitialized );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_PathRegistryNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_PathRegistryNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NoConfigPath );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NoConfigPath );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NoLogPath );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NoLogPath );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_PathRegistryNotWritable );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_PathRegistryNotWritable );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_AppInfoInitFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_AppInfoInitFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_Retry );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_Retry );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_InitCanceledByUser );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_InitCanceledByUser );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_AnotherAppLaunching );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_AnotherAppLaunching );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_SettingsInitFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_SettingsInitFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_ShuttingDown );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_ShuttingDown );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_TooManyObjects );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_TooManyObjects );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NoServerForBackgroundApp );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NoServerForBackgroundApp );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NotSupportedWithCompositor );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NotSupportedWithCompositor );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NotAvailableToUtilityApps );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NotAvailableToUtilityApps );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_Internal );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_Internal );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_HmdDriverIdIsNone );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_HmdDriverIdIsNone );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_HmdNotFoundPresenceFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_HmdNotFoundPresenceFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRMonitorNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRMonitorNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRMonitorStartupFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRMonitorStartupFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_LowPowerWatchdogNotSupported );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_LowPowerWatchdogNotSupported );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidApplicationType );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidApplicationType );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_NotAvailableToWatchdogApps );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_NotAvailableToWatchdogApps );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_WatchdogDisabledInSettings );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_WatchdogDisabledInSettings );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardStartupFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardStartupFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRHomeNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRHomeNotFound );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRHomeStartupFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRHomeStartupFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_RebootingBusy );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_RebootingBusy );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_FirmwareUpdateBusy );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_FirmwareUpdateBusy );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_FirmwareRecoveryBusy );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_FirmwareRecoveryBusy );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_USBServiceBusy );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_USBServiceBusy );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_VRWebHelperStartupFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_VRWebHelperStartupFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Init_TrackerManagerInitFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Init_TrackerManagerInitFailed );
|
||||||
|
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_Failed );
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_Failed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_Unknown );
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_Unknown );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdUnknown);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdUnknown);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_NotLoaded);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_NotLoaded);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_RuntimeOutOfDate);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_RuntimeOutOfDate);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdInUse);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdInUse);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_NotCalibrated);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_NotCalibrated);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_CalibrationInvalid);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_CalibrationInvalid);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFound);
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFound);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_TrackedDeviceInterfaceUnknown );
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_TrackedDeviceInterfaceUnknown );
|
||||||
// RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFoundAfterFix );
|
// RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFoundAfterFix );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDriverIdOutOfBounds );
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDriverIdOutOfBounds );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayMirrored );
|
RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayMirrored );
|
||||||
|
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_ServerInitFailed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_ServerInitFailed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_SharedStateInitFailed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_SharedStateInitFailed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorInitFailed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorInitFailed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_MutexInitFailed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_MutexInitFailed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_Failed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_Failed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorConnectFailed);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorConnectFailed);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorInvalidConnectResponse);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorInvalidConnectResponse);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailedAfterMultipleAttempts);
|
RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailedAfterMultipleAttempts);
|
||||||
|
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Compositor_Failed );
|
RETURN_ENUM_AS_STRING( VRInitError_Compositor_Failed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Compositor_D3D11HardwareRequired );
|
RETURN_ENUM_AS_STRING( VRInitError_Compositor_D3D11HardwareRequired );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Compositor_FirmwareRequiresUpdate );
|
RETURN_ENUM_AS_STRING( VRInitError_Compositor_FirmwareRequiresUpdate );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Compositor_OverlayInitFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Compositor_OverlayInitFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Compositor_ScreenshotsInitFailed );
|
RETURN_ENUM_AS_STRING( VRInitError_Compositor_ScreenshotsInitFailed );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Compositor_UnableToCreateDevice );
|
RETURN_ENUM_AS_STRING( VRInitError_Compositor_UnableToCreateDevice );
|
||||||
|
|
||||||
// Vendor-specific errors
|
// Vendor-specific errors
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_UnableToConnectToOculusRuntime);
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_UnableToConnectToOculusRuntime);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_WindowsNotInDevMode );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_WindowsNotInDevMode );
|
||||||
|
|
||||||
// Lighthouse
|
// Lighthouse
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_CantOpenDevice);
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_CantOpenDevice);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart);
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_NoStoredConfig);
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_NoStoredConfig);
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigTooBig );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigTooBig );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigTooSmall );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigTooSmall );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToInitZLib );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToInitZLib );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataAddressRange );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataAddressRange );
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataError );
|
RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataError );
|
||||||
|
|
||||||
RETURN_ENUM_AS_STRING( VRInitError_Steam_SteamInstallationNotFound );
|
RETURN_ENUM_AS_STRING( VRInitError_Steam_SteamInstallationNotFound );
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
static char buf[128];
|
static char buf[128];
|
||||||
sprintf( buf, "Unknown error (%d)", eError );
|
sprintf( buf, "Unknown error (%d)", eError );
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
const char *GetEnglishStringForHmdError( vr::EVRInitError eError );
|
const char *GetEnglishStringForHmdError( vr::EVRInitError eError );
|
||||||
const char *GetIDForVRInitError( vr::EVRInitError eError );
|
const char *GetIDForVRInitError( vr::EVRInitError eError );
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,35 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace vr
|
namespace vr
|
||||||
{
|
{
|
||||||
|
|
||||||
class IVRClientCore
|
class IVRClientCore
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/** Initializes the system */
|
/** Initializes the system */
|
||||||
virtual EVRInitError Init( vr::EVRApplicationType eApplicationType, const char *pStartupInfo ) = 0;
|
virtual EVRInitError Init( vr::EVRApplicationType eApplicationType, const char *pStartupInfo ) = 0;
|
||||||
|
|
||||||
/** cleans up everything in vrclient.dll and prepares the DLL to be unloaded */
|
/** cleans up everything in vrclient.dll and prepares the DLL to be unloaded */
|
||||||
virtual void Cleanup() = 0;
|
virtual void Cleanup() = 0;
|
||||||
|
|
||||||
/** checks to see if the specified interface/version is supported in this vrclient.dll */
|
/** checks to see if the specified interface/version is supported in this vrclient.dll */
|
||||||
virtual EVRInitError IsInterfaceVersionValid( const char *pchInterfaceVersion ) = 0;
|
virtual EVRInitError IsInterfaceVersionValid( const char *pchInterfaceVersion ) = 0;
|
||||||
|
|
||||||
/** Retrieves any interface from vrclient.dll */
|
/** Retrieves any interface from vrclient.dll */
|
||||||
virtual void *GetGenericInterface( const char *pchNameAndVersion, EVRInitError *peError ) = 0;
|
virtual void *GetGenericInterface( const char *pchNameAndVersion, EVRInitError *peError ) = 0;
|
||||||
|
|
||||||
/** Returns true if any driver has an HMD attached. Can be called outside of Init/Cleanup */
|
/** Returns true if any driver has an HMD attached. Can be called outside of Init/Cleanup */
|
||||||
virtual bool BIsHmdPresent() = 0;
|
virtual bool BIsHmdPresent() = 0;
|
||||||
|
|
||||||
/** Returns an English error string from inside vrclient.dll which might be newer than the API DLL */
|
/** Returns an English error string from inside vrclient.dll which might be newer than the API DLL */
|
||||||
virtual const char *GetEnglishStringForHmdError( vr::EVRInitError eError ) = 0;
|
virtual const char *GetEnglishStringForHmdError( vr::EVRInitError eError ) = 0;
|
||||||
|
|
||||||
/** Returns an error symbol from inside vrclient.dll which might be newer than the API DLL */
|
/** Returns an error symbol from inside vrclient.dll which might be newer than the API DLL */
|
||||||
virtual const char *GetIDForVRInitError( vr::EVRInitError eError ) = 0;
|
virtual const char *GetIDForVRInitError( vr::EVRInitError eError ) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const IVRClientCore_Version = "IVRClientCore_003";
|
static const char * const IVRClientCore_Version = "IVRClientCore_003";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,298 +1,298 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#define VR_API_EXPORT 1
|
#define VR_API_EXPORT 1
|
||||||
#include "openvr.h"
|
#include "openvr.h"
|
||||||
#include "ivrclientcore.h"
|
#include "ivrclientcore.h"
|
||||||
#include "pathtools_public.h"
|
#include "pathtools_public.h"
|
||||||
#include "sharedlibtools_public.h"
|
#include "sharedlibtools_public.h"
|
||||||
#include "envvartools_public.h"
|
#include "envvartools_public.h"
|
||||||
#include "hmderrors_public.h"
|
#include "hmderrors_public.h"
|
||||||
#include "vrpathregistry_public.h"
|
#include "vrpathregistry_public.h"
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
using vr::EVRInitError;
|
using vr::EVRInitError;
|
||||||
using vr::IVRSystem;
|
using vr::IVRSystem;
|
||||||
using vr::IVRClientCore;
|
using vr::IVRClientCore;
|
||||||
using vr::VRInitError_None;
|
using vr::VRInitError_None;
|
||||||
|
|
||||||
namespace vr
|
namespace vr
|
||||||
{
|
{
|
||||||
|
|
||||||
static void *g_pVRModule = NULL;
|
static void *g_pVRModule = NULL;
|
||||||
static IVRClientCore *g_pHmdSystem = NULL;
|
static IVRClientCore *g_pHmdSystem = NULL;
|
||||||
static std::recursive_mutex g_mutexSystem;
|
static std::recursive_mutex g_mutexSystem;
|
||||||
|
|
||||||
|
|
||||||
typedef void* (*VRClientCoreFactoryFn)(const char *pInterfaceName, int *pReturnCode);
|
typedef void* (*VRClientCoreFactoryFn)(const char *pInterfaceName, int *pReturnCode);
|
||||||
|
|
||||||
static uint32_t g_nVRToken = 0;
|
static uint32_t g_nVRToken = 0;
|
||||||
|
|
||||||
uint32_t VR_GetInitToken()
|
uint32_t VR_GetInitToken()
|
||||||
{
|
{
|
||||||
return g_nVRToken;
|
return g_nVRToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
EVRInitError VR_LoadHmdSystemInternal();
|
EVRInitError VR_LoadHmdSystemInternal();
|
||||||
void CleanupInternalInterfaces();
|
void CleanupInternalInterfaces();
|
||||||
|
|
||||||
|
|
||||||
uint32_t VR_InitInternal2( EVRInitError *peError, vr::EVRApplicationType eApplicationType, const char *pStartupInfo )
|
uint32_t VR_InitInternal2( EVRInitError *peError, vr::EVRApplicationType eApplicationType, const char *pStartupInfo )
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
EVRInitError err = VR_LoadHmdSystemInternal();
|
EVRInitError err = VR_LoadHmdSystemInternal();
|
||||||
if ( err == vr::VRInitError_None )
|
if ( err == vr::VRInitError_None )
|
||||||
{
|
{
|
||||||
err = g_pHmdSystem->Init( eApplicationType, pStartupInfo );
|
err = g_pHmdSystem->Init( eApplicationType, pStartupInfo );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( peError )
|
if ( peError )
|
||||||
*peError = err;
|
*peError = err;
|
||||||
|
|
||||||
if ( err != VRInitError_None )
|
if ( err != VRInitError_None )
|
||||||
{
|
{
|
||||||
SharedLib_Unload( g_pVRModule );
|
SharedLib_Unload( g_pVRModule );
|
||||||
g_pHmdSystem = NULL;
|
g_pHmdSystem = NULL;
|
||||||
g_pVRModule = NULL;
|
g_pVRModule = NULL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ++g_nVRToken;
|
return ++g_nVRToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType );
|
VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType );
|
||||||
|
|
||||||
uint32_t VR_InitInternal( EVRInitError *peError, vr::EVRApplicationType eApplicationType )
|
uint32_t VR_InitInternal( EVRInitError *peError, vr::EVRApplicationType eApplicationType )
|
||||||
{
|
{
|
||||||
return VR_InitInternal2( peError, eApplicationType, nullptr );
|
return VR_InitInternal2( peError, eApplicationType, nullptr );
|
||||||
}
|
}
|
||||||
|
|
||||||
void VR_ShutdownInternal()
|
void VR_ShutdownInternal()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if ( g_pHmdSystem )
|
if ( g_pHmdSystem )
|
||||||
{
|
{
|
||||||
g_pHmdSystem->Cleanup();
|
g_pHmdSystem->Cleanup();
|
||||||
g_pHmdSystem = NULL;
|
g_pHmdSystem = NULL;
|
||||||
}
|
}
|
||||||
if ( g_pVRModule )
|
if ( g_pVRModule )
|
||||||
{
|
{
|
||||||
SharedLib_Unload( g_pVRModule );
|
SharedLib_Unload( g_pVRModule );
|
||||||
g_pVRModule = NULL;
|
g_pVRModule = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined( VR_API_PUBLIC )
|
#if !defined( VR_API_PUBLIC )
|
||||||
CleanupInternalInterfaces();
|
CleanupInternalInterfaces();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
++g_nVRToken;
|
++g_nVRToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
EVRInitError VR_LoadHmdSystemInternal()
|
EVRInitError VR_LoadHmdSystemInternal()
|
||||||
{
|
{
|
||||||
std::string sRuntimePath, sConfigPath, sLogPath;
|
std::string sRuntimePath, sConfigPath, sLogPath;
|
||||||
|
|
||||||
bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
||||||
if( !bReadPathRegistry )
|
if( !bReadPathRegistry )
|
||||||
{
|
{
|
||||||
return vr::VRInitError_Init_PathRegistryNotFound;
|
return vr::VRInitError_Init_PathRegistryNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out where we're going to look for vrclient.dll
|
// figure out where we're going to look for vrclient.dll
|
||||||
// see if the specified path actually exists.
|
// see if the specified path actually exists.
|
||||||
if( !Path_IsDirectory( sRuntimePath ) )
|
if( !Path_IsDirectory( sRuntimePath ) )
|
||||||
{
|
{
|
||||||
return vr::VRInitError_Init_InstallationNotFound;
|
return vr::VRInitError_Init_InstallationNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Because we don't have a way to select debug vs. release yet we'll just
|
// Because we don't have a way to select debug vs. release yet we'll just
|
||||||
// use debug if it's there
|
// use debug if it's there
|
||||||
#if defined( LINUX64 )
|
#if defined( LINUX64 )
|
||||||
std::string sTestPath = Path_Join( sRuntimePath, "bin", PLATSUBDIR );
|
std::string sTestPath = Path_Join( sRuntimePath, "bin", PLATSUBDIR );
|
||||||
#else
|
#else
|
||||||
std::string sTestPath = Path_Join( sRuntimePath, "bin" );
|
std::string sTestPath = Path_Join( sRuntimePath, "bin" );
|
||||||
#endif
|
#endif
|
||||||
if( !Path_IsDirectory( sTestPath ) )
|
if( !Path_IsDirectory( sTestPath ) )
|
||||||
{
|
{
|
||||||
return vr::VRInitError_Init_InstallationCorrupt;
|
return vr::VRInitError_Init_InstallationCorrupt;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined( WIN64 )
|
#if defined( WIN64 )
|
||||||
std::string sDLLPath = Path_Join( sTestPath, "vrclient_x64" DYNAMIC_LIB_EXT );
|
std::string sDLLPath = Path_Join( sTestPath, "vrclient_x64" DYNAMIC_LIB_EXT );
|
||||||
#else
|
#else
|
||||||
std::string sDLLPath = Path_Join( sTestPath, "vrclient" DYNAMIC_LIB_EXT );
|
std::string sDLLPath = Path_Join( sTestPath, "vrclient" DYNAMIC_LIB_EXT );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// only look in the override
|
// only look in the override
|
||||||
void *pMod = SharedLib_Load( sDLLPath.c_str() );
|
void *pMod = SharedLib_Load( sDLLPath.c_str() );
|
||||||
// nothing more to do if we can't load the DLL
|
// nothing more to do if we can't load the DLL
|
||||||
if( !pMod )
|
if( !pMod )
|
||||||
{
|
{
|
||||||
return vr::VRInitError_Init_VRClientDLLNotFound;
|
return vr::VRInitError_Init_VRClientDLLNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
VRClientCoreFactoryFn fnFactory = ( VRClientCoreFactoryFn )( SharedLib_GetFunction( pMod, "VRClientCoreFactory" ) );
|
VRClientCoreFactoryFn fnFactory = ( VRClientCoreFactoryFn )( SharedLib_GetFunction( pMod, "VRClientCoreFactory" ) );
|
||||||
if( !fnFactory )
|
if( !fnFactory )
|
||||||
{
|
{
|
||||||
SharedLib_Unload( pMod );
|
SharedLib_Unload( pMod );
|
||||||
return vr::VRInitError_Init_FactoryNotFound;
|
return vr::VRInitError_Init_FactoryNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nReturnCode = 0;
|
int nReturnCode = 0;
|
||||||
g_pHmdSystem = static_cast< IVRClientCore * > ( fnFactory( vr::IVRClientCore_Version, &nReturnCode ) );
|
g_pHmdSystem = static_cast< IVRClientCore * > ( fnFactory( vr::IVRClientCore_Version, &nReturnCode ) );
|
||||||
if( !g_pHmdSystem )
|
if( !g_pHmdSystem )
|
||||||
{
|
{
|
||||||
SharedLib_Unload( pMod );
|
SharedLib_Unload( pMod );
|
||||||
return vr::VRInitError_Init_InterfaceNotFound;
|
return vr::VRInitError_Init_InterfaceNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_pVRModule = pMod;
|
g_pVRModule = pMod;
|
||||||
return VRInitError_None;
|
return VRInitError_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void *VR_GetGenericInterface(const char *pchInterfaceVersion, EVRInitError *peError)
|
void *VR_GetGenericInterface(const char *pchInterfaceVersion, EVRInitError *peError)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if (!g_pHmdSystem)
|
if (!g_pHmdSystem)
|
||||||
{
|
{
|
||||||
if (peError)
|
if (peError)
|
||||||
*peError = vr::VRInitError_Init_NotInitialized;
|
*peError = vr::VRInitError_Init_NotInitialized;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_pHmdSystem->GetGenericInterface(pchInterfaceVersion, peError);
|
return g_pHmdSystem->GetGenericInterface(pchInterfaceVersion, peError);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VR_IsInterfaceVersionValid(const char *pchInterfaceVersion)
|
bool VR_IsInterfaceVersionValid(const char *pchInterfaceVersion)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if (!g_pHmdSystem)
|
if (!g_pHmdSystem)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_pHmdSystem->IsInterfaceVersionValid(pchInterfaceVersion) == VRInitError_None;
|
return g_pHmdSystem->IsInterfaceVersionValid(pchInterfaceVersion) == VRInitError_None;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VR_IsHmdPresent()
|
bool VR_IsHmdPresent()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if( g_pHmdSystem )
|
if( g_pHmdSystem )
|
||||||
{
|
{
|
||||||
// if we're already initialized, just call through
|
// if we're already initialized, just call through
|
||||||
return g_pHmdSystem->BIsHmdPresent();
|
return g_pHmdSystem->BIsHmdPresent();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// otherwise we need to do a bit more work
|
// otherwise we need to do a bit more work
|
||||||
EVRInitError err = VR_LoadHmdSystemInternal();
|
EVRInitError err = VR_LoadHmdSystemInternal();
|
||||||
if( err != VRInitError_None )
|
if( err != VRInitError_None )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bool bHasHmd = g_pHmdSystem->BIsHmdPresent();
|
bool bHasHmd = g_pHmdSystem->BIsHmdPresent();
|
||||||
|
|
||||||
g_pHmdSystem = NULL;
|
g_pHmdSystem = NULL;
|
||||||
SharedLib_Unload( g_pVRModule );
|
SharedLib_Unload( g_pVRModule );
|
||||||
g_pVRModule = NULL;
|
g_pVRModule = NULL;
|
||||||
|
|
||||||
return bHasHmd;
|
return bHasHmd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns true if the OpenVR runtime is installed. */
|
/** Returns true if the OpenVR runtime is installed. */
|
||||||
bool VR_IsRuntimeInstalled()
|
bool VR_IsRuntimeInstalled()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if( g_pHmdSystem )
|
if( g_pHmdSystem )
|
||||||
{
|
{
|
||||||
// if we're already initialized, OpenVR is obviously installed
|
// if we're already initialized, OpenVR is obviously installed
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// otherwise we need to do a bit more work
|
// otherwise we need to do a bit more work
|
||||||
std::string sRuntimePath, sConfigPath, sLogPath;
|
std::string sRuntimePath, sConfigPath, sLogPath;
|
||||||
|
|
||||||
bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
||||||
if( !bReadPathRegistry )
|
if( !bReadPathRegistry )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out where we're going to look for vrclient.dll
|
// figure out where we're going to look for vrclient.dll
|
||||||
// see if the specified path actually exists.
|
// see if the specified path actually exists.
|
||||||
if( !Path_IsDirectory( sRuntimePath ) )
|
if( !Path_IsDirectory( sRuntimePath ) )
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the installation may be corrupt in some way, but it certainly looks installed
|
// the installation may be corrupt in some way, but it certainly looks installed
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Returns where OpenVR runtime is installed. */
|
/** Returns where OpenVR runtime is installed. */
|
||||||
const char *VR_RuntimePath()
|
const char *VR_RuntimePath()
|
||||||
{
|
{
|
||||||
// otherwise we need to do a bit more work
|
// otherwise we need to do a bit more work
|
||||||
static std::string sRuntimePath;
|
static std::string sRuntimePath;
|
||||||
std::string sConfigPath, sLogPath;
|
std::string sConfigPath, sLogPath;
|
||||||
|
|
||||||
bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
|
||||||
if ( !bReadPathRegistry )
|
if ( !bReadPathRegistry )
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// figure out where we're going to look for vrclient.dll
|
// figure out where we're going to look for vrclient.dll
|
||||||
// see if the specified path actually exists.
|
// see if the specified path actually exists.
|
||||||
if ( !Path_IsDirectory( sRuntimePath ) )
|
if ( !Path_IsDirectory( sRuntimePath ) )
|
||||||
{
|
{
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sRuntimePath.c_str();
|
return sRuntimePath.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Returns the symbol version of an HMD error. */
|
/** Returns the symbol version of an HMD error. */
|
||||||
const char *VR_GetVRInitErrorAsSymbol( EVRInitError error )
|
const char *VR_GetVRInitErrorAsSymbol( EVRInitError error )
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if( g_pHmdSystem )
|
if( g_pHmdSystem )
|
||||||
return g_pHmdSystem->GetIDForVRInitError( error );
|
return g_pHmdSystem->GetIDForVRInitError( error );
|
||||||
else
|
else
|
||||||
return GetIDForVRInitError( error );
|
return GetIDForVRInitError( error );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Returns the english string version of an HMD error. */
|
/** Returns the english string version of an HMD error. */
|
||||||
const char *VR_GetVRInitErrorAsEnglishDescription( EVRInitError error )
|
const char *VR_GetVRInitErrorAsEnglishDescription( EVRInitError error )
|
||||||
{
|
{
|
||||||
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
|
||||||
|
|
||||||
if ( g_pHmdSystem )
|
if ( g_pHmdSystem )
|
||||||
return g_pHmdSystem->GetEnglishStringForHmdError( error );
|
return g_pHmdSystem->GetEnglishStringForHmdError( error );
|
||||||
else
|
else
|
||||||
return GetEnglishStringForHmdError( error );
|
return GetEnglishStringForHmdError( error );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
VR_INTERFACE const char *VR_CALLTYPE VR_GetStringForHmdError( vr::EVRInitError error );
|
VR_INTERFACE const char *VR_CALLTYPE VR_GetStringForHmdError( vr::EVRInitError error );
|
||||||
|
|
||||||
/** Returns the english string version of an HMD error. */
|
/** Returns the english string version of an HMD error. */
|
||||||
const char *VR_GetStringForHmdError( EVRInitError error )
|
const char *VR_GetStringForHmdError( EVRInitError error )
|
||||||
{
|
{
|
||||||
return VR_GetVRInitErrorAsEnglishDescription( error );
|
return VR_GetVRInitErrorAsEnglishDescription( error );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,132 +1,132 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/** Returns the path (including filename) to the current executable */
|
/** Returns the path (including filename) to the current executable */
|
||||||
std::string Path_GetExecutablePath();
|
std::string Path_GetExecutablePath();
|
||||||
|
|
||||||
/** Returns the path of the current working directory */
|
/** Returns the path of the current working directory */
|
||||||
std::string Path_GetWorkingDirectory();
|
std::string Path_GetWorkingDirectory();
|
||||||
|
|
||||||
/** Sets the path of the current working directory. Returns true if this was successful. */
|
/** Sets the path of the current working directory. Returns true if this was successful. */
|
||||||
bool Path_SetWorkingDirectory( const std::string & sPath );
|
bool Path_SetWorkingDirectory( const std::string & sPath );
|
||||||
|
|
||||||
/** returns the path (including filename) of the current shared lib or DLL */
|
/** returns the path (including filename) of the current shared lib or DLL */
|
||||||
std::string Path_GetThisModulePath();
|
std::string Path_GetThisModulePath();
|
||||||
|
|
||||||
/** Returns the specified path without its filename.
|
/** Returns the specified path without its filename.
|
||||||
* If slash is unspecified the native path separator of the current platform
|
* If slash is unspecified the native path separator of the current platform
|
||||||
* will be used. */
|
* will be used. */
|
||||||
std::string Path_StripFilename( const std::string & sPath, char slash = 0 );
|
std::string Path_StripFilename( const std::string & sPath, char slash = 0 );
|
||||||
|
|
||||||
/** returns just the filename from the provided full or relative path. */
|
/** returns just the filename from the provided full or relative path. */
|
||||||
std::string Path_StripDirectory( const std::string & sPath, char slash = 0 );
|
std::string Path_StripDirectory( const std::string & sPath, char slash = 0 );
|
||||||
|
|
||||||
/** returns just the filename with no extension of the provided filename.
|
/** returns just the filename with no extension of the provided filename.
|
||||||
* If there is a path the path is left intact. */
|
* If there is a path the path is left intact. */
|
||||||
std::string Path_StripExtension( const std::string & sPath );
|
std::string Path_StripExtension( const std::string & sPath );
|
||||||
|
|
||||||
/** returns just extension of the provided filename (if any). */
|
/** returns just extension of the provided filename (if any). */
|
||||||
std::string Path_GetExtension( const std::string & sPath );
|
std::string Path_GetExtension( const std::string & sPath );
|
||||||
|
|
||||||
/** Returns true if the path is absolute */
|
/** Returns true if the path is absolute */
|
||||||
bool Path_IsAbsolute( const std::string & sPath );
|
bool Path_IsAbsolute( const std::string & sPath );
|
||||||
|
|
||||||
/** Makes an absolute path from a relative path and a base path */
|
/** Makes an absolute path from a relative path and a base path */
|
||||||
std::string Path_MakeAbsolute( const std::string & sRelativePath, const std::string & sBasePath );
|
std::string Path_MakeAbsolute( const std::string & sRelativePath, const std::string & sBasePath );
|
||||||
|
|
||||||
/** Fixes the directory separators for the current platform.
|
/** Fixes the directory separators for the current platform.
|
||||||
* If slash is unspecified the native path separator of the current platform
|
* If slash is unspecified the native path separator of the current platform
|
||||||
* will be used. */
|
* will be used. */
|
||||||
std::string Path_FixSlashes( const std::string & sPath, char slash = 0 );
|
std::string Path_FixSlashes( const std::string & sPath, char slash = 0 );
|
||||||
|
|
||||||
/** Returns the path separator for the current platform */
|
/** Returns the path separator for the current platform */
|
||||||
char Path_GetSlash();
|
char Path_GetSlash();
|
||||||
|
|
||||||
/** Jams two paths together with the right kind of slash */
|
/** Jams two paths together with the right kind of slash */
|
||||||
std::string Path_Join( const std::string & first, const std::string & second, char slash = 0 );
|
std::string Path_Join( const std::string & first, const std::string & second, char slash = 0 );
|
||||||
std::string Path_Join( const std::string & first, const std::string & second, const std::string & third, char slash = 0 );
|
std::string Path_Join( const std::string & first, const std::string & second, const std::string & third, char slash = 0 );
|
||||||
std::string Path_Join( const std::string & first, const std::string & second, const std::string & third, const std::string &fourth, char slash = 0 );
|
std::string Path_Join( const std::string & first, const std::string & second, const std::string & third, const std::string &fourth, char slash = 0 );
|
||||||
std::string Path_Join(
|
std::string Path_Join(
|
||||||
const std::string & first,
|
const std::string & first,
|
||||||
const std::string & second,
|
const std::string & second,
|
||||||
const std::string & third,
|
const std::string & third,
|
||||||
const std::string & fourth,
|
const std::string & fourth,
|
||||||
const std::string & fifth,
|
const std::string & fifth,
|
||||||
char slash = 0 );
|
char slash = 0 );
|
||||||
|
|
||||||
|
|
||||||
/** Removes redundant <dir>/.. elements in the path. Returns an empty path if the
|
/** Removes redundant <dir>/.. elements in the path. Returns an empty path if the
|
||||||
* specified path has a broken number of directories for its number of ..s.
|
* specified path has a broken number of directories for its number of ..s.
|
||||||
* If slash is unspecified the native path separator of the current platform
|
* If slash is unspecified the native path separator of the current platform
|
||||||
* will be used. */
|
* will be used. */
|
||||||
std::string Path_Compact( const std::string & sRawPath, char slash = 0 );
|
std::string Path_Compact( const std::string & sRawPath, char slash = 0 );
|
||||||
|
|
||||||
//** Removed trailing slashes */
|
//** Removed trailing slashes */
|
||||||
std::string Path_RemoveTrailingSlash( const std::string & sRawPath, char slash = 0 );
|
std::string Path_RemoveTrailingSlash( const std::string & sRawPath, char slash = 0 );
|
||||||
|
|
||||||
/** returns true if the specified path exists and is a directory */
|
/** returns true if the specified path exists and is a directory */
|
||||||
bool Path_IsDirectory( const std::string & sPath );
|
bool Path_IsDirectory( const std::string & sPath );
|
||||||
|
|
||||||
/** returns true if the specified path represents an app bundle */
|
/** returns true if the specified path represents an app bundle */
|
||||||
bool Path_IsAppBundle( const std::string & sPath );
|
bool Path_IsAppBundle( const std::string & sPath );
|
||||||
|
|
||||||
/** returns true if the the path exists */
|
/** returns true if the the path exists */
|
||||||
bool Path_Exists( const std::string & sPath );
|
bool Path_Exists( const std::string & sPath );
|
||||||
|
|
||||||
/** Helper functions to find parent directories or subdirectories of parent directories */
|
/** Helper functions to find parent directories or subdirectories of parent directories */
|
||||||
std::string Path_FindParentDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName );
|
std::string Path_FindParentDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName );
|
||||||
std::string Path_FindParentSubDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName );
|
std::string Path_FindParentSubDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName );
|
||||||
|
|
||||||
/** Path operations to read or write text/binary files */
|
/** Path operations to read or write text/binary files */
|
||||||
unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize );
|
unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize );
|
||||||
uint32_t Path_ReadBinaryFile( const std::string &strFilename, unsigned char *pBuffer, uint32_t unSize );
|
uint32_t Path_ReadBinaryFile( const std::string &strFilename, unsigned char *pBuffer, uint32_t unSize );
|
||||||
bool Path_WriteBinaryFile( const std::string &strFilename, unsigned char *pData, unsigned nSize );
|
bool Path_WriteBinaryFile( const std::string &strFilename, unsigned char *pData, unsigned nSize );
|
||||||
std::string Path_ReadTextFile( const std::string &strFilename );
|
std::string Path_ReadTextFile( const std::string &strFilename );
|
||||||
bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pchData );
|
bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pchData );
|
||||||
bool Path_WriteStringToTextFileAtomic( const std::string &strFilename, const char *pchData );
|
bool Path_WriteStringToTextFileAtomic( const std::string &strFilename, const char *pchData );
|
||||||
|
|
||||||
/** Returns a file:// url for paths, or an http or https url if that's what was provided */
|
/** Returns a file:// url for paths, or an http or https url if that's what was provided */
|
||||||
std::string Path_FilePathToUrl( const std::string & sRelativePath, const std::string & sBasePath );
|
std::string Path_FilePathToUrl( const std::string & sRelativePath, const std::string & sBasePath );
|
||||||
|
|
||||||
/** Strips off file:// off a URL and returns the path. For other kinds of URLs an empty string is returned */
|
/** Strips off file:// off a URL and returns the path. For other kinds of URLs an empty string is returned */
|
||||||
std::string Path_UrlToFilePath( const std::string & sFileUrl );
|
std::string Path_UrlToFilePath( const std::string & sFileUrl );
|
||||||
|
|
||||||
/** Returns the root of the directory the system wants us to store user documents in */
|
/** Returns the root of the directory the system wants us to store user documents in */
|
||||||
std::string GetUserDocumentsPath();
|
std::string GetUserDocumentsPath();
|
||||||
|
|
||||||
#ifndef MAX_UNICODE_PATH
|
#ifndef MAX_UNICODE_PATH
|
||||||
#define MAX_UNICODE_PATH 32767
|
#define MAX_UNICODE_PATH 32767
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef MAX_UNICODE_PATH_IN_UTF8
|
#ifndef MAX_UNICODE_PATH_IN_UTF8
|
||||||
#define MAX_UNICODE_PATH_IN_UTF8 (MAX_UNICODE_PATH * 4)
|
#define MAX_UNICODE_PATH_IN_UTF8 (MAX_UNICODE_PATH * 4)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
#if defined(WIN32)
|
#if defined(WIN32)
|
||||||
#define DYNAMIC_LIB_EXT ".dll"
|
#define DYNAMIC_LIB_EXT ".dll"
|
||||||
#define PROGRAM_EXT ".exe"
|
#define PROGRAM_EXT ".exe"
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#define PLATSUBDIR "win64"
|
#define PLATSUBDIR "win64"
|
||||||
#else
|
#else
|
||||||
#define PLATSUBDIR "win32"
|
#define PLATSUBDIR "win32"
|
||||||
#endif
|
#endif
|
||||||
#elif defined(OSX)
|
#elif defined(OSX)
|
||||||
#define DYNAMIC_LIB_EXT ".dylib"
|
#define DYNAMIC_LIB_EXT ".dylib"
|
||||||
#define PLATSUBDIR "osx32"
|
#define PLATSUBDIR "osx32"
|
||||||
#define PROGRAM_EXT ""
|
#define PROGRAM_EXT ""
|
||||||
#elif defined(LINUX)
|
#elif defined(LINUX)
|
||||||
#define DYNAMIC_LIB_EXT ".so"
|
#define DYNAMIC_LIB_EXT ".so"
|
||||||
#define PROGRAM_EXT ""
|
#define PROGRAM_EXT ""
|
||||||
#if defined( LINUX32 )
|
#if defined( LINUX32 )
|
||||||
#define PLATSUBDIR "linux32"
|
#define PLATSUBDIR "linux32"
|
||||||
#else
|
#else
|
||||||
#define PLATSUBDIR "linux64"
|
#define PLATSUBDIR "linux64"
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#warning "Unknown platform for PLATSUBDIR"
|
#warning "Unknown platform for PLATSUBDIR"
|
||||||
#define PLATSUBDIR "unknown_platform"
|
#define PLATSUBDIR "unknown_platform"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,43 +1,43 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#include "sharedlibtools_public.h"
|
#include "sharedlibtools_public.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if defined(_WIN32)
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(POSIX)
|
#if defined(POSIX)
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SharedLibHandle SharedLib_Load( const char *pchPath )
|
SharedLibHandle SharedLib_Load( const char *pchPath )
|
||||||
{
|
{
|
||||||
#if defined( _WIN32)
|
#if defined( _WIN32)
|
||||||
return (SharedLibHandle)LoadLibraryEx( pchPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
|
return (SharedLibHandle)LoadLibraryEx( pchPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
|
||||||
#elif defined(POSIX)
|
#elif defined(POSIX)
|
||||||
return (SharedLibHandle)dlopen(pchPath, RTLD_LOCAL|RTLD_NOW);
|
return (SharedLibHandle)dlopen(pchPath, RTLD_LOCAL|RTLD_NOW);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName)
|
void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName)
|
||||||
{
|
{
|
||||||
#if defined( _WIN32)
|
#if defined( _WIN32)
|
||||||
return (void*)GetProcAddress( (HMODULE)lib, pchFunctionName );
|
return (void*)GetProcAddress( (HMODULE)lib, pchFunctionName );
|
||||||
#elif defined(POSIX)
|
#elif defined(POSIX)
|
||||||
return dlsym( lib, pchFunctionName );
|
return dlsym( lib, pchFunctionName );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SharedLib_Unload( SharedLibHandle lib )
|
void SharedLib_Unload( SharedLibHandle lib )
|
||||||
{
|
{
|
||||||
if ( !lib )
|
if ( !lib )
|
||||||
return;
|
return;
|
||||||
#if defined( _WIN32)
|
#if defined( _WIN32)
|
||||||
FreeLibrary( (HMODULE)lib );
|
FreeLibrary( (HMODULE)lib );
|
||||||
#elif defined(POSIX)
|
#elif defined(POSIX)
|
||||||
dlclose( lib );
|
dlclose( lib );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
typedef void *SharedLibHandle;
|
typedef void *SharedLibHandle;
|
||||||
|
|
||||||
SharedLibHandle SharedLib_Load( const char *pchPath );
|
SharedLibHandle SharedLib_Load( const char *pchPath );
|
||||||
void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName);
|
void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName);
|
||||||
void SharedLib_Unload( SharedLibHandle lib );
|
void SharedLib_Unload( SharedLibHandle lib );
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,449 +1,449 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#include "strtools_public.h"
|
#include "strtools_public.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool StringHasPrefix( const std::string & sString, const std::string & sPrefix )
|
bool StringHasPrefix( const std::string & sString, const std::string & sPrefix )
|
||||||
{
|
{
|
||||||
return 0 == strnicmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
|
return 0 == strnicmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix )
|
bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix )
|
||||||
{
|
{
|
||||||
return 0 == strncmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
|
return 0 == strncmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool StringHasSuffix( const std::string &sString, const std::string &sSuffix )
|
bool StringHasSuffix( const std::string &sString, const std::string &sSuffix )
|
||||||
{
|
{
|
||||||
size_t cStrLen = sString.length();
|
size_t cStrLen = sString.length();
|
||||||
size_t cSuffixLen = sSuffix.length();
|
size_t cSuffixLen = sSuffix.length();
|
||||||
|
|
||||||
if ( cSuffixLen > cStrLen )
|
if ( cSuffixLen > cStrLen )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
|
std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
|
||||||
|
|
||||||
return 0 == stricmp( sStringSuffix.c_str(), sSuffix.c_str() );
|
return 0 == stricmp( sStringSuffix.c_str(), sSuffix.c_str() );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix )
|
bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix )
|
||||||
{
|
{
|
||||||
size_t cStrLen = sString.length();
|
size_t cStrLen = sString.length();
|
||||||
size_t cSuffixLen = sSuffix.length();
|
size_t cSuffixLen = sSuffix.length();
|
||||||
|
|
||||||
if ( cSuffixLen > cStrLen )
|
if ( cSuffixLen > cStrLen )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
|
std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
|
||||||
|
|
||||||
return 0 == strncmp( sStringSuffix.c_str(), sSuffix.c_str(),cSuffixLen );
|
return 0 == strncmp( sStringSuffix.c_str(), sSuffix.c_str(),cSuffixLen );
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
std::string UTF16to8(const wchar_t * in)
|
std::string UTF16to8(const wchar_t * in)
|
||||||
{
|
{
|
||||||
std::string out;
|
std::string out;
|
||||||
unsigned int codepoint = 0;
|
unsigned int codepoint = 0;
|
||||||
for ( ; in && *in != 0; ++in )
|
for ( ; in && *in != 0; ++in )
|
||||||
{
|
{
|
||||||
if (*in >= 0xd800 && *in <= 0xdbff)
|
if (*in >= 0xd800 && *in <= 0xdbff)
|
||||||
codepoint = ((*in - 0xd800) << 10) + 0x10000;
|
codepoint = ((*in - 0xd800) << 10) + 0x10000;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (*in >= 0xdc00 && *in <= 0xdfff)
|
if (*in >= 0xdc00 && *in <= 0xdfff)
|
||||||
codepoint |= *in - 0xdc00;
|
codepoint |= *in - 0xdc00;
|
||||||
else
|
else
|
||||||
codepoint = *in;
|
codepoint = *in;
|
||||||
|
|
||||||
if (codepoint <= 0x7f)
|
if (codepoint <= 0x7f)
|
||||||
out.append(1, static_cast<char>(codepoint));
|
out.append(1, static_cast<char>(codepoint));
|
||||||
else if (codepoint <= 0x7ff)
|
else if (codepoint <= 0x7ff)
|
||||||
{
|
{
|
||||||
out.append(1, static_cast<char>(0xc0 | ((codepoint >> 6) & 0x1f)));
|
out.append(1, static_cast<char>(0xc0 | ((codepoint >> 6) & 0x1f)));
|
||||||
out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
|
out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
|
||||||
}
|
}
|
||||||
else if (codepoint <= 0xffff)
|
else if (codepoint <= 0xffff)
|
||||||
{
|
{
|
||||||
out.append(1, static_cast<char>(0xe0 | ((codepoint >> 12) & 0x0f)));
|
out.append(1, static_cast<char>(0xe0 | ((codepoint >> 12) & 0x0f)));
|
||||||
out.append(1, static_cast<char>(0x80 | ((codepoint >> 6) & 0x3f)));
|
out.append(1, static_cast<char>(0x80 | ((codepoint >> 6) & 0x3f)));
|
||||||
out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
|
out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
out.append(1, static_cast<char>(0xf0 | ((codepoint >> 18) & 0x07)));
|
out.append(1, static_cast<char>(0xf0 | ((codepoint >> 18) & 0x07)));
|
||||||
out.append(1, static_cast<char>(0x80 | ((codepoint >> 12) & 0x3f)));
|
out.append(1, static_cast<char>(0x80 | ((codepoint >> 12) & 0x3f)));
|
||||||
out.append(1, static_cast<char>(0x80 | ((codepoint >> 6) & 0x3f)));
|
out.append(1, static_cast<char>(0x80 | ((codepoint >> 6) & 0x3f)));
|
||||||
out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
|
out.append(1, static_cast<char>(0x80 | (codepoint & 0x3f)));
|
||||||
}
|
}
|
||||||
codepoint = 0;
|
codepoint = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::wstring UTF8to16(const char * in)
|
std::wstring UTF8to16(const char * in)
|
||||||
{
|
{
|
||||||
std::wstring out;
|
std::wstring out;
|
||||||
unsigned int codepoint = 0;
|
unsigned int codepoint = 0;
|
||||||
int following = 0;
|
int following = 0;
|
||||||
for ( ; in && *in != 0; ++in )
|
for ( ; in && *in != 0; ++in )
|
||||||
{
|
{
|
||||||
unsigned char ch = *in;
|
unsigned char ch = *in;
|
||||||
if (ch <= 0x7f)
|
if (ch <= 0x7f)
|
||||||
{
|
{
|
||||||
codepoint = ch;
|
codepoint = ch;
|
||||||
following = 0;
|
following = 0;
|
||||||
}
|
}
|
||||||
else if (ch <= 0xbf)
|
else if (ch <= 0xbf)
|
||||||
{
|
{
|
||||||
if (following > 0)
|
if (following > 0)
|
||||||
{
|
{
|
||||||
codepoint = (codepoint << 6) | (ch & 0x3f);
|
codepoint = (codepoint << 6) | (ch & 0x3f);
|
||||||
--following;
|
--following;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (ch <= 0xdf)
|
else if (ch <= 0xdf)
|
||||||
{
|
{
|
||||||
codepoint = ch & 0x1f;
|
codepoint = ch & 0x1f;
|
||||||
following = 1;
|
following = 1;
|
||||||
}
|
}
|
||||||
else if (ch <= 0xef)
|
else if (ch <= 0xef)
|
||||||
{
|
{
|
||||||
codepoint = ch & 0x0f;
|
codepoint = ch & 0x0f;
|
||||||
following = 2;
|
following = 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
codepoint = ch & 0x07;
|
codepoint = ch & 0x07;
|
||||||
following = 3;
|
following = 3;
|
||||||
}
|
}
|
||||||
if (following == 0)
|
if (following == 0)
|
||||||
{
|
{
|
||||||
if (codepoint > 0xffff)
|
if (codepoint > 0xffff)
|
||||||
{
|
{
|
||||||
out.append(1, static_cast<wchar_t>(0xd800 + (codepoint >> 10)));
|
out.append(1, static_cast<wchar_t>(0xd800 + (codepoint >> 10)));
|
||||||
out.append(1, static_cast<wchar_t>(0xdc00 + (codepoint & 0x03ff)));
|
out.append(1, static_cast<wchar_t>(0xdc00 + (codepoint & 0x03ff)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
out.append(1, static_cast<wchar_t>(codepoint));
|
out.append(1, static_cast<wchar_t>(codepoint));
|
||||||
codepoint = 0;
|
codepoint = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource )
|
void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource )
|
||||||
{
|
{
|
||||||
strncpy( pchBuffer, pchSource, unBufferSizeBytes - 1 );
|
strncpy( pchBuffer, pchSource, unBufferSizeBytes - 1 );
|
||||||
pchBuffer[unBufferSizeBytes - 1] = '\0';
|
pchBuffer[unBufferSizeBytes - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
// Purpose: converts a string to upper case
|
// Purpose: converts a string to upper case
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
std::string StringToUpper( const std::string & sString )
|
std::string StringToUpper( const std::string & sString )
|
||||||
{
|
{
|
||||||
std::string sOut;
|
std::string sOut;
|
||||||
sOut.reserve( sString.size() + 1 );
|
sOut.reserve( sString.size() + 1 );
|
||||||
for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
|
for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
|
||||||
{
|
{
|
||||||
sOut.push_back( (char)toupper( *i ) );
|
sOut.push_back( (char)toupper( *i ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return sOut;
|
return sOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
// Purpose: converts a string to lower case
|
// Purpose: converts a string to lower case
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
std::string StringToLower( const std::string & sString )
|
std::string StringToLower( const std::string & sString )
|
||||||
{
|
{
|
||||||
std::string sOut;
|
std::string sOut;
|
||||||
sOut.reserve( sString.size() + 1 );
|
sOut.reserve( sString.size() + 1 );
|
||||||
for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
|
for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
|
||||||
{
|
{
|
||||||
sOut.push_back( (char)tolower( *i ) );
|
sOut.push_back( (char)tolower( *i ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
return sOut;
|
return sOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen )
|
uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen )
|
||||||
{
|
{
|
||||||
uint32_t unLen = (uint32_t)sValue.length() + 1;
|
uint32_t unLen = (uint32_t)sValue.length() + 1;
|
||||||
if( !pchBuffer || !unBufferLen )
|
if( !pchBuffer || !unBufferLen )
|
||||||
return unLen;
|
return unLen;
|
||||||
|
|
||||||
if( unBufferLen < unLen )
|
if( unBufferLen < unLen )
|
||||||
{
|
{
|
||||||
pchBuffer[0] = '\0';
|
pchBuffer[0] = '\0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
memcpy( pchBuffer, sValue.c_str(), unLen );
|
memcpy( pchBuffer, sValue.c_str(), unLen );
|
||||||
}
|
}
|
||||||
|
|
||||||
return unLen;
|
return unLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Returns a std::string from a uint64_t */
|
/** Returns a std::string from a uint64_t */
|
||||||
// std::string Uint64ToString( uint64_t ulValue )
|
// std::string Uint64ToString( uint64_t ulValue )
|
||||||
// {
|
// {
|
||||||
// char buf[ 22 ];
|
// char buf[ 22 ];
|
||||||
// #if defined( _WIN32 )
|
// #if defined( _WIN32 )
|
||||||
// sprintf_s( buf, "%llu", ulValue );
|
// sprintf_s( buf, "%llu", ulValue );
|
||||||
// #else
|
// #else
|
||||||
// snprintf( buf, sizeof( buf ), "%llu", (long long unsigned int ) ulValue );
|
// snprintf( buf, sizeof( buf ), "%llu", (long long unsigned int ) ulValue );
|
||||||
// #endif
|
// #endif
|
||||||
// return buf;
|
// return buf;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
/** returns a uint64_t from a string */
|
/** returns a uint64_t from a string */
|
||||||
uint64_t StringToUint64( const std::string & sValue )
|
uint64_t StringToUint64( const std::string & sValue )
|
||||||
{
|
{
|
||||||
return strtoull( sValue.c_str(), NULL, 0 );
|
return strtoull( sValue.c_str(), NULL, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Helper for converting a numeric value to a hex digit, value should be 0-15.
|
// Purpose: Helper for converting a numeric value to a hex digit, value should be 0-15.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
char cIntToHexDigit( int nValue )
|
char cIntToHexDigit( int nValue )
|
||||||
{
|
{
|
||||||
//Assert( nValue >= 0 && nValue <= 15 );
|
//Assert( nValue >= 0 && nValue <= 15 );
|
||||||
return "0123456789ABCDEF"[ nValue & 15 ];
|
return "0123456789ABCDEF"[ nValue & 15 ];
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Helper for converting a hex char value to numeric, return -1 if the char
|
// Purpose: Helper for converting a hex char value to numeric, return -1 if the char
|
||||||
// is not a valid hex digit.
|
// is not a valid hex digit.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
int iHexCharToInt( char cValue )
|
int iHexCharToInt( char cValue )
|
||||||
{
|
{
|
||||||
int32_t iValue = cValue;
|
int32_t iValue = cValue;
|
||||||
if ( (uint32_t)( iValue - '0' ) < 10 )
|
if ( (uint32_t)( iValue - '0' ) < 10 )
|
||||||
return iValue - '0';
|
return iValue - '0';
|
||||||
|
|
||||||
iValue |= 0x20;
|
iValue |= 0x20;
|
||||||
if ( (uint32_t)( iValue - 'a' ) < 6 )
|
if ( (uint32_t)( iValue - 'a' ) < 6 )
|
||||||
return iValue - 'a' + 10;
|
return iValue - 'a' + 10;
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Internal implementation of encode, works in the strict RFC manner, or
|
// Purpose: Internal implementation of encode, works in the strict RFC manner, or
|
||||||
// with spaces turned to + like HTML form encoding.
|
// with spaces turned to + like HTML form encoding.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void V_URLEncodeInternal( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen, bool bUsePlusForSpace )
|
void V_URLEncodeInternal( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen, bool bUsePlusForSpace )
|
||||||
{
|
{
|
||||||
//AssertMsg( nDestLen > 3*nSourceLen, "Target buffer for V_URLEncode should be 3x source length, plus one for terminating null\n" );
|
//AssertMsg( nDestLen > 3*nSourceLen, "Target buffer for V_URLEncode should be 3x source length, plus one for terminating null\n" );
|
||||||
|
|
||||||
int iDestPos = 0;
|
int iDestPos = 0;
|
||||||
for ( int i=0; i < nSourceLen; ++i )
|
for ( int i=0; i < nSourceLen; ++i )
|
||||||
{
|
{
|
||||||
// worst case we need 3 additional chars
|
// worst case we need 3 additional chars
|
||||||
if( (iDestPos+3) > nDestLen )
|
if( (iDestPos+3) > nDestLen )
|
||||||
{
|
{
|
||||||
pchDest[0] = '\0';
|
pchDest[0] = '\0';
|
||||||
// AssertMsg( false, "Target buffer too short\n" );
|
// AssertMsg( false, "Target buffer too short\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We allow only a-z, A-Z, 0-9, period, underscore, and hyphen to pass through unescaped.
|
// We allow only a-z, A-Z, 0-9, period, underscore, and hyphen to pass through unescaped.
|
||||||
// These are the characters allowed by both the original RFC 1738 and the latest RFC 3986.
|
// These are the characters allowed by both the original RFC 1738 and the latest RFC 3986.
|
||||||
// Current specs also allow '~', but that is forbidden under original RFC 1738.
|
// Current specs also allow '~', but that is forbidden under original RFC 1738.
|
||||||
if ( !( pchSource[i] >= 'a' && pchSource[i] <= 'z' ) && !( pchSource[i] >= 'A' && pchSource[i] <= 'Z' ) && !(pchSource[i] >= '0' && pchSource[i] <= '9' )
|
if ( !( pchSource[i] >= 'a' && pchSource[i] <= 'z' ) && !( pchSource[i] >= 'A' && pchSource[i] <= 'Z' ) && !(pchSource[i] >= '0' && pchSource[i] <= '9' )
|
||||||
&& pchSource[i] != '-' && pchSource[i] != '_' && pchSource[i] != '.'
|
&& pchSource[i] != '-' && pchSource[i] != '_' && pchSource[i] != '.'
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ( bUsePlusForSpace && pchSource[i] == ' ' )
|
if ( bUsePlusForSpace && pchSource[i] == ' ' )
|
||||||
{
|
{
|
||||||
pchDest[iDestPos++] = '+';
|
pchDest[iDestPos++] = '+';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pchDest[iDestPos++] = '%';
|
pchDest[iDestPos++] = '%';
|
||||||
uint8_t iValue = pchSource[i];
|
uint8_t iValue = pchSource[i];
|
||||||
if ( iValue == 0 )
|
if ( iValue == 0 )
|
||||||
{
|
{
|
||||||
pchDest[iDestPos++] = '0';
|
pchDest[iDestPos++] = '0';
|
||||||
pchDest[iDestPos++] = '0';
|
pchDest[iDestPos++] = '0';
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char cHexDigit1 = cIntToHexDigit( iValue % 16 );
|
char cHexDigit1 = cIntToHexDigit( iValue % 16 );
|
||||||
iValue /= 16;
|
iValue /= 16;
|
||||||
char cHexDigit2 = cIntToHexDigit( iValue );
|
char cHexDigit2 = cIntToHexDigit( iValue );
|
||||||
pchDest[iDestPos++] = cHexDigit2;
|
pchDest[iDestPos++] = cHexDigit2;
|
||||||
pchDest[iDestPos++] = cHexDigit1;
|
pchDest[iDestPos++] = cHexDigit1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pchDest[iDestPos++] = pchSource[i];
|
pchDest[iDestPos++] = pchSource[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (iDestPos+1) > nDestLen )
|
if( (iDestPos+1) > nDestLen )
|
||||||
{
|
{
|
||||||
pchDest[0] = '\0';
|
pchDest[0] = '\0';
|
||||||
//AssertMsg( false, "Target buffer too short to terminate\n" );
|
//AssertMsg( false, "Target buffer too short to terminate\n" );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Null terminate
|
// Null terminate
|
||||||
pchDest[iDestPos++] = 0;
|
pchDest[iDestPos++] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Internal implementation of decode, works in the strict RFC manner, or
|
// Purpose: Internal implementation of decode, works in the strict RFC manner, or
|
||||||
// with spaces turned to + like HTML form encoding.
|
// with spaces turned to + like HTML form encoding.
|
||||||
//
|
//
|
||||||
// Returns the amount of space used in the output buffer.
|
// Returns the amount of space used in the output buffer.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
size_t V_URLDecodeInternal( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen, bool bUsePlusForSpace )
|
size_t V_URLDecodeInternal( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen, bool bUsePlusForSpace )
|
||||||
{
|
{
|
||||||
if ( nDecodeDestLen < nEncodedSourceLen )
|
if ( nDecodeDestLen < nEncodedSourceLen )
|
||||||
{
|
{
|
||||||
//AssertMsg( false, "V_URLDecode needs a dest buffer at least as large as the source" );
|
//AssertMsg( false, "V_URLDecode needs a dest buffer at least as large as the source" );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iDestPos = 0;
|
int iDestPos = 0;
|
||||||
for( int i=0; i < nEncodedSourceLen; ++i )
|
for( int i=0; i < nEncodedSourceLen; ++i )
|
||||||
{
|
{
|
||||||
if ( bUsePlusForSpace && pchEncodedSource[i] == '+' )
|
if ( bUsePlusForSpace && pchEncodedSource[i] == '+' )
|
||||||
{
|
{
|
||||||
pchDecodeDest[ iDestPos++ ] = ' ';
|
pchDecodeDest[ iDestPos++ ] = ' ';
|
||||||
}
|
}
|
||||||
else if ( pchEncodedSource[i] == '%' )
|
else if ( pchEncodedSource[i] == '%' )
|
||||||
{
|
{
|
||||||
// Percent signifies an encoded value, look ahead for the hex code, convert to numeric, and use that
|
// Percent signifies an encoded value, look ahead for the hex code, convert to numeric, and use that
|
||||||
|
|
||||||
// First make sure we have 2 more chars
|
// First make sure we have 2 more chars
|
||||||
if ( i < nEncodedSourceLen - 2 )
|
if ( i < nEncodedSourceLen - 2 )
|
||||||
{
|
{
|
||||||
char cHexDigit1 = pchEncodedSource[i+1];
|
char cHexDigit1 = pchEncodedSource[i+1];
|
||||||
char cHexDigit2 = pchEncodedSource[i+2];
|
char cHexDigit2 = pchEncodedSource[i+2];
|
||||||
|
|
||||||
// Turn the chars into a hex value, if they are not valid, then we'll
|
// Turn the chars into a hex value, if they are not valid, then we'll
|
||||||
// just place the % and the following two chars direct into the string,
|
// just place the % and the following two chars direct into the string,
|
||||||
// even though this really shouldn't happen, who knows what bad clients
|
// even though this really shouldn't happen, who knows what bad clients
|
||||||
// may do with encoding.
|
// may do with encoding.
|
||||||
bool bValid = false;
|
bool bValid = false;
|
||||||
int iValue = iHexCharToInt( cHexDigit1 );
|
int iValue = iHexCharToInt( cHexDigit1 );
|
||||||
if ( iValue != -1 )
|
if ( iValue != -1 )
|
||||||
{
|
{
|
||||||
iValue *= 16;
|
iValue *= 16;
|
||||||
int iValue2 = iHexCharToInt( cHexDigit2 );
|
int iValue2 = iHexCharToInt( cHexDigit2 );
|
||||||
if ( iValue2 != -1 )
|
if ( iValue2 != -1 )
|
||||||
{
|
{
|
||||||
iValue += iValue2;
|
iValue += iValue2;
|
||||||
pchDecodeDest[ iDestPos++ ] = (char)iValue;
|
pchDecodeDest[ iDestPos++ ] = (char)iValue;
|
||||||
bValid = true;
|
bValid = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !bValid )
|
if ( !bValid )
|
||||||
{
|
{
|
||||||
pchDecodeDest[ iDestPos++ ] = '%';
|
pchDecodeDest[ iDestPos++ ] = '%';
|
||||||
pchDecodeDest[ iDestPos++ ] = cHexDigit1;
|
pchDecodeDest[ iDestPos++ ] = cHexDigit1;
|
||||||
pchDecodeDest[ iDestPos++ ] = cHexDigit2;
|
pchDecodeDest[ iDestPos++ ] = cHexDigit2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip ahead
|
// Skip ahead
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pchDecodeDest[ iDestPos++ ] = pchEncodedSource[i];
|
pchDecodeDest[ iDestPos++ ] = pchEncodedSource[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We may not have extra room to NULL terminate, since this can be used on raw data, but if we do
|
// We may not have extra room to NULL terminate, since this can be used on raw data, but if we do
|
||||||
// go ahead and do it as this can avoid bugs.
|
// go ahead and do it as this can avoid bugs.
|
||||||
if ( iDestPos < nDecodeDestLen )
|
if ( iDestPos < nDecodeDestLen )
|
||||||
{
|
{
|
||||||
pchDecodeDest[iDestPos] = 0;
|
pchDecodeDest[iDestPos] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (size_t)iDestPos;
|
return (size_t)iDestPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Encodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
// Purpose: Encodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
||||||
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
||||||
// the standard in HTML form encoding, despite it not being part of the RFC.
|
// the standard in HTML form encoding, despite it not being part of the RFC.
|
||||||
//
|
//
|
||||||
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen )
|
void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen )
|
||||||
{
|
{
|
||||||
return V_URLEncodeInternal( pchDest, nDestLen, pchSource, nSourceLen, true );
|
return V_URLEncodeInternal( pchDest, nDestLen, pchSource, nSourceLen, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Decodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
// Purpose: Decodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
||||||
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
||||||
// the standard in HTML form encoding, despite it not being part of the RFC.
|
// the standard in HTML form encoding, despite it not being part of the RFC.
|
||||||
//
|
//
|
||||||
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
||||||
// Dest buffer being the same as the source buffer (decode in-place) is explicitly allowed.
|
// Dest buffer being the same as the source buffer (decode in-place) is explicitly allowed.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen )
|
size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen )
|
||||||
{
|
{
|
||||||
return V_URLDecodeInternal( pchDecodeDest, nDecodeDestLen, pchEncodedSource, nEncodedSourceLen, true );
|
return V_URLDecodeInternal( pchDecodeDest, nDecodeDestLen, pchEncodedSource, nEncodedSourceLen, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void V_StripExtension( std::string &in )
|
void V_StripExtension( std::string &in )
|
||||||
{
|
{
|
||||||
// Find the last dot. If it's followed by a dot or a slash, then it's part of a
|
// Find the last dot. If it's followed by a dot or a slash, then it's part of a
|
||||||
// directory specifier like ../../somedir/./blah.
|
// directory specifier like ../../somedir/./blah.
|
||||||
std::string::size_type test = in.rfind( '.' );
|
std::string::size_type test = in.rfind( '.' );
|
||||||
if ( test != std::string::npos )
|
if ( test != std::string::npos )
|
||||||
{
|
{
|
||||||
// This handles things like ".\blah" or "c:\my@email.com\abc\def\geh"
|
// This handles things like ".\blah" or "c:\my@email.com\abc\def\geh"
|
||||||
// Which would otherwise wind up with "" and "c:\my@email", respectively.
|
// Which would otherwise wind up with "" and "c:\my@email", respectively.
|
||||||
if ( in.rfind( '\\' ) < test && in.rfind( '/' ) < test )
|
if ( in.rfind( '\\' ) < test && in.rfind( '/' ) < test )
|
||||||
{
|
{
|
||||||
in.resize( test );
|
in.resize( test );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Tokenizes a string into a vector of strings
|
// Purpose: Tokenizes a string into a vector of strings
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
std::vector<std::string> TokenizeString( const std::string & sString, char cToken )
|
std::vector<std::string> TokenizeString( const std::string & sString, char cToken )
|
||||||
{
|
{
|
||||||
std::vector<std::string> vecStrings;
|
std::vector<std::string> vecStrings;
|
||||||
std::istringstream stream( sString );
|
std::istringstream stream( sString );
|
||||||
std::string s;
|
std::string s;
|
||||||
while ( std::getline( stream, s, cToken ) )
|
while ( std::getline( stream, s, cToken ) )
|
||||||
{
|
{
|
||||||
vecStrings.push_back( s );
|
vecStrings.push_back( s );
|
||||||
}
|
}
|
||||||
return vecStrings;
|
return vecStrings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,132 +1,132 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
/** returns true if the string has the prefix */
|
/** returns true if the string has the prefix */
|
||||||
bool StringHasPrefix( const std::string & sString, const std::string & sPrefix );
|
bool StringHasPrefix( const std::string & sString, const std::string & sPrefix );
|
||||||
bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix );
|
bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix );
|
||||||
|
|
||||||
/** returns if the string has the suffix */
|
/** returns if the string has the suffix */
|
||||||
bool StringHasSuffix( const std::string &sString, const std::string &sSuffix );
|
bool StringHasSuffix( const std::string &sString, const std::string &sSuffix );
|
||||||
bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix );
|
bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix );
|
||||||
|
|
||||||
/** converts a UTF-16 string to a UTF-8 string */
|
/** converts a UTF-16 string to a UTF-8 string */
|
||||||
std::string UTF16to8(const wchar_t * in);
|
std::string UTF16to8(const wchar_t * in);
|
||||||
|
|
||||||
/** converts a UTF-8 string to a UTF-16 string */
|
/** converts a UTF-8 string to a UTF-16 string */
|
||||||
std::wstring UTF8to16(const char * in);
|
std::wstring UTF8to16(const char * in);
|
||||||
#define Utf16FromUtf8 UTF8to16
|
#define Utf16FromUtf8 UTF8to16
|
||||||
|
|
||||||
/** safely copy a string into a buffer */
|
/** safely copy a string into a buffer */
|
||||||
void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource );
|
void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource );
|
||||||
template< size_t bufferSize >
|
template< size_t bufferSize >
|
||||||
void strcpy_safe( char (& buffer) [ bufferSize ], const char *pchSource )
|
void strcpy_safe( char (& buffer) [ bufferSize ], const char *pchSource )
|
||||||
{
|
{
|
||||||
strcpy_safe( buffer, bufferSize, pchSource );
|
strcpy_safe( buffer, bufferSize, pchSource );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** converts a string to upper case */
|
/** converts a string to upper case */
|
||||||
std::string StringToUpper( const std::string & sString );
|
std::string StringToUpper( const std::string & sString );
|
||||||
|
|
||||||
/** converts a string to lower case */
|
/** converts a string to lower case */
|
||||||
std::string StringToLower( const std::string & sString );
|
std::string StringToLower( const std::string & sString );
|
||||||
|
|
||||||
// we stricmp (from WIN) but it isn't POSIX - OSX/LINUX have strcasecmp so just inline bridge to it
|
// we stricmp (from WIN) but it isn't POSIX - OSX/LINUX have strcasecmp so just inline bridge to it
|
||||||
#if defined( OSX ) || defined( LINUX )
|
#if defined( OSX ) || defined( LINUX )
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
inline int stricmp(const char *pStr1, const char *pStr2) { return strcasecmp(pStr1,pStr2); }
|
inline int stricmp(const char *pStr1, const char *pStr2) { return strcasecmp(pStr1,pStr2); }
|
||||||
#ifndef _stricmp
|
#ifndef _stricmp
|
||||||
#define _stricmp stricmp
|
#define _stricmp stricmp
|
||||||
#endif
|
#endif
|
||||||
inline int strnicmp( const char *pStr1, const char *pStr2, size_t unBufferLen ) { return strncasecmp( pStr1,pStr2, unBufferLen ); }
|
inline int strnicmp( const char *pStr1, const char *pStr2, size_t unBufferLen ) { return strncasecmp( pStr1,pStr2, unBufferLen ); }
|
||||||
#ifndef _strnicmp
|
#ifndef _strnicmp
|
||||||
#define _strnicmp strnicmp
|
#define _strnicmp strnicmp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _vsnprintf_s
|
#ifndef _vsnprintf_s
|
||||||
#define _vsnprintf_s vsnprintf
|
#define _vsnprintf_s vsnprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define _TRUNCATE ((size_t)-1)
|
#define _TRUNCATE ((size_t)-1)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( OSX )
|
#if defined( OSX )
|
||||||
// behaviors ensure NULL-termination at least as well as _TRUNCATE does, but
|
// behaviors ensure NULL-termination at least as well as _TRUNCATE does, but
|
||||||
// wcsncpy_s/strncpy_s can non-NULL-terminate, wcslcpy/strlcpy can not.
|
// wcsncpy_s/strncpy_s can non-NULL-terminate, wcslcpy/strlcpy can not.
|
||||||
// inline errno_t wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
|
// inline errno_t wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
|
||||||
// {
|
// {
|
||||||
// return wcslcpy(strDest, strSource, numberOfElements);
|
// return wcslcpy(strDest, strSource, numberOfElements);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// inline errno_t strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
|
// inline errno_t strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
|
||||||
// {
|
// {
|
||||||
// return strlcpy(strDest, strSource, numberOfElements);
|
// return strlcpy(strDest, strSource, numberOfElements);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( LINUX )
|
#if defined( LINUX )
|
||||||
// this implementation does not return whether or not the destination was
|
// this implementation does not return whether or not the destination was
|
||||||
// truncated, but that is straightforward to fix if anybody actually needs the
|
// truncated, but that is straightforward to fix if anybody actually needs the
|
||||||
// return code.
|
// return code.
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
inline void wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
|
inline void wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
|
||||||
{
|
{
|
||||||
wcsncpy(strDest, strSource, numberOfElements);
|
wcsncpy(strDest, strSource, numberOfElements);
|
||||||
strDest[numberOfElements-1] = '\0';
|
strDest[numberOfElements-1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
|
inline void strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
|
||||||
{
|
{
|
||||||
strncpy(strDest, strSource, numberOfElements);
|
strncpy(strDest, strSource, numberOfElements);
|
||||||
strDest[numberOfElements-1] = '\0';
|
strDest[numberOfElements-1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined( _WIN32 ) && _MSC_VER < 1800
|
#if defined( _WIN32 ) && _MSC_VER < 1800
|
||||||
inline uint64_t strtoull(const char *str, char **endptr, int base) { return _strtoui64( str, endptr, base ); }
|
inline uint64_t strtoull(const char *str, char **endptr, int base) { return _strtoui64( str, endptr, base ); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Handles copying a std::string into a buffer as would be provided in an API */
|
/* Handles copying a std::string into a buffer as would be provided in an API */
|
||||||
uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen );
|
uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen );
|
||||||
|
|
||||||
/** Returns a std::string from a uint64_t */
|
/** Returns a std::string from a uint64_t */
|
||||||
//std::string Uint64ToString( uint64_t ulValue );
|
//std::string Uint64ToString( uint64_t ulValue );
|
||||||
|
|
||||||
/** returns a uint64_t from a string */
|
/** returns a uint64_t from a string */
|
||||||
uint64_t StringToUint64( const std::string & sValue );
|
uint64_t StringToUint64( const std::string & sValue );
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Encodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
// Purpose: Encodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
||||||
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
||||||
// the standard in HTML form encoding, despite it not being part of the RFC.
|
// the standard in HTML form encoding, despite it not being part of the RFC.
|
||||||
//
|
//
|
||||||
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen );
|
void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen );
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Decodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
// Purpose: Decodes a string (or binary data) from URL encoding format, see rfc1738 section 2.2.
|
||||||
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
// This version of the call isn't a strict RFC implementation, but uses + for space as is
|
||||||
// the standard in HTML form encoding, despite it not being part of the RFC.
|
// the standard in HTML form encoding, despite it not being part of the RFC.
|
||||||
//
|
//
|
||||||
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
// Dest buffer should be at least as large as source buffer to guarantee room for decode.
|
||||||
// Dest buffer being the same as the source buffer (decode in-place) is explicitly allowed.
|
// Dest buffer being the same as the source buffer (decode in-place) is explicitly allowed.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen );
|
size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen );
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: strip extension from a path
|
// Purpose: strip extension from a path
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void V_StripExtension( std::string &in );
|
void V_StripExtension( std::string &in );
|
||||||
|
|
||||||
|
|
||||||
/** Tokenizes a string into a vector of strings */
|
/** Tokenizes a string into a vector of strings */
|
||||||
std::vector<std::string> TokenizeString( const std::string & sString, char cToken );
|
std::vector<std::string> TokenizeString( const std::string & sString, char cToken );
|
||||||
|
|
|
@ -1,413 +1,413 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
|
|
||||||
#include "vrpathregistry_public.h"
|
#include "vrpathregistry_public.h"
|
||||||
#include "json/json.h"
|
#include "json/json.h"
|
||||||
#include "pathtools_public.h"
|
#include "pathtools_public.h"
|
||||||
#include "envvartools_public.h"
|
#include "envvartools_public.h"
|
||||||
#include "strtools_public.h"
|
#include "strtools_public.h"
|
||||||
#include "dirtools_public.h"
|
#include "dirtools_public.h"
|
||||||
|
|
||||||
#if defined( WIN32 )
|
#if defined( WIN32 )
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
|
|
||||||
#undef GetEnvironmentVariable
|
#undef GetEnvironmentVariable
|
||||||
#elif defined OSX
|
#elif defined OSX
|
||||||
#include <Foundation/Foundation.h>
|
#include <Foundation/Foundation.h>
|
||||||
#include <AppKit/AppKit.h>
|
#include <AppKit/AppKit.h>
|
||||||
#elif defined(LINUX)
|
#elif defined(LINUX)
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#ifndef VRLog
|
#ifndef VRLog
|
||||||
#if defined( __MINGW32__ )
|
#if defined( __MINGW32__ )
|
||||||
#define VRLog(args...) fprintf(stderr, args)
|
#define VRLog(args...) fprintf(stderr, args)
|
||||||
#elif defined( WIN32 )
|
#elif defined( WIN32 )
|
||||||
#define VRLog(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
|
#define VRLog(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define VRLog(args...) fprintf(stderr, args)
|
#define VRLog(args...) fprintf(stderr, args)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Returns the root of the directory the system wants us to store user config data in */
|
/** Returns the root of the directory the system wants us to store user config data in */
|
||||||
static std::string GetAppSettingsPath()
|
static std::string GetAppSettingsPath()
|
||||||
{
|
{
|
||||||
#if defined( WIN32 )
|
#if defined( WIN32 )
|
||||||
WCHAR rwchPath[MAX_PATH];
|
WCHAR rwchPath[MAX_PATH];
|
||||||
|
|
||||||
if( !SUCCEEDED( SHGetFolderPathW( NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, rwchPath ) ) )
|
if( !SUCCEEDED( SHGetFolderPathW( NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, rwchPath ) ) )
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert the path to UTF-8 and store in the output
|
// Convert the path to UTF-8 and store in the output
|
||||||
std::string sUserPath = UTF16to8( rwchPath );
|
std::string sUserPath = UTF16to8( rwchPath );
|
||||||
|
|
||||||
return sUserPath;
|
return sUserPath;
|
||||||
#elif defined( OSX )
|
#elif defined( OSX )
|
||||||
std::string sSettingsDir;
|
std::string sSettingsDir;
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
// Search for the path
|
// Search for the path
|
||||||
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, YES );
|
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, YES );
|
||||||
if ( [paths count] == 0 )
|
if ( [paths count] == 0 )
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
NSString *resolvedPath = [paths objectAtIndex:0];
|
NSString *resolvedPath = [paths objectAtIndex:0];
|
||||||
resolvedPath = [resolvedPath stringByAppendingPathComponent: @"OpenVR"];
|
resolvedPath = [resolvedPath stringByAppendingPathComponent: @"OpenVR"];
|
||||||
|
|
||||||
if ( ![[NSFileManager defaultManager] createDirectoryAtPath: resolvedPath withIntermediateDirectories:YES attributes:nil error:nil] )
|
if ( ![[NSFileManager defaultManager] createDirectoryAtPath: resolvedPath withIntermediateDirectories:YES attributes:nil error:nil] )
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
sSettingsDir.assign( [resolvedPath UTF8String] );
|
sSettingsDir.assign( [resolvedPath UTF8String] );
|
||||||
}
|
}
|
||||||
return sSettingsDir;
|
return sSettingsDir;
|
||||||
#elif defined( LINUX )
|
#elif defined( LINUX )
|
||||||
|
|
||||||
// As defined by XDG Base Directory Specification
|
// As defined by XDG Base Directory Specification
|
||||||
// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
||||||
|
|
||||||
const char *pchHome = getenv("XDG_CONFIG_HOME");
|
const char *pchHome = getenv("XDG_CONFIG_HOME");
|
||||||
if ( ( pchHome != NULL) && ( pchHome[0] != '\0' ) )
|
if ( ( pchHome != NULL) && ( pchHome[0] != '\0' ) )
|
||||||
{
|
{
|
||||||
return pchHome;
|
return pchHome;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// XDG_CONFIG_HOME is not defined, use ~/.config instead
|
// XDG_CONFIG_HOME is not defined, use ~/.config instead
|
||||||
//
|
//
|
||||||
pchHome = getenv( "HOME" );
|
pchHome = getenv( "HOME" );
|
||||||
if ( pchHome == NULL )
|
if ( pchHome == NULL )
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sUserPath( pchHome );
|
std::string sUserPath( pchHome );
|
||||||
sUserPath = Path_Join( sUserPath, ".config" );
|
sUserPath = Path_Join( sUserPath, ".config" );
|
||||||
return sUserPath;
|
return sUserPath;
|
||||||
#else
|
#else
|
||||||
#warning "Unsupported platform"
|
#warning "Unsupported platform"
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Constructor
|
// Purpose: Constructor
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
CVRPathRegistry_Public::CVRPathRegistry_Public()
|
CVRPathRegistry_Public::CVRPathRegistry_Public()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Computes the registry filename
|
// Purpose: Computes the registry filename
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
std::string CVRPathRegistry_Public::GetOpenVRConfigPath()
|
std::string CVRPathRegistry_Public::GetOpenVRConfigPath()
|
||||||
{
|
{
|
||||||
std::string sConfigPath = GetAppSettingsPath();
|
std::string sConfigPath = GetAppSettingsPath();
|
||||||
if( sConfigPath.empty() )
|
if( sConfigPath.empty() )
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
#if defined( _WIN32 ) || defined( LINUX )
|
#if defined( _WIN32 ) || defined( LINUX )
|
||||||
sConfigPath = Path_Join( sConfigPath, "openvr" );
|
sConfigPath = Path_Join( sConfigPath, "openvr" );
|
||||||
#elif defined ( OSX )
|
#elif defined ( OSX )
|
||||||
sConfigPath = Path_Join( sConfigPath, ".openvr" );
|
sConfigPath = Path_Join( sConfigPath, ".openvr" );
|
||||||
#else
|
#else
|
||||||
#warning "Unsupported platform"
|
#warning "Unsupported platform"
|
||||||
#endif
|
#endif
|
||||||
sConfigPath = Path_FixSlashes( sConfigPath );
|
sConfigPath = Path_FixSlashes( sConfigPath );
|
||||||
return sConfigPath;
|
return sConfigPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
std::string CVRPathRegistry_Public::GetVRPathRegistryFilename()
|
std::string CVRPathRegistry_Public::GetVRPathRegistryFilename()
|
||||||
{
|
{
|
||||||
std::string sPath = GetOpenVRConfigPath();
|
std::string sPath = GetOpenVRConfigPath();
|
||||||
if ( sPath.empty() )
|
if ( sPath.empty() )
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
#if defined( _WIN32 )
|
#if defined( _WIN32 )
|
||||||
sPath = Path_Join( sPath, "openvrpaths.vrpath" );
|
sPath = Path_Join( sPath, "openvrpaths.vrpath" );
|
||||||
#elif defined ( POSIX )
|
#elif defined ( POSIX )
|
||||||
sPath = Path_Join( sPath, "openvrpaths.vrpath" );
|
sPath = Path_Join( sPath, "openvrpaths.vrpath" );
|
||||||
#else
|
#else
|
||||||
#error "Unsupported platform"
|
#error "Unsupported platform"
|
||||||
#endif
|
#endif
|
||||||
sPath = Path_FixSlashes( sPath );
|
sPath = Path_FixSlashes( sPath );
|
||||||
return sPath;
|
return sPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Converts JSON to a history array
|
// Purpose: Converts JSON to a history array
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
static void ParseStringListFromJson( std::vector< std::string > *pvecHistory, const Json::Value & root, const char *pchArrayName )
|
static void ParseStringListFromJson( std::vector< std::string > *pvecHistory, const Json::Value & root, const char *pchArrayName )
|
||||||
{
|
{
|
||||||
if( !root.isMember( pchArrayName ) )
|
if( !root.isMember( pchArrayName ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const Json::Value & arrayNode = root[ pchArrayName ];
|
const Json::Value & arrayNode = root[ pchArrayName ];
|
||||||
if( !arrayNode )
|
if( !arrayNode )
|
||||||
{
|
{
|
||||||
VRLog( "VR Path Registry node %s is not an array\n", pchArrayName );
|
VRLog( "VR Path Registry node %s is not an array\n", pchArrayName );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pvecHistory->clear();
|
pvecHistory->clear();
|
||||||
pvecHistory->reserve( arrayNode.size() );
|
pvecHistory->reserve( arrayNode.size() );
|
||||||
for( uint32_t unIndex = 0; unIndex < arrayNode.size(); unIndex++ )
|
for( uint32_t unIndex = 0; unIndex < arrayNode.size(); unIndex++ )
|
||||||
{
|
{
|
||||||
std::string sPath( arrayNode[ unIndex ].asString() );
|
std::string sPath( arrayNode[ unIndex ].asString() );
|
||||||
pvecHistory->push_back( sPath );
|
pvecHistory->push_back( sPath );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Converts a history array to JSON
|
// Purpose: Converts a history array to JSON
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
static void StringListToJson( const std::vector< std::string > & vecHistory, Json::Value & root, const char *pchArrayName )
|
static void StringListToJson( const std::vector< std::string > & vecHistory, Json::Value & root, const char *pchArrayName )
|
||||||
{
|
{
|
||||||
Json::Value & arrayNode = root[ pchArrayName ];
|
Json::Value & arrayNode = root[ pchArrayName ];
|
||||||
for( auto i = vecHistory.begin(); i != vecHistory.end(); i++ )
|
for( auto i = vecHistory.begin(); i != vecHistory.end(); i++ )
|
||||||
{
|
{
|
||||||
arrayNode.append( *i );
|
arrayNode.append( *i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool CVRPathRegistry_Public::ToJsonString( std::string &sJsonString )
|
bool CVRPathRegistry_Public::ToJsonString( std::string &sJsonString )
|
||||||
{
|
{
|
||||||
std::string sRegPath = GetVRPathRegistryFilename();
|
std::string sRegPath = GetVRPathRegistryFilename();
|
||||||
if( sRegPath.empty() )
|
if( sRegPath.empty() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string sRegistryContents = Path_ReadTextFile( sRegPath );
|
std::string sRegistryContents = Path_ReadTextFile( sRegPath );
|
||||||
if( sRegistryContents.empty() )
|
if( sRegistryContents.empty() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
sJsonString = sRegistryContents;
|
sJsonString = sRegistryContents;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Loads the config file from its well known location
|
// Purpose: Loads the config file from its well known location
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
bool CVRPathRegistry_Public::BLoadFromFile()
|
bool CVRPathRegistry_Public::BLoadFromFile()
|
||||||
{
|
{
|
||||||
std::string sRegPath = GetVRPathRegistryFilename();
|
std::string sRegPath = GetVRPathRegistryFilename();
|
||||||
if( sRegPath.empty() )
|
if( sRegPath.empty() )
|
||||||
{
|
{
|
||||||
VRLog( "Unable to determine VR Path Registry filename\n" );
|
VRLog( "Unable to determine VR Path Registry filename\n" );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sRegistryContents = Path_ReadTextFile( sRegPath );
|
std::string sRegistryContents = Path_ReadTextFile( sRegPath );
|
||||||
if( sRegistryContents.empty() )
|
if( sRegistryContents.empty() )
|
||||||
{
|
{
|
||||||
VRLog( "Unable to read VR Path Registry from %s\n", sRegPath.c_str() );
|
VRLog( "Unable to read VR Path Registry from %s\n", sRegPath.c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Json::Value root;
|
Json::Value root;
|
||||||
Json::CharReaderBuilder builder;
|
Json::CharReaderBuilder builder;
|
||||||
std::istringstream istream(sRegistryContents);
|
std::istringstream istream(sRegistryContents);
|
||||||
std::string errors;
|
std::string errors;
|
||||||
|
|
||||||
if( !parseFromStream( builder, istream, &root, &errors ) )
|
if( !parseFromStream( builder, istream, &root, &errors ) )
|
||||||
{
|
{
|
||||||
VRLog( "Unable to parse %s: %s\n", sRegPath.c_str(), errors.c_str() );
|
VRLog( "Unable to parse %s: %s\n", sRegPath.c_str(), errors.c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ParseStringListFromJson( &m_vecRuntimePath, root, "runtime" );
|
ParseStringListFromJson( &m_vecRuntimePath, root, "runtime" );
|
||||||
ParseStringListFromJson( &m_vecConfigPath, root, "config" );
|
ParseStringListFromJson( &m_vecConfigPath, root, "config" );
|
||||||
ParseStringListFromJson( &m_vecLogPath, root, "log" );
|
ParseStringListFromJson( &m_vecLogPath, root, "log" );
|
||||||
if (root.isMember( "external_drivers" ) && root[ "external_drivers" ].isArray() )
|
if (root.isMember( "external_drivers" ) && root[ "external_drivers" ].isArray() )
|
||||||
{
|
{
|
||||||
ParseStringListFromJson( &m_vecExternalDrivers, root, "external_drivers" );
|
ParseStringListFromJson( &m_vecExternalDrivers, root, "external_drivers" );
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Saves the config file to its well known location
|
// Purpose: Saves the config file to its well known location
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
bool CVRPathRegistry_Public::BSaveToFile() const
|
bool CVRPathRegistry_Public::BSaveToFile() const
|
||||||
{
|
{
|
||||||
#if defined( DASHBOARD_BUILD_MODE )
|
#if defined( DASHBOARD_BUILD_MODE )
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
std::string sRegPath = GetVRPathRegistryFilename();
|
std::string sRegPath = GetVRPathRegistryFilename();
|
||||||
if( sRegPath.empty() )
|
if( sRegPath.empty() )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Json::Value root;
|
Json::Value root;
|
||||||
|
|
||||||
root[ "version" ] = 1;
|
root[ "version" ] = 1;
|
||||||
root[ "jsonid" ] = "vrpathreg";
|
root[ "jsonid" ] = "vrpathreg";
|
||||||
|
|
||||||
StringListToJson( m_vecRuntimePath, root, "runtime" );
|
StringListToJson( m_vecRuntimePath, root, "runtime" );
|
||||||
StringListToJson( m_vecConfigPath, root, "config" );
|
StringListToJson( m_vecConfigPath, root, "config" );
|
||||||
StringListToJson( m_vecLogPath, root, "log" );
|
StringListToJson( m_vecLogPath, root, "log" );
|
||||||
StringListToJson( m_vecExternalDrivers, root, "external_drivers" );
|
StringListToJson( m_vecExternalDrivers, root, "external_drivers" );
|
||||||
|
|
||||||
Json::StreamWriterBuilder builder;
|
Json::StreamWriterBuilder builder;
|
||||||
std::string sRegistryContents = Json::writeString( builder, root );
|
std::string sRegistryContents = Json::writeString( builder, root );
|
||||||
|
|
||||||
// make sure the directory we're writing into actually exists
|
// make sure the directory we're writing into actually exists
|
||||||
std::string sRegDirectory = Path_StripFilename( sRegPath );
|
std::string sRegDirectory = Path_StripFilename( sRegPath );
|
||||||
if( !BCreateDirectoryRecursive( sRegDirectory.c_str() ) )
|
if( !BCreateDirectoryRecursive( sRegDirectory.c_str() ) )
|
||||||
{
|
{
|
||||||
VRLog( "Unable to create path registry directory %s\n", sRegDirectory.c_str() );
|
VRLog( "Unable to create path registry directory %s\n", sRegDirectory.c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !Path_WriteStringToTextFile( sRegPath, sRegistryContents.c_str() ) )
|
if( !Path_WriteStringToTextFile( sRegPath, sRegistryContents.c_str() ) )
|
||||||
{
|
{
|
||||||
VRLog( "Unable to write VR path registry to %s\n", sRegPath.c_str() );
|
VRLog( "Unable to write VR path registry to %s\n", sRegPath.c_str() );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Returns the current runtime path or NULL if no path is configured.
|
// Purpose: Returns the current runtime path or NULL if no path is configured.
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
std::string CVRPathRegistry_Public::GetRuntimePath() const
|
std::string CVRPathRegistry_Public::GetRuntimePath() const
|
||||||
{
|
{
|
||||||
if( m_vecRuntimePath.empty() )
|
if( m_vecRuntimePath.empty() )
|
||||||
return "";
|
return "";
|
||||||
else
|
else
|
||||||
return m_vecRuntimePath.front().c_str();
|
return m_vecRuntimePath.front().c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Returns the current config path or NULL if no path is configured.
|
// Purpose: Returns the current config path or NULL if no path is configured.
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
std::string CVRPathRegistry_Public::GetConfigPath() const
|
std::string CVRPathRegistry_Public::GetConfigPath() const
|
||||||
{
|
{
|
||||||
if( m_vecConfigPath.empty() )
|
if( m_vecConfigPath.empty() )
|
||||||
return "";
|
return "";
|
||||||
else
|
else
|
||||||
return m_vecConfigPath.front().c_str();
|
return m_vecConfigPath.front().c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Returns the current log path or NULL if no path is configured.
|
// Purpose: Returns the current log path or NULL if no path is configured.
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
std::string CVRPathRegistry_Public::GetLogPath() const
|
std::string CVRPathRegistry_Public::GetLogPath() const
|
||||||
{
|
{
|
||||||
if( m_vecLogPath.empty() )
|
if( m_vecLogPath.empty() )
|
||||||
return "";
|
return "";
|
||||||
else
|
else
|
||||||
return m_vecLogPath.front().c_str();
|
return m_vecLogPath.front().c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
// Purpose: Returns paths using the path registry and the provided override
|
// Purpose: Returns paths using the path registry and the provided override
|
||||||
// values. Pass NULL for any paths you don't care about.
|
// values. Pass NULL for any paths you don't care about.
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
bool CVRPathRegistry_Public::GetPaths( std::string *psRuntimePath, std::string *psConfigPath, std::string *psLogPath, const char *pchConfigPathOverride, const char *pchLogPathOverride, std::vector<std::string> *pvecExternalDrivers )
|
bool CVRPathRegistry_Public::GetPaths( std::string *psRuntimePath, std::string *psConfigPath, std::string *psLogPath, const char *pchConfigPathOverride, const char *pchLogPathOverride, std::vector<std::string> *pvecExternalDrivers )
|
||||||
{
|
{
|
||||||
CVRPathRegistry_Public pathReg;
|
CVRPathRegistry_Public pathReg;
|
||||||
bool bLoadedRegistry = pathReg.BLoadFromFile();
|
bool bLoadedRegistry = pathReg.BLoadFromFile();
|
||||||
int nCountEnvironmentVariables = 0;
|
int nCountEnvironmentVariables = 0;
|
||||||
|
|
||||||
if( psRuntimePath )
|
if( psRuntimePath )
|
||||||
{
|
{
|
||||||
if ( GetEnvironmentVariable( k_pchRuntimeOverrideVar ).length() != 0 )
|
if ( GetEnvironmentVariable( k_pchRuntimeOverrideVar ).length() != 0 )
|
||||||
{
|
{
|
||||||
*psRuntimePath = GetEnvironmentVariable( k_pchRuntimeOverrideVar );
|
*psRuntimePath = GetEnvironmentVariable( k_pchRuntimeOverrideVar );
|
||||||
nCountEnvironmentVariables++;
|
nCountEnvironmentVariables++;
|
||||||
}
|
}
|
||||||
else if( !pathReg.GetRuntimePath().empty() )
|
else if( !pathReg.GetRuntimePath().empty() )
|
||||||
{
|
{
|
||||||
*psRuntimePath = pathReg.GetRuntimePath();
|
*psRuntimePath = pathReg.GetRuntimePath();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*psRuntimePath = "";
|
*psRuntimePath = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( psConfigPath )
|
if( psConfigPath )
|
||||||
{
|
{
|
||||||
if ( GetEnvironmentVariable( k_pchConfigOverrideVar ).length() != 0 )
|
if ( GetEnvironmentVariable( k_pchConfigOverrideVar ).length() != 0 )
|
||||||
{
|
{
|
||||||
*psConfigPath = GetEnvironmentVariable( k_pchConfigOverrideVar );
|
*psConfigPath = GetEnvironmentVariable( k_pchConfigOverrideVar );
|
||||||
nCountEnvironmentVariables++;
|
nCountEnvironmentVariables++;
|
||||||
}
|
}
|
||||||
else if( pchConfigPathOverride )
|
else if( pchConfigPathOverride )
|
||||||
{
|
{
|
||||||
*psConfigPath = pchConfigPathOverride;
|
*psConfigPath = pchConfigPathOverride;
|
||||||
}
|
}
|
||||||
else if( !pathReg.GetConfigPath().empty() )
|
else if( !pathReg.GetConfigPath().empty() )
|
||||||
{
|
{
|
||||||
*psConfigPath = pathReg.GetConfigPath();
|
*psConfigPath = pathReg.GetConfigPath();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*psConfigPath = "";
|
*psConfigPath = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( psLogPath )
|
if( psLogPath )
|
||||||
{
|
{
|
||||||
if ( GetEnvironmentVariable( k_pchLogOverrideVar ).length() != 0 )
|
if ( GetEnvironmentVariable( k_pchLogOverrideVar ).length() != 0 )
|
||||||
{
|
{
|
||||||
*psLogPath = GetEnvironmentVariable( k_pchLogOverrideVar );
|
*psLogPath = GetEnvironmentVariable( k_pchLogOverrideVar );
|
||||||
nCountEnvironmentVariables++;
|
nCountEnvironmentVariables++;
|
||||||
}
|
}
|
||||||
else if( pchLogPathOverride )
|
else if( pchLogPathOverride )
|
||||||
{
|
{
|
||||||
*psLogPath = pchLogPathOverride;
|
*psLogPath = pchLogPathOverride;
|
||||||
}
|
}
|
||||||
else if( !pathReg.GetLogPath().empty() )
|
else if( !pathReg.GetLogPath().empty() )
|
||||||
{
|
{
|
||||||
*psLogPath = pathReg.GetLogPath();
|
*psLogPath = pathReg.GetLogPath();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
*psLogPath = "";
|
*psLogPath = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( pvecExternalDrivers )
|
if ( pvecExternalDrivers )
|
||||||
{
|
{
|
||||||
*pvecExternalDrivers = pathReg.m_vecExternalDrivers;
|
*pvecExternalDrivers = pathReg.m_vecExternalDrivers;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( nCountEnvironmentVariables == 3 )
|
if ( nCountEnvironmentVariables == 3 )
|
||||||
{
|
{
|
||||||
// all three environment variables where set, so we don't need the physical file
|
// all three environment variables where set, so we don't need the physical file
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return bLoadedRegistry;
|
return bLoadedRegistry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,45 +1,45 @@
|
||||||
//========= Copyright Valve Corporation ============//
|
//========= Copyright Valve Corporation ============//
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
static const char *k_pchRuntimeOverrideVar = "VR_OVERRIDE";
|
static const char *k_pchRuntimeOverrideVar = "VR_OVERRIDE";
|
||||||
static const char *k_pchConfigOverrideVar = "VR_CONFIG_PATH";
|
static const char *k_pchConfigOverrideVar = "VR_CONFIG_PATH";
|
||||||
static const char *k_pchLogOverrideVar = "VR_LOG_PATH";
|
static const char *k_pchLogOverrideVar = "VR_LOG_PATH";
|
||||||
|
|
||||||
class CVRPathRegistry_Public
|
class CVRPathRegistry_Public
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static std::string GetVRPathRegistryFilename();
|
static std::string GetVRPathRegistryFilename();
|
||||||
static std::string GetOpenVRConfigPath();
|
static std::string GetOpenVRConfigPath();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CVRPathRegistry_Public();
|
CVRPathRegistry_Public();
|
||||||
|
|
||||||
/** Returns paths using the path registry and the provided override values. Pass NULL for any paths you don't care about.
|
/** Returns paths using the path registry and the provided override values. Pass NULL for any paths you don't care about.
|
||||||
* Returns false if the path registry could not be read. Valid paths might still be returned based on environment variables. */
|
* Returns false if the path registry could not be read. Valid paths might still be returned based on environment variables. */
|
||||||
static bool GetPaths( std::string *psRuntimePath, std::string *psConfigPath, std::string *psLogPath, const char *pchConfigPathOverride, const char *pchLogPathOverride, std::vector<std::string> *pvecExternalDrivers = NULL );
|
static bool GetPaths( std::string *psRuntimePath, std::string *psConfigPath, std::string *psLogPath, const char *pchConfigPathOverride, const char *pchLogPathOverride, std::vector<std::string> *pvecExternalDrivers = NULL );
|
||||||
|
|
||||||
bool BLoadFromFile();
|
bool BLoadFromFile();
|
||||||
bool BSaveToFile() const;
|
bool BSaveToFile() const;
|
||||||
|
|
||||||
bool ToJsonString( std::string &sJsonString );
|
bool ToJsonString( std::string &sJsonString );
|
||||||
|
|
||||||
// methods to get the current values
|
// methods to get the current values
|
||||||
std::string GetRuntimePath() const;
|
std::string GetRuntimePath() const;
|
||||||
std::string GetConfigPath() const;
|
std::string GetConfigPath() const;
|
||||||
std::string GetLogPath() const;
|
std::string GetLogPath() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef std::vector< std::string > StringVector_t;
|
typedef std::vector< std::string > StringVector_t;
|
||||||
|
|
||||||
// index 0 is the current setting
|
// index 0 is the current setting
|
||||||
StringVector_t m_vecRuntimePath;
|
StringVector_t m_vecRuntimePath;
|
||||||
StringVector_t m_vecLogPath;
|
StringVector_t m_vecLogPath;
|
||||||
StringVector_t m_vecConfigPath;
|
StringVector_t m_vecConfigPath;
|
||||||
|
|
||||||
// full list of external drivers
|
// full list of external drivers
|
||||||
StringVector_t m_vecExternalDrivers;
|
StringVector_t m_vecExternalDrivers;
|
||||||
};
|
};
|
||||||
|
|
|
@ -62,6 +62,24 @@ gfx/qcms/
|
||||||
gfx/sfntly/
|
gfx/sfntly/
|
||||||
gfx/skia/
|
gfx/skia/
|
||||||
gfx/vr/service/openvr/
|
gfx/vr/service/openvr/
|
||||||
|
gfx/vr/service/openvr/headers/openvr.h
|
||||||
|
gfx/vr/service/openvr/src/README
|
||||||
|
gfx/vr/service/openvr/src/dirtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/dirtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/envvartools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/envvartools_public.h
|
||||||
|
gfx/vr/service/openvr/src/hmderrors_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/hmderrors_public.h
|
||||||
|
gfx/vr/service/openvr/src/ivrclientcore.h
|
||||||
|
gfx/vr/service/openvr/src/openvr_api_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/pathtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/pathtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/sharedlibtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/sharedlibtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/strtools_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/strtools_public.h
|
||||||
|
gfx/vr/service/openvr/src/vrpathregistry_public.cpp
|
||||||
|
gfx/vr/service/openvr/src/vrpathregistry_public.h
|
||||||
gfx/wr/
|
gfx/wr/
|
||||||
gfx/ycbcr/
|
gfx/ycbcr/
|
||||||
intl/icu/
|
intl/icu/
|
||||||
|
|
Загрузка…
Ссылка в новой задаче