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:
thomasmo 2020-05-07 20:20:39 +00:00
Родитель 9dac54fd5b
Коммит 59be1c47cd
20 изменённых файлов: 7497 добавлений и 7461 удалений

Просмотреть файл

@ -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/