mirror of
				https://git.wownero.com/wowlet/wowlet.git
				synced 2024-08-15 01:03:14 +00:00 
			
		
		
		
	Vendoring OpenVR
This commit is contained in:
		
							parent
							
								
									ede112135c
								
							
						
					
					
						commit
						d58c7e7c13
					
				
					 32 changed files with 38364 additions and 0 deletions
				
			
		
							
								
								
									
										96
									
								
								contrib/openvr/CMakeLists.txt
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										96
									
								
								contrib/openvr/CMakeLists.txt
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,96 @@
 | 
				
			||||||
 | 
					# Set the minimum required version of CMake for this project.
 | 
				
			||||||
 | 
					cmake_minimum_required(VERSION 2.8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set project name.
 | 
				
			||||||
 | 
					project(OpenVRSDK)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Fetch the version from the headers
 | 
				
			||||||
 | 
					set(VERSION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/headers/openvr.h")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(VERSION_MAJOR_REGEX "\tstatic const uint32_t k_nSteamVRVersionMajor = (.+);")
 | 
				
			||||||
 | 
					set(VERSION_MINOR_REGEX "\tstatic const uint32_t k_nSteamVRVersionMinor = (.+);")
 | 
				
			||||||
 | 
					set(VERSION_BUILD_REGEX "\tstatic const uint32_t k_nSteamVRVersionBuild = (.+);")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					file(STRINGS "${VERSION_FILE}" VERSION_MAJOR_STRING REGEX "${VERSION_MAJOR_REGEX}")
 | 
				
			||||||
 | 
					file(STRINGS "${VERSION_FILE}" VERSION_MINOR_STRING REGEX "${VERSION_MINOR_REGEX}")
 | 
				
			||||||
 | 
					file(STRINGS "${VERSION_FILE}" VERSION_BUILD_STRING REGEX "${VERSION_BUILD_REGEX}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string(REGEX REPLACE "${VERSION_MAJOR_REGEX}" "\\1" VERSION_MAJOR ${VERSION_MAJOR_STRING})
 | 
				
			||||||
 | 
					string(REGEX REPLACE "${VERSION_MINOR_REGEX}" "\\1" VERSION_MINOR ${VERSION_MINOR_STRING})
 | 
				
			||||||
 | 
					string(REGEX REPLACE "${VERSION_BUILD_REGEX}" "\\1" VERSION_BUILD ${VERSION_BUILD_STRING})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(OPENVR_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_BUILD}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Setup some options.
 | 
				
			||||||
 | 
					option(BUILD_SHARED "Builds the library as shared library" OFF)
 | 
				
			||||||
 | 
					option(BUILD_FRAMEWORK "Builds the library as an apple Framework" OFF)
 | 
				
			||||||
 | 
					option(BUILD_UNIVERSAL "Builds the shared or framework as a universal (fat, 32- & 64-bit) binary" ON)
 | 
				
			||||||
 | 
					option(BUILD_OSX_I386 "Builds the shared or framework as a 32-bit binary, even on a 64-bit platform" OFF)
 | 
				
			||||||
 | 
					option(USE_LIBCXX "Uses libc++ instead of libstdc++" ON)
 | 
				
			||||||
 | 
					option(USE_CUSTOM_LIBCXX "Uses a custom libc++" OFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_definitions( -DVR_API_PUBLIC )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check if 32 or 64 bit system.
 | 
				
			||||||
 | 
					set(SIZEOF_VOIDP ${CMAKE_SIZEOF_VOID_P})
 | 
				
			||||||
 | 
					if(CMAKE_SIZEOF_VOID_P EQUAL 8)
 | 
				
			||||||
 | 
					  set(PROCESSOR_ARCH "64")
 | 
				
			||||||
 | 
					else()
 | 
				
			||||||
 | 
					  set(PROCESSOR_ARCH "32")
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Get platform.
 | 
				
			||||||
 | 
					if(WIN32)
 | 
				
			||||||
 | 
					  set(PLATFORM_NAME "win")
 | 
				
			||||||
 | 
					  if(NOT BUILD_SHARED)
 | 
				
			||||||
 | 
					    add_definitions(-DOPENVR_BUILD_STATIC)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					elseif(UNIX AND NOT APPLE)
 | 
				
			||||||
 | 
					  if(CMAKE_SYSTEM_NAME MATCHES ".*Linux")
 | 
				
			||||||
 | 
					    set(PLATFORM_NAME "linux")
 | 
				
			||||||
 | 
					    add_definitions(-DLINUX -DPOSIX)
 | 
				
			||||||
 | 
					    if(PROCESSOR_ARCH MATCHES "64")
 | 
				
			||||||
 | 
					        add_definitions(-DLINUX64)
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					elseif(APPLE)
 | 
				
			||||||
 | 
					  if(CMAKE_SYSTEM_NAME MATCHES ".*Darwin.*" OR CMAKE_SYSTEM_NAME MATCHES ".*MacOS.*")
 | 
				
			||||||
 | 
					    set(PLATFORM_NAME "osx")
 | 
				
			||||||
 | 
					    add_definitions(-DOSX -DPOSIX)
 | 
				
			||||||
 | 
					    if(BUILD_UNIVERSAL)
 | 
				
			||||||
 | 
					      set(CMAKE_OSX_ARCHITECTURES "i386;x86_64")
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					    if(BUILD_OSX_I386)
 | 
				
			||||||
 | 
					      set(PROCESSOR_ARCH "32")
 | 
				
			||||||
 | 
					      set(CMAKE_OSX_ARCHITECTURES "i386")
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set output folder for static and shared libraries
 | 
				
			||||||
 | 
					set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH})
 | 
				
			||||||
 | 
					set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH})
 | 
				
			||||||
 | 
					set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${PLATFORM_NAME}${PROCESSOR_ARCH})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Enable some properties.
 | 
				
			||||||
 | 
					if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
 | 
				
			||||||
 | 
						# Enable c++11 and hide symbols which shouldn't be visible
 | 
				
			||||||
 | 
						set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC -fvisibility=hidden")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Set custom libc++ usage here
 | 
				
			||||||
 | 
						if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND USE_LIBCXX)
 | 
				
			||||||
 | 
							if(USE_CUSTOM_LIBCXX)
 | 
				
			||||||
 | 
								if(BUILD_SHARED)
 | 
				
			||||||
 | 
									set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++")
 | 
				
			||||||
 | 
								endif()
 | 
				
			||||||
 | 
								set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdinc++")
 | 
				
			||||||
 | 
								include_directories( ${LIBCXX_INCLUDE} ${LIBCXX_ABI_INCLUDE})
 | 
				
			||||||
 | 
								message(STATUS "Using custom libc++")
 | 
				
			||||||
 | 
							else()
 | 
				
			||||||
 | 
								set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
 | 
				
			||||||
 | 
								message(STATUS "Using libc++")
 | 
				
			||||||
 | 
							endif()
 | 
				
			||||||
 | 
						endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_subdirectory(src)
 | 
				
			||||||
							
								
								
									
										27
									
								
								contrib/openvr/LICENSE
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								contrib/openvr/LICENSE
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					Copyright (c) 2015, Valve Corporation
 | 
				
			||||||
 | 
					All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without modification,
 | 
				
			||||||
 | 
					are permitted provided that the following conditions are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					1. Redistributions of source code must retain the above copyright notice, this
 | 
				
			||||||
 | 
					list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					2. Redistributions in binary form must reproduce the above copyright notice,
 | 
				
			||||||
 | 
					this list of conditions and the following disclaimer in the documentation and/or
 | 
				
			||||||
 | 
					other materials provided with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					3. Neither the name of the copyright holder nor the names of its contributors
 | 
				
			||||||
 | 
					may be used to endorse or promote products derived from this software without
 | 
				
			||||||
 | 
					specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 | 
				
			||||||
 | 
					ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 | 
				
			||||||
 | 
					WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 | 
				
			||||||
 | 
					DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
 | 
				
			||||||
 | 
					ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 | 
				
			||||||
 | 
					(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 | 
				
			||||||
 | 
					LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 | 
				
			||||||
 | 
					ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
							
								
								
									
										19
									
								
								contrib/openvr/README.md
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								contrib/openvr/README.md
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					### Warning
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Hard forked from commit `4c85abcb7f7f1f02adaf3812018c99fc593bc341` @ openvr**.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					At the time of writing, the above version does not compile. Had to make several changes. In addition, 
 | 
				
			||||||
 | 
					binary blobs where removed from the repository.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### OpenVR SDK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OpenVR is an API and runtime that allows access to VR hardware from multiple 
 | 
				
			||||||
 | 
					vendors without requiring that applications have specific knowledge of the 
 | 
				
			||||||
 | 
					hardware they are targeting. This repository is an SDK that contains the API 
 | 
				
			||||||
 | 
					and samples. The runtime is under SteamVR in Tools on Steam. 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Documentation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Documentation for the API is available on the [GitHub Wiki](https://github.com/ValveSoftware/openvr/wiki/API-Documentation)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					More information on OpenVR and SteamVR can be found on http://steamvr.com
 | 
				
			||||||
							
								
								
									
										9
									
								
								contrib/openvr/Toolchain-clang.cmake
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										9
									
								
								contrib/openvr/Toolchain-clang.cmake
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					set(CMAKE_SYSTEM_NAME Linux)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(CMAKE_C_COMPILER clang)
 | 
				
			||||||
 | 
					set(CMAKE_CXX_COMPILER clang++)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
 | 
				
			||||||
 | 
					set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
 | 
				
			||||||
 | 
					set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
 | 
				
			||||||
 | 
					set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
 | 
				
			||||||
							
								
								
									
										5624
									
								
								contrib/openvr/headers/openvr.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										5624
									
								
								contrib/openvr/headers/openvr.h
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										8220
									
								
								contrib/openvr/headers/openvr_api.cs
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										8220
									
								
								contrib/openvr/headers/openvr_api.cs
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										5761
									
								
								contrib/openvr/headers/openvr_api.json
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										5761
									
								
								contrib/openvr/headers/openvr_api.json
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										3125
									
								
								contrib/openvr/headers/openvr_capi.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										3125
									
								
								contrib/openvr/headers/openvr_capi.h
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										4212
									
								
								contrib/openvr/headers/openvr_driver.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										4212
									
								
								contrib/openvr/headers/openvr_driver.h
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										116
									
								
								contrib/openvr/src/CMakeLists.txt
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										116
									
								
								contrib/openvr/src/CMakeLists.txt
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,116 @@
 | 
				
			||||||
 | 
					# Project name.
 | 
				
			||||||
 | 
					project(openvr_api)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set( LIBNAME "openvr_api" )
 | 
				
			||||||
 | 
					set(OPENVR_HEADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../headers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set some properies for specific files.
 | 
				
			||||||
 | 
					if(APPLE)
 | 
				
			||||||
 | 
					  set(CMAKE_MACOSX_RPATH 1)
 | 
				
			||||||
 | 
					  if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
 | 
				
			||||||
 | 
					    set_source_files_properties(vrcommon/pathtools_public.cpp vrcommon/vrpathregistry_public.cpp PROPERTIES COMPILE_FLAGS "-x objective-c++")
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					  if(BUILD_SHARED OR BUILD_FRAMEWORK)
 | 
				
			||||||
 | 
					    find_library(FOUNDATION_FRAMEWORK Foundation)
 | 
				
			||||||
 | 
					    mark_as_advanced(FOUNDATION_FRAMEWORK)
 | 
				
			||||||
 | 
					    set(EXTRA_LIBS ${EXTRA_LIBS} ${FOUNDATION_FRAMEWORK})
 | 
				
			||||||
 | 
					  endif(BUILD_SHARED OR BUILD_FRAMEWORK)
 | 
				
			||||||
 | 
					elseif(WIN32)
 | 
				
			||||||
 | 
					  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
 | 
				
			||||||
 | 
					    add_definitions( -DWIN64 )
 | 
				
			||||||
 | 
					    set( LIBNAME "openvr_api64" )
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Add include folders.
 | 
				
			||||||
 | 
					include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../headers ${CMAKE_CURRENT_SOURCE_DIR}/vrcommon)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(USE_CUSTOM_LIBCXX)
 | 
				
			||||||
 | 
						link_directories(
 | 
				
			||||||
 | 
							${LIBCXX_LIB_DIR}
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Set the source group and files.
 | 
				
			||||||
 | 
					set(CORE_FILES
 | 
				
			||||||
 | 
						openvr_api_public.cpp
 | 
				
			||||||
 | 
						jsoncpp.cpp
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					set(VRCOMMON_FILES
 | 
				
			||||||
 | 
						vrcommon/dirtools_public.cpp
 | 
				
			||||||
 | 
						vrcommon/envvartools_public.cpp
 | 
				
			||||||
 | 
						vrcommon/pathtools_public.cpp
 | 
				
			||||||
 | 
						vrcommon/sharedlibtools_public.cpp
 | 
				
			||||||
 | 
						vrcommon/hmderrors_public.cpp
 | 
				
			||||||
 | 
						vrcommon/vrpathregistry_public.cpp
 | 
				
			||||||
 | 
						vrcommon/strtools_public.cpp
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(SOURCE_FILES
 | 
				
			||||||
 | 
						${CORE_FILES}
 | 
				
			||||||
 | 
						${VRCOMMON_FILES}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(PUBLIC_HEADER_FILES
 | 
				
			||||||
 | 
						${OPENVR_HEADER_DIR}/openvr_driver.h
 | 
				
			||||||
 | 
						${OPENVR_HEADER_DIR}/openvr_capi.h
 | 
				
			||||||
 | 
						${OPENVR_HEADER_DIR}/openvr.h
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source_group("Src" FILES
 | 
				
			||||||
 | 
						${CORE_FILES}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					source_group("VRCommon" FILES
 | 
				
			||||||
 | 
						${VRCOMMON_FILES}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build the library.
 | 
				
			||||||
 | 
					if(BUILD_SHARED)
 | 
				
			||||||
 | 
						add_library(${LIBNAME} SHARED ${SOURCE_FILES})
 | 
				
			||||||
 | 
					elseif(BUILD_FRAMEWORK)
 | 
				
			||||||
 | 
						set( LIBNAME "OpenVR" )
 | 
				
			||||||
 | 
						add_library( ${LIBNAME} 
 | 
				
			||||||
 | 
					            SHARED ${SOURCE_FILES}
 | 
				
			||||||
 | 
					            ${CMAKE_SOURCE_DIR}/headers/openvr.h
 | 
				
			||||||
 | 
					            ${CMAKE_SOURCE_DIR}/headers/openvr_api.cs
 | 
				
			||||||
 | 
					            ${CMAKE_SOURCE_DIR}/headers/openvr_api.json
 | 
				
			||||||
 | 
					            ${CMAKE_SOURCE_DIR}/headers/openvr_capi.h
 | 
				
			||||||
 | 
					            ${CMAKE_SOURCE_DIR}/headers/openvr_driver.h
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						set_target_properties(OpenVR PROPERTIES
 | 
				
			||||||
 | 
							FRAMEWORK TRUE
 | 
				
			||||||
 | 
							FRAMEWORK_VERSION A
 | 
				
			||||||
 | 
							MACOSX_FRAMEWORK_IDENTIFIER com.valvesoftware.OpenVR.framework
 | 
				
			||||||
 | 
							MACOSX_FRAMEWORK_INFO_PLIST ${CMAKE_SOURCE_DIR}/src/Info.plist
 | 
				
			||||||
 | 
							# "current version" in semantic format in Mach-O binary file
 | 
				
			||||||
 | 
							VERSION 1.0.6
 | 
				
			||||||
 | 
							# "compatibility version" in semantic format in Mach-O binary file
 | 
				
			||||||
 | 
							SOVERSION 1.0.0
 | 
				
			||||||
 | 
							PUBLIC_HEADER "${CMAKE_SOURCE_DIR}/headers/openvr.h;${CMAKE_SOURCE_DIR}/headers/openvr_api.cs;${CMAKE_SOURCE_DIR}/headers/openvr_api.json;${CMAKE_SOURCE_DIR}/headers/openvr_capi.h;${CMAKE_SOURCE_DIR}/headers/openvr_driver.h"
 | 
				
			||||||
 | 
							LINKER_LANGUAGE CXX
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					else()
 | 
				
			||||||
 | 
						add_library(${LIBNAME} STATIC ${SOURCE_FILES})
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(USE_CUSTOM_LIBCXX)
 | 
				
			||||||
 | 
						set(EXTRA_LIBS ${EXTRA_LIBS} c++ c++abi)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target_link_libraries(${LIBNAME} ${EXTRA_LIBS} ${CMAKE_DL_LIBS})
 | 
				
			||||||
 | 
					target_include_directories(${LIBNAME} PUBLIC ${OPENVR_HEADER_DIR})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install(TARGETS ${LIBNAME} DESTINATION lib)
 | 
				
			||||||
 | 
					install(FILES ${PUBLIC_HEADER_FILES} DESTINATION include/openvr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Generate a .pc file for linux environments
 | 
				
			||||||
 | 
					if(PLATFORM_NAME MATCHES "linux")
 | 
				
			||||||
 | 
					    set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
 | 
				
			||||||
 | 
					    CONFIGURE_FILE("openvr.pc.in" "openvr.pc" @ONLY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    set(OPENVR_PC ${CMAKE_CURRENT_BINARY_DIR}/openvr.pc)
 | 
				
			||||||
 | 
					    if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
 | 
				
			||||||
 | 
					        install(FILES ${OPENVR_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}")
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
							
								
								
									
										18
									
								
								contrib/openvr/src/Info.plist
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								contrib/openvr/src/Info.plist
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||||
 | 
					<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 | 
				
			||||||
 | 
					<plist version="1.0">
 | 
				
			||||||
 | 
					<dict>
 | 
				
			||||||
 | 
						<key>CFBundleIdentifier</key>
 | 
				
			||||||
 | 
						<string>com.valvesoftware.OpenVR.framework</string>
 | 
				
			||||||
 | 
						<key>CFBundleInfoDictionaryVersion</key>
 | 
				
			||||||
 | 
						<string>6.0</string>
 | 
				
			||||||
 | 
						<key>CFBundleName</key>
 | 
				
			||||||
 | 
						<string>OpenVR</string>
 | 
				
			||||||
 | 
						<key>CFBundlePackageType</key>
 | 
				
			||||||
 | 
						<string>FMWK</string>
 | 
				
			||||||
 | 
						<key>CFBundleShortVersionString</key>
 | 
				
			||||||
 | 
						<string>1.0</string>
 | 
				
			||||||
 | 
						<key>CFBundleVersion</key>
 | 
				
			||||||
 | 
						<string>1.0</string>
 | 
				
			||||||
 | 
					</dict>
 | 
				
			||||||
 | 
					</plist>
 | 
				
			||||||
							
								
								
									
										39
									
								
								contrib/openvr/src/README
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										39
									
								
								contrib/openvr/src/README
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					of the OpenVR interface they were compiled against.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					and read the SteamVR runtime installation information which allows it to
 | 
				
			||||||
 | 
					find and dynamically connect to the installed runtime. In combination with the
 | 
				
			||||||
 | 
					interface version identifiers from /include/openvr.h which are baked
 | 
				
			||||||
 | 
					into applications at the time they are built, the OpenVR API client
 | 
				
			||||||
 | 
					binding library captures and conveys to the SteamVR runtime the version
 | 
				
			||||||
 | 
					of the OpenVR API interface behavior that the application expects.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Applications carry with them a private/local copy of the client binding
 | 
				
			||||||
 | 
					library when they ship, and they should install it locally to their
 | 
				
			||||||
 | 
					application.  Applications should not install the 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
 | 
				
			||||||
 | 
					to accurately reflect the version of the OpenVR API that the application
 | 
				
			||||||
 | 
					was built against, and so hinders compatibility support in the face of
 | 
				
			||||||
 | 
					API changes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Most applications should simply link to and redistribute with their application
 | 
				
			||||||
 | 
					the pre-built client binding library found in the /bin directory of this
 | 
				
			||||||
 | 
					repository. Some small number of applications which have specific requirements
 | 
				
			||||||
 | 
					around redistributing only binaries they build themselves should build
 | 
				
			||||||
 | 
					the client library from this source and either statically link it into
 | 
				
			||||||
 | 
					their application or redistribute the binary they build.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cd src; mkdir _build; cd _build; cmake ..; make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 as a framework on apple platforms, pass -DBUILD_FRAMEWORK=1 to cmake.
 | 
				
			||||||
 | 
					To see a complete list of configurable build options, use `cmake -LAH`
 | 
				
			||||||
							
								
								
									
										35
									
								
								contrib/openvr/src/ivrclientcore.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								contrib/openvr/src/ivrclientcore.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace vr
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class IVRClientCore
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						/** Initializes the system */
 | 
				
			||||||
 | 
						virtual EVRInitError Init( vr::EVRApplicationType eApplicationType, const char *pStartupInfo ) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** cleans up everything in vrclient.dll and prepares the DLL to be unloaded */
 | 
				
			||||||
 | 
						virtual void Cleanup() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** checks to see if the specified interface/version is supported in this vrclient.dll */
 | 
				
			||||||
 | 
						virtual EVRInitError IsInterfaceVersionValid( const char *pchInterfaceVersion ) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Retrieves any interface from vrclient.dll */
 | 
				
			||||||
 | 
						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 */
 | 
				
			||||||
 | 
						virtual bool BIsHmdPresent() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** 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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Returns an error symbol from inside vrclient.dll which might be newer than the API DLL */
 | 
				
			||||||
 | 
						virtual const char *GetIDForVRInitError( vr::EVRInitError eError ) = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char * const IVRClientCore_Version = "IVRClientCore_003";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										284
									
								
								contrib/openvr/src/json/json-forwards.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										284
									
								
								contrib/openvr/src/json/json-forwards.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,284 @@
 | 
				
			||||||
 | 
					/// Json-cpp amalgated forward header (http://jsoncpp.sourceforge.net/).
 | 
				
			||||||
 | 
					/// It is intended to be used with #include "json/json-forwards.h"
 | 
				
			||||||
 | 
					/// This header provides forward declaration for all JsonCpp types.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Beginning of content of file: LICENSE
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					The JsonCpp library's source code, including accompanying documentation, 
 | 
				
			||||||
 | 
					tests and demonstration applications, are licensed under the following
 | 
				
			||||||
 | 
					conditions...
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The author (Baptiste Lepilleur) explicitly disclaims copyright in all 
 | 
				
			||||||
 | 
					jurisdictions which recognize such a disclaimer. In such jurisdictions, 
 | 
				
			||||||
 | 
					this software is released into the Public Domain.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In jurisdictions which do not recognize Public Domain property (e.g. Germany as of
 | 
				
			||||||
 | 
					2010), this software is Copyright (c) 2007-2010 by Baptiste Lepilleur, and is
 | 
				
			||||||
 | 
					released under the terms of the MIT License (see below).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In jurisdictions which recognize Public Domain property, the user of this 
 | 
				
			||||||
 | 
					software may choose to accept it either as 1) Public Domain, 2) under the 
 | 
				
			||||||
 | 
					conditions of the MIT License (see below), or 3) under the terms of dual 
 | 
				
			||||||
 | 
					Public Domain/MIT License conditions described here, as they choose.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The MIT License is about as close to Public Domain as a license can get, and is
 | 
				
			||||||
 | 
					described in clear, concise terms at:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   http://en.wikipedia.org/wiki/MIT_License
 | 
				
			||||||
 | 
					   
 | 
				
			||||||
 | 
					The full text of the MIT License follows:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					========================================================================
 | 
				
			||||||
 | 
					Copyright (c) 2007-2010 Baptiste Lepilleur
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person
 | 
				
			||||||
 | 
					obtaining a copy of this software and associated documentation
 | 
				
			||||||
 | 
					files (the "Software"), to deal in the Software without
 | 
				
			||||||
 | 
					restriction, including without limitation the rights to use, copy,
 | 
				
			||||||
 | 
					modify, merge, publish, distribute, sublicense, and/or sell copies
 | 
				
			||||||
 | 
					of the Software, and to permit persons to whom the Software is
 | 
				
			||||||
 | 
					furnished to do so, subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be
 | 
				
			||||||
 | 
					included in all copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | 
				
			||||||
 | 
					EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | 
				
			||||||
 | 
					MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 | 
				
			||||||
 | 
					NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 | 
				
			||||||
 | 
					BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 | 
				
			||||||
 | 
					ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
				
			||||||
 | 
					CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 | 
				
			||||||
 | 
					SOFTWARE.
 | 
				
			||||||
 | 
					========================================================================
 | 
				
			||||||
 | 
					(END LICENSE TEXT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The MIT license is compatible with both the GPL and commercial
 | 
				
			||||||
 | 
					software, affording one all of the rights of Public Domain with the
 | 
				
			||||||
 | 
					minor nuisance of being required to keep the above copyright notice
 | 
				
			||||||
 | 
					and license text in the source code. Note also that by accepting the
 | 
				
			||||||
 | 
					Public Domain "license" you can re-license your copy using whatever
 | 
				
			||||||
 | 
					license you like.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// End of content of file: LICENSE
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef JSON_FORWARD_AMALGATED_H_INCLUDED
 | 
				
			||||||
 | 
					# define JSON_FORWARD_AMALGATED_H_INCLUDED
 | 
				
			||||||
 | 
					/// If defined, indicates that the source file is amalgated
 | 
				
			||||||
 | 
					/// to prevent private header inclusion.
 | 
				
			||||||
 | 
					#define JSON_IS_AMALGAMATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Beginning of content of file: include/json/config.h
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copyright 2007-2010 Baptiste Lepilleur
 | 
				
			||||||
 | 
					// Distributed under MIT license, or public domain if desired and
 | 
				
			||||||
 | 
					// recognized in your jurisdiction.
 | 
				
			||||||
 | 
					// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef JSON_CONFIG_H_INCLUDED
 | 
				
			||||||
 | 
					#define JSON_CONFIG_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// If defined, indicates that json library is embedded in CppTL library.
 | 
				
			||||||
 | 
					//# define JSON_IN_CPPTL 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// If defined, indicates that json may leverage CppTL library
 | 
				
			||||||
 | 
					//#  define JSON_USE_CPPTL 1
 | 
				
			||||||
 | 
					/// If defined, indicates that cpptl vector based map should be used instead of
 | 
				
			||||||
 | 
					/// std::map
 | 
				
			||||||
 | 
					/// as Value container.
 | 
				
			||||||
 | 
					//#  define JSON_USE_CPPTL_SMALLMAP 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// If non-zero, the library uses exceptions to report bad input instead of C
 | 
				
			||||||
 | 
					// assertion macros. The default is to use exceptions.
 | 
				
			||||||
 | 
					#ifndef JSON_USE_EXCEPTION
 | 
				
			||||||
 | 
					#define JSON_USE_EXCEPTION 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// If defined, indicates that the source file is amalgated
 | 
				
			||||||
 | 
					/// to prevent private header inclusion.
 | 
				
			||||||
 | 
					/// Remarks: it is automatically defined in the generated amalgated header.
 | 
				
			||||||
 | 
					// #define JSON_IS_AMALGAMATION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef JSON_IN_CPPTL
 | 
				
			||||||
 | 
					#include <cpptl/config.h>
 | 
				
			||||||
 | 
					#ifndef JSON_USE_CPPTL
 | 
				
			||||||
 | 
					#define JSON_USE_CPPTL 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef JSON_IN_CPPTL
 | 
				
			||||||
 | 
					#define JSON_API CPPTL_API
 | 
				
			||||||
 | 
					#elif defined(JSON_DLL_BUILD)
 | 
				
			||||||
 | 
					#if defined(_MSC_VER)
 | 
				
			||||||
 | 
					#define JSON_API __declspec(dllexport)
 | 
				
			||||||
 | 
					#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
 | 
				
			||||||
 | 
					#endif // if defined(_MSC_VER)
 | 
				
			||||||
 | 
					#elif defined(JSON_DLL)
 | 
				
			||||||
 | 
					#if defined(_MSC_VER)
 | 
				
			||||||
 | 
					#define JSON_API __declspec(dllimport)
 | 
				
			||||||
 | 
					#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING
 | 
				
			||||||
 | 
					#endif // if defined(_MSC_VER)
 | 
				
			||||||
 | 
					#endif // ifdef JSON_IN_CPPTL
 | 
				
			||||||
 | 
					#if !defined(JSON_API)
 | 
				
			||||||
 | 
					#define JSON_API
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for
 | 
				
			||||||
 | 
					// integer
 | 
				
			||||||
 | 
					// Storages, and 64 bits integer support is disabled.
 | 
				
			||||||
 | 
					// #define JSON_NO_INT64 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_MSC_VER) // MSVC
 | 
				
			||||||
 | 
					#  if _MSC_VER <= 1200 // MSVC 6
 | 
				
			||||||
 | 
					    // Microsoft Visual Studio 6 only support conversion from __int64 to double
 | 
				
			||||||
 | 
					    // (no conversion from unsigned __int64).
 | 
				
			||||||
 | 
					#    define JSON_USE_INT64_DOUBLE_CONVERSION 1
 | 
				
			||||||
 | 
					    // Disable warning 4786 for VS6 caused by STL (identifier was truncated to '255'
 | 
				
			||||||
 | 
					    // characters in the debug information)
 | 
				
			||||||
 | 
					    // All projects I've ever seen with VS6 were using this globally (not bothering
 | 
				
			||||||
 | 
					    // with pragma push/pop).
 | 
				
			||||||
 | 
					#    pragma warning(disable : 4786)
 | 
				
			||||||
 | 
					#  endif // MSVC 6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if _MSC_VER >= 1500 // MSVC 2008
 | 
				
			||||||
 | 
					    /// Indicates that the following function is deprecated.
 | 
				
			||||||
 | 
					#    define JSONCPP_DEPRECATED(message) __declspec(deprecated(message))
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // defined(_MSC_VER)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef JSON_HAS_RVALUE_REFERENCES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_MSC_VER) && _MSC_VER >= 1600 // MSVC >= 2010
 | 
				
			||||||
 | 
					#define JSON_HAS_RVALUE_REFERENCES 1
 | 
				
			||||||
 | 
					#endif // MSVC >= 2010
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __clang__
 | 
				
			||||||
 | 
					#if __has_feature(cxx_rvalue_references)
 | 
				
			||||||
 | 
					#define JSON_HAS_RVALUE_REFERENCES 1
 | 
				
			||||||
 | 
					#endif  // has_feature
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
 | 
				
			||||||
 | 
					#if defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L)
 | 
				
			||||||
 | 
					#define JSON_HAS_RVALUE_REFERENCES 1
 | 
				
			||||||
 | 
					#endif  // GXX_EXPERIMENTAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // __clang__ || __GNUC__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // not defined JSON_HAS_RVALUE_REFERENCES
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef JSON_HAS_RVALUE_REFERENCES
 | 
				
			||||||
 | 
					#define JSON_HAS_RVALUE_REFERENCES 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __clang__
 | 
				
			||||||
 | 
					#elif defined __GNUC__ // not clang (gcc comes later since clang emulates gcc)
 | 
				
			||||||
 | 
					#  if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5))
 | 
				
			||||||
 | 
					#    define JSONCPP_DEPRECATED(message)  __attribute__ ((deprecated(message)))
 | 
				
			||||||
 | 
					#  elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
 | 
				
			||||||
 | 
					#    define JSONCPP_DEPRECATED(message)  __attribute__((__deprecated__))
 | 
				
			||||||
 | 
					#  endif  // GNUC version
 | 
				
			||||||
 | 
					#endif // __clang__ || __GNUC__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(JSONCPP_DEPRECATED)
 | 
				
			||||||
 | 
					#define JSONCPP_DEPRECATED(message)
 | 
				
			||||||
 | 
					#endif // if !defined(JSONCPP_DEPRECATED)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Json {
 | 
				
			||||||
 | 
					typedef int Int;
 | 
				
			||||||
 | 
					typedef unsigned int UInt;
 | 
				
			||||||
 | 
					#if defined(JSON_NO_INT64)
 | 
				
			||||||
 | 
					typedef int LargestInt;
 | 
				
			||||||
 | 
					typedef unsigned int LargestUInt;
 | 
				
			||||||
 | 
					#undef JSON_HAS_INT64
 | 
				
			||||||
 | 
					#else                 // if defined(JSON_NO_INT64)
 | 
				
			||||||
 | 
					// For Microsoft Visual use specific types as long long is not supported
 | 
				
			||||||
 | 
					#if defined(_MSC_VER) // Microsoft Visual Studio
 | 
				
			||||||
 | 
					typedef __int64 Int64;
 | 
				
			||||||
 | 
					typedef unsigned __int64 UInt64;
 | 
				
			||||||
 | 
					#else                 // if defined(_MSC_VER) // Other platforms, use long long
 | 
				
			||||||
 | 
					typedef long long int Int64;
 | 
				
			||||||
 | 
					typedef unsigned long long int UInt64;
 | 
				
			||||||
 | 
					#endif // if defined(_MSC_VER)
 | 
				
			||||||
 | 
					typedef Int64 LargestInt;
 | 
				
			||||||
 | 
					typedef UInt64 LargestUInt;
 | 
				
			||||||
 | 
					#define JSON_HAS_INT64
 | 
				
			||||||
 | 
					#endif // if defined(JSON_NO_INT64)
 | 
				
			||||||
 | 
					} // end namespace Json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // JSON_CONFIG_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// End of content of file: include/json/config.h
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Beginning of content of file: include/json/forwards.h
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copyright 2007-2010 Baptiste Lepilleur
 | 
				
			||||||
 | 
					// Distributed under MIT license, or public domain if desired and
 | 
				
			||||||
 | 
					// recognized in your jurisdiction.
 | 
				
			||||||
 | 
					// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef JSON_FORWARDS_H_INCLUDED
 | 
				
			||||||
 | 
					#define JSON_FORWARDS_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(JSON_IS_AMALGAMATION)
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					#endif // if !defined(JSON_IS_AMALGAMATION)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Json {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// writer.h
 | 
				
			||||||
 | 
					class FastWriter;
 | 
				
			||||||
 | 
					class StyledWriter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// reader.h
 | 
				
			||||||
 | 
					class Reader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// features.h
 | 
				
			||||||
 | 
					class Features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// value.h
 | 
				
			||||||
 | 
					typedef unsigned int ArrayIndex;
 | 
				
			||||||
 | 
					class StaticString;
 | 
				
			||||||
 | 
					class Path;
 | 
				
			||||||
 | 
					class PathArgument;
 | 
				
			||||||
 | 
					class Value;
 | 
				
			||||||
 | 
					class ValueIteratorBase;
 | 
				
			||||||
 | 
					class ValueIterator;
 | 
				
			||||||
 | 
					class ValueConstIterator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace Json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif // JSON_FORWARDS_H_INCLUDED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// End of content of file: include/json/forwards.h
 | 
				
			||||||
 | 
					// //////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif //ifndef JSON_FORWARD_AMALGATED_H_INCLUDED
 | 
				
			||||||
							
								
								
									
										2077
									
								
								contrib/openvr/src/json/json.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										2077
									
								
								contrib/openvr/src/json/json.h
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										5266
									
								
								contrib/openvr/src/jsoncpp.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										5266
									
								
								contrib/openvr/src/jsoncpp.cpp
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										11
									
								
								contrib/openvr/src/openvr.pc.in
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										11
									
								
								contrib/openvr/src/openvr.pc.in
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					prefix=@CMAKE_INSTALL_PREFIX@
 | 
				
			||||||
 | 
					exec_prefix=${prefix}
 | 
				
			||||||
 | 
					libdir=${prefix}/lib
 | 
				
			||||||
 | 
					includedir=${prefix}/include/openvr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Name: openvr
 | 
				
			||||||
 | 
					Description: OpenVR is an API and runtime that allos access to VR hardware.
 | 
				
			||||||
 | 
					Version: @OPENVR_VERSION@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Libs: -L${libdir} -lopenvr_api -ldl
 | 
				
			||||||
 | 
					Cflags: -I${includedir}
 | 
				
			||||||
							
								
								
									
										356
									
								
								contrib/openvr/src/openvr_api_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										356
									
								
								contrib/openvr/src/openvr_api_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,356 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#define VR_API_EXPORT 1
 | 
				
			||||||
 | 
					#define VR_API_PUBLIC 1
 | 
				
			||||||
 | 
					#include "openvr.h"
 | 
				
			||||||
 | 
					#include "ivrclientcore.h"
 | 
				
			||||||
 | 
					#include <vrcommon/pathtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/sharedlibtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/envvartools_public.h>
 | 
				
			||||||
 | 
					#include "hmderrors_public.h"
 | 
				
			||||||
 | 
					#include <vrcommon/strtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/vrpathregistry_public.h>
 | 
				
			||||||
 | 
					#include <mutex>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using vr::EVRInitError;
 | 
				
			||||||
 | 
					using vr::IVRSystem;
 | 
				
			||||||
 | 
					using vr::IVRClientCore;
 | 
				
			||||||
 | 
					using vr::VRInitError_None;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// figure out how to import from the VR API dll
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
					#define DYNAMIC_LIB_EXT ".dll"
 | 
				
			||||||
 | 
					#define PROGRAM_EXT ".exe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(OPENVR_BUILD_STATIC)
 | 
				
			||||||
 | 
					#define VR_EXPORT_INTERFACE extern "C" __declspec( dllexport )
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define VR_EXPORT_INTERFACE extern "C"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined(__GNUC__) || defined(COMPILER_GCC) || defined(__APPLE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define VR_EXPORT_INTERFACE extern "C" __attribute__((visibility("default")))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error "Unsupported Platform."
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace vr
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void *g_pVRModule = NULL;
 | 
				
			||||||
 | 
					static IVRClientCore *g_pHmdSystem = NULL;
 | 
				
			||||||
 | 
					static std::recursive_mutex g_mutexSystem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void* (*VRClientCoreFactoryFn)(const char *pInterfaceName, int *pReturnCode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static uint32_t g_nVRToken = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t VR_GetInitToken()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return g_nVRToken;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EVRInitError VR_LoadHmdSystemInternal();
 | 
				
			||||||
 | 
					void CleanupInternalInterfaces();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t VR_InitInternal2( EVRInitError *peError, vr::EVRApplicationType eApplicationType, const char *pStartupInfo )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						EVRInitError err = VR_LoadHmdSystemInternal();
 | 
				
			||||||
 | 
						if ( err == vr::VRInitError_None )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							err = g_pHmdSystem->Init( eApplicationType, pStartupInfo );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( peError )
 | 
				
			||||||
 | 
							*peError = err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( err != VRInitError_None )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							SharedLib_Unload( g_pVRModule );
 | 
				
			||||||
 | 
							g_pHmdSystem = NULL;
 | 
				
			||||||
 | 
							g_pVRModule = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ++g_nVRToken;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VR_INTERFACE uint32_t VR_CALLTYPE VR_InitInternal( EVRInitError *peError, EVRApplicationType eApplicationType );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t VR_InitInternal( EVRInitError *peError, vr::EVRApplicationType eApplicationType )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return VR_InitInternal2( peError, eApplicationType, nullptr );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void VR_ShutdownInternal()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined( VR_API_PUBLIC )
 | 
				
			||||||
 | 
						CleanupInternalInterfaces();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( g_pHmdSystem )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							g_pHmdSystem->Cleanup();
 | 
				
			||||||
 | 
							g_pHmdSystem = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( g_pVRModule )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							SharedLib_Unload( g_pVRModule );
 | 
				
			||||||
 | 
							g_pVRModule = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						++g_nVRToken;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EVRInitError VR_LoadHmdSystemInternal()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sRuntimePath, sConfigPath, sLogPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
 | 
				
			||||||
 | 
						if( !bReadPathRegistry )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return vr::VRInitError_Init_PathRegistryNotFound;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// figure out where we're going to look for vrclient.dll
 | 
				
			||||||
 | 
						// see if the specified path actually exists.
 | 
				
			||||||
 | 
						if( !Path_IsDirectory( sRuntimePath ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return vr::VRInitError_Init_InstallationNotFound;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Because we don't have a way to select debug vs. release yet we'll just
 | 
				
			||||||
 | 
						// use debug if it's there
 | 
				
			||||||
 | 
					#if defined( LINUX64 ) || defined( LINUXARM64 )
 | 
				
			||||||
 | 
						std::string sTestPath = Path_Join( sRuntimePath, "bin", PLATSUBDIR );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::string sTestPath = Path_Join( sRuntimePath, "bin" );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						if( !Path_IsDirectory( sTestPath ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return vr::VRInitError_Init_InstallationCorrupt;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( WIN64 )
 | 
				
			||||||
 | 
						std::string sDLLPath = Path_Join( sTestPath, "vrclient_x64" DYNAMIC_LIB_EXT );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::string sDLLPath = Path_Join( sTestPath, "vrclient" DYNAMIC_LIB_EXT );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// only look in the override
 | 
				
			||||||
 | 
						void *pMod = SharedLib_Load( sDLLPath.c_str() );
 | 
				
			||||||
 | 
						// nothing more to do if we can't load the DLL
 | 
				
			||||||
 | 
						if( !pMod )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return vr::VRInitError_Init_VRClientDLLNotFound;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						VRClientCoreFactoryFn fnFactory = ( VRClientCoreFactoryFn )( SharedLib_GetFunction( pMod, "VRClientCoreFactory" ) );
 | 
				
			||||||
 | 
						if( !fnFactory )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							SharedLib_Unload( pMod );
 | 
				
			||||||
 | 
							return vr::VRInitError_Init_FactoryNotFound;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int nReturnCode = 0;
 | 
				
			||||||
 | 
						g_pHmdSystem = static_cast< IVRClientCore * > ( fnFactory( vr::IVRClientCore_Version, &nReturnCode ) );
 | 
				
			||||||
 | 
						if( !g_pHmdSystem )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							SharedLib_Unload( pMod );
 | 
				
			||||||
 | 
							return vr::VRInitError_Init_InterfaceNotFound;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						g_pVRModule = pMod;
 | 
				
			||||||
 | 
						return VRInitError_None;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *VR_GetGenericInterface(const char *pchInterfaceVersion, EVRInitError *peError)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!g_pHmdSystem)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (peError)
 | 
				
			||||||
 | 
								*peError = vr::VRInitError_Init_NotInitialized;
 | 
				
			||||||
 | 
							return NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return g_pHmdSystem->GetGenericInterface(pchInterfaceVersion, peError);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool VR_IsInterfaceVersionValid(const char *pchInterfaceVersion)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!g_pHmdSystem)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return g_pHmdSystem->IsInterfaceVersionValid(pchInterfaceVersion) == VRInitError_None;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool VR_IsHmdPresent()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( g_pHmdSystem )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// if we're already initialized, just call through
 | 
				
			||||||
 | 
							return g_pHmdSystem->BIsHmdPresent();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// otherwise we need to do a bit more work
 | 
				
			||||||
 | 
							EVRInitError err = VR_LoadHmdSystemInternal();
 | 
				
			||||||
 | 
							if( err != VRInitError_None )
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool bHasHmd = g_pHmdSystem->BIsHmdPresent();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							g_pHmdSystem = NULL;
 | 
				
			||||||
 | 
							SharedLib_Unload( g_pVRModule );
 | 
				
			||||||
 | 
							g_pVRModule = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return bHasHmd;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns true if the OpenVR runtime is installed. */
 | 
				
			||||||
 | 
					bool VR_IsRuntimeInstalled()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( g_pHmdSystem )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// if we're already initialized, OpenVR is obviously installed
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// otherwise we need to do a bit more work
 | 
				
			||||||
 | 
							std::string sRuntimePath, sConfigPath, sLogPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, &sConfigPath, &sLogPath, NULL, NULL );
 | 
				
			||||||
 | 
							if( !bReadPathRegistry )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// figure out where we're going to look for vrclient.dll
 | 
				
			||||||
 | 
							// see if the specified path actually exists.
 | 
				
			||||||
 | 
							if( !Path_IsDirectory( sRuntimePath ) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// the installation may be corrupt in some way, but it certainly looks installed
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: This is the old Runtime Path interface that is no longer exported in the
 | 
				
			||||||
 | 
					//			latest header. We still want to export it from the DLL, though, so updating
 | 
				
			||||||
 | 
					//			to a new DLL doesn't break old compiled code. This version was not thread 
 | 
				
			||||||
 | 
					//			safe and could change the buffer pointer to by a previous result on a 
 | 
				
			||||||
 | 
					//			subsequent call
 | 
				
			||||||
 | 
					// -------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					VR_EXPORT_INTERFACE const char *VR_CALLTYPE VR_RuntimePath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns where OpenVR runtime is installed. */
 | 
				
			||||||
 | 
					const char *VR_RuntimePath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static char rchBuffer[1024];
 | 
				
			||||||
 | 
						uint32_t unRequiredSize;
 | 
				
			||||||
 | 
						if ( VR_GetRuntimePath( rchBuffer, sizeof( rchBuffer ), &unRequiredSize ) && unRequiredSize < sizeof( rchBuffer ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return rchBuffer;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return nullptr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns where OpenVR runtime is installed. */
 | 
				
			||||||
 | 
					bool VR_GetRuntimePath( char *pchPathBuffer, uint32_t unBufferSize, uint32_t *punRequiredBufferSize )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// otherwise we need to do a bit more work
 | 
				
			||||||
 | 
						std::string sRuntimePath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*punRequiredBufferSize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool bReadPathRegistry = CVRPathRegistry_Public::GetPaths( &sRuntimePath, nullptr, nullptr, nullptr, nullptr );
 | 
				
			||||||
 | 
						if ( !bReadPathRegistry )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// figure out where we're going to look for vrclient.dll
 | 
				
			||||||
 | 
						// see if the specified path actually exists.
 | 
				
			||||||
 | 
						if ( !Path_IsDirectory( sRuntimePath ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						*punRequiredBufferSize = (uint32_t)sRuntimePath.size() + 1;
 | 
				
			||||||
 | 
						if ( sRuntimePath.size() >= unBufferSize )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*pchPathBuffer = '\0';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							strcpy_safe( pchPathBuffer, unBufferSize, sRuntimePath.c_str() );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the symbol version of an HMD error. */
 | 
				
			||||||
 | 
					const char *VR_GetVRInitErrorAsSymbol( EVRInitError error )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( g_pHmdSystem )
 | 
				
			||||||
 | 
							return g_pHmdSystem->GetIDForVRInitError( error );
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return GetIDForVRInitError( error );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the english string version of an HMD error. */
 | 
				
			||||||
 | 
					const char *VR_GetVRInitErrorAsEnglishDescription( EVRInitError error )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::lock_guard<std::recursive_mutex> lock( g_mutexSystem );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( g_pHmdSystem )
 | 
				
			||||||
 | 
							return g_pHmdSystem->GetEnglishStringForHmdError( error );
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return GetEnglishStringForHmdError( error );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					VR_INTERFACE const char *VR_CALLTYPE VR_GetStringForHmdError( vr::EVRInitError error );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the english string version of an HMD error. */
 | 
				
			||||||
 | 
					const char *VR_GetStringForHmdError( EVRInitError error )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return VR_GetVRInitErrorAsEnglishDescription( error );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										101
									
								
								contrib/openvr/src/vrcommon/dirtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										101
									
								
								contrib/openvr/src/vrcommon/dirtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,101 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#include <vrcommon/dirtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/strtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/pathtools_public.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef _WIN32
 | 
				
			||||||
 | 
					#include "windows.h"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( OSX )
 | 
				
			||||||
 | 
					#include <sys/syslimits.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: utility function to create dirs & subdirs
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool BCreateDirectoryRecursive( const char *pchPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Does it already exist?
 | 
				
			||||||
 | 
						if ( Path_IsDirectory( pchPath ) )
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// copy the path into something we can munge
 | 
				
			||||||
 | 
						int len = (int)strlen( pchPath );
 | 
				
			||||||
 | 
						char *path = (char *)malloc( len + 1 );
 | 
				
			||||||
 | 
						strcpy( path, pchPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Walk backwards to first non-existing dir that we find
 | 
				
			||||||
 | 
						char *s = path + len - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const char slash = Path_GetSlash();
 | 
				
			||||||
 | 
						while ( s > path )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( *s == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*s = '\0';
 | 
				
			||||||
 | 
								bool bExists = Path_IsDirectory( path );
 | 
				
			||||||
 | 
								*s = slash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ( bExists )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									++s;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							--s;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// and then move forwards from there
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while ( *s )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( *s == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*s = '\0';
 | 
				
			||||||
 | 
								BCreateDirectory( path );
 | 
				
			||||||
 | 
								*s = slash;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							s++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool bRetVal = BCreateDirectory( path );
 | 
				
			||||||
 | 
						free( path );
 | 
				
			||||||
 | 
						return bRetVal;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Creates the directory, returning true if it is created, or if it already existed
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool BCreateDirectory( const char *pchPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
						std::wstring wPath = UTF8to16( pchPath );
 | 
				
			||||||
 | 
						if ( ::CreateDirectoryW( wPath.c_str(), NULL ) )
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( ::GetLastError() == ERROR_ALREADY_EXISTS )
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						int i = mkdir( pchPath, S_IRWXU | S_IRWXG | S_IRWXO );
 | 
				
			||||||
 | 
						if ( i == 0 )
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						if ( errno == EEXIST )
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								contrib/openvr/src/vrcommon/dirtools_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										17
									
								
								contrib/openvr/src/vrcommon/dirtools_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(_WIN32)
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern bool BCreateDirectoryRecursive( const char *pchPath );
 | 
				
			||||||
 | 
					extern bool BCreateDirectory( const char *pchPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										88
									
								
								contrib/openvr/src/vrcommon/envvartools_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										88
									
								
								contrib/openvr/src/vrcommon/envvartools_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,88 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#include <vrcommon/envvartools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/strtools_public.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <cctype>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef GetEnvironmentVariable
 | 
				
			||||||
 | 
					#undef SetEnvironmentVariable
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string GetEnvironmentVariable( const char *pchVarName )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
						char rchValue[32767]; // max size for an env var on Windows
 | 
				
			||||||
 | 
						DWORD cChars = GetEnvironmentVariableA( pchVarName, rchValue, sizeof( rchValue ) );
 | 
				
			||||||
 | 
						if( cChars == 0 )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return rchValue;
 | 
				
			||||||
 | 
					#elif defined(POSIX)
 | 
				
			||||||
 | 
						char *pchValue = getenv( pchVarName );
 | 
				
			||||||
 | 
						if( pchValue )
 | 
				
			||||||
 | 
							return pchValue;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error "Unsupported Platform"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool GetEnvironmentVariableAsBool( const char *pchVarName, bool bDefault )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sValue = GetEnvironmentVariable( pchVarName );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( sValue.empty() )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return bDefault;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sValue = StringToLower( sValue );
 | 
				
			||||||
 | 
						std::string sYesValues[] = { "y", "yes", "true" };
 | 
				
			||||||
 | 
						std::string sNoValues[] = { "n", "no", "false" };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for ( std::string &sMatch : sYesValues )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( sMatch == sValue )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for ( std::string &sMatch : sNoValues )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( sMatch == sValue )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( std::isdigit( sValue.at(0) ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return atoi( sValue.c_str() ) != 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fprintf( stderr,
 | 
				
			||||||
 | 
								 "GetEnvironmentVariableAsBool(%s): Unable to parse value '%s', using default %d\n",
 | 
				
			||||||
 | 
								 pchVarName, sValue.c_str(), bDefault );
 | 
				
			||||||
 | 
						return bDefault;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool SetEnvironmentVariable( const char *pchVarName, const char *pchVarValue )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
						return 0 != SetEnvironmentVariableA( pchVarName, pchVarValue );
 | 
				
			||||||
 | 
					#elif defined(POSIX)
 | 
				
			||||||
 | 
						if( pchVarValue == NULL )
 | 
				
			||||||
 | 
							return 0 == unsetenv( pchVarName );
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return 0 == setenv( pchVarName, pchVarValue, 1 );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error "Unsupported Platform"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										8
									
								
								contrib/openvr/src/vrcommon/envvartools_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								contrib/openvr/src/vrcommon/envvartools_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,8 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string GetEnvironmentVariable( const char *pchVarName );
 | 
				
			||||||
 | 
					bool GetEnvironmentVariableAsBool( const char *pchVarName, bool bDefault );
 | 
				
			||||||
 | 
					bool SetEnvironmentVariable( const char *pchVarName, const char *pchVarValue );
 | 
				
			||||||
							
								
								
									
										338
									
								
								contrib/openvr/src/vrcommon/hmderrors_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										338
									
								
								contrib/openvr/src/vrcommon/hmderrors_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,338 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#include "openvr.h"
 | 
				
			||||||
 | 
					#include "hmderrors_public.h"
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using namespace vr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define RETURN_ENUM_AS_STRING(enumValue) case enumValue: return #enumValue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *GetEnglishStringForHmdError( vr::EVRInitError eError )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch( eError )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						case VRInitError_None:								return "No Error (0)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case VRInitError_Init_InstallationNotFound:			return "Installation Not Found (100)";
 | 
				
			||||||
 | 
						case VRInitError_Init_InstallationCorrupt:			return "Installation Corrupt (101)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRClientDLLNotFound:			return "vrclient Shared Lib Not Found (102)";
 | 
				
			||||||
 | 
						case VRInitError_Init_FileNotFound:					return "File Not Found (103)";
 | 
				
			||||||
 | 
						case VRInitError_Init_FactoryNotFound:				return "Factory Function Not Found (104)";
 | 
				
			||||||
 | 
						case VRInitError_Init_InterfaceNotFound:			return "Interface Not Found (105)";
 | 
				
			||||||
 | 
						case VRInitError_Init_InvalidInterface:				return "Invalid Interface (106)";
 | 
				
			||||||
 | 
						case VRInitError_Init_UserConfigDirectoryInvalid:	return "User Config Directory Invalid (107)";
 | 
				
			||||||
 | 
						case VRInitError_Init_HmdNotFound:					return "Hmd Not Found (108)";
 | 
				
			||||||
 | 
						case VRInitError_Init_NotInitialized:				return "Not Initialized (109)";
 | 
				
			||||||
 | 
						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_NoLogPath:					return "Log path could not be located (112)";
 | 
				
			||||||
 | 
						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_Retry:						return "Internal Retry (115)";
 | 
				
			||||||
 | 
						case VRInitError_Init_InitCanceledByUser:			return "User Canceled Init (116)";
 | 
				
			||||||
 | 
						case VRInitError_Init_AnotherAppLaunching:			return "Another app was already launching (117)";
 | 
				
			||||||
 | 
						case VRInitError_Init_SettingsInitFailed:			return "Settings manager init failed (118)";
 | 
				
			||||||
 | 
						case VRInitError_Init_ShuttingDown:					return "VR system shutting down (119)";
 | 
				
			||||||
 | 
						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_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_Internal:						return "vrserver internal error (124)";
 | 
				
			||||||
 | 
						case VRInitError_Init_HmdDriverIdIsNone:			return "Hmd DriverId is invalid (125)";
 | 
				
			||||||
 | 
						case VRInitError_Init_HmdNotFoundPresenceFailed:	return "Hmd Not Found Presence Failed (126)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRMonitorNotFound:			return "VR Monitor Not Found (127)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRMonitorStartupFailed:		return "VR Monitor startup failed (128)";
 | 
				
			||||||
 | 
						case VRInitError_Init_LowPowerWatchdogNotSupported: return "Low Power Watchdog Not Supported (129)";
 | 
				
			||||||
 | 
						case VRInitError_Init_InvalidApplicationType:		return "Invalid Application Type (130)";
 | 
				
			||||||
 | 
						case VRInitError_Init_NotAvailableToWatchdogApps:	return "Not available to watchdog apps (131)";
 | 
				
			||||||
 | 
						case VRInitError_Init_WatchdogDisabledInSettings:	return "Watchdog disabled in settings (132)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRDashboardNotFound:			return "VR Dashboard Not Found (133)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRDashboardStartupFailed:		return "VR Dashboard startup failed (134)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRHomeNotFound:				return "VR Home Not Found (135)";
 | 
				
			||||||
 | 
						case VRInitError_Init_VRHomeStartupFailed:			return "VR home startup failed (136)";
 | 
				
			||||||
 | 
						case VRInitError_Init_RebootingBusy:				return "Rebooting In Progress (137)";
 | 
				
			||||||
 | 
						case VRInitError_Init_FirmwareUpdateBusy:			return "Firmware Update In Progress (138)";
 | 
				
			||||||
 | 
						case VRInitError_Init_FirmwareRecoveryBusy:			return "Firmware Recovery In Progress (139)";
 | 
				
			||||||
 | 
						case VRInitError_Init_USBServiceBusy:				return "USB Service Busy (140)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case VRInitError_Driver_Failed:							return "Driver Failed (200)";
 | 
				
			||||||
 | 
						case VRInitError_Driver_Unknown:						return "Driver Not Known (201)";
 | 
				
			||||||
 | 
						case VRInitError_Driver_HmdUnknown:						return "HMD Not Known (202)";
 | 
				
			||||||
 | 
						case VRInitError_Driver_NotLoaded:						return "Driver Not Loaded (203)";
 | 
				
			||||||
 | 
						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_NotCalibrated:					return "Device is not calibrated (206)";
 | 
				
			||||||
 | 
						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_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_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_HmdDisplayNotFoundLaptop:		return "On laptop, HMD detected over USB, but Monitor not found (213)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case VRInitError_IPC_ServerInitFailed:						return "VR Server Init Failed (300)";
 | 
				
			||||||
 | 
						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_CompositorInitFailed:					return "Shared IPC Compositor Init Failed (303)";
 | 
				
			||||||
 | 
						case VRInitError_IPC_MutexInitFailed:						return "Shared IPC Mutex Init Failed (304)";
 | 
				
			||||||
 | 
						case VRInitError_IPC_Failed:								return "Shared IPC Failed (305)";
 | 
				
			||||||
 | 
						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_ConnectFailedAfterMultipleAttempts:	return "Shared IPC Connect Failed After Multiple Attempts (308)";
 | 
				
			||||||
 | 
						case VRInitError_IPC_ConnectFailedAfterTargetExited:		return "Shared IPC Connect Failed After Target Exited (309)";
 | 
				
			||||||
 | 
						case VRInitError_IPC_NamespaceUnavailable:					return "Shared IPC Namespace Unavailable (310)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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_FirmwareRequiresUpdate:	return "Compositor requires mandatory firmware update (402)";
 | 
				
			||||||
 | 
						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_UnableToCreateDevice:	return "Compositor unable to create graphics device (405)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Oculus
 | 
				
			||||||
 | 
						case VRInitError_VendorSpecific_UnableToConnectToOculusRuntime:	return "Unable to connect to Oculus Runtime (1000)";
 | 
				
			||||||
 | 
						case VRInitError_VendorSpecific_OculusRuntimeBadInstall:		return "Unable to connect to Oculus Runtime, possible bad install (1114)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Lighthouse
 | 
				
			||||||
 | 
						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_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_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_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_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_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_UserDataError:					return "HMD found, but problems with the data (1112)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case VRInitError_Steam_SteamInstallationNotFound: return "Unable to find Steam installation (2000)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return GetIDForVRInitError( eError );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *GetIDForVRInitError( vr::EVRInitError eError )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch( eError )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_None );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Unknown );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InstallationCorrupt );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRClientDLLNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_FileNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_FactoryNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InterfaceNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidInterface );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_UserConfigDirectoryInvalid );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_HmdNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NotInitialized );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_PathRegistryNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NoConfigPath );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NoLogPath );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_PathRegistryNotWritable );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_AppInfoInitFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_Retry );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InitCanceledByUser );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_AnotherAppLaunching );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_SettingsInitFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_ShuttingDown );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_TooManyObjects );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NoServerForBackgroundApp );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NotSupportedWithCompositor );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NotAvailableToUtilityApps );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_Internal );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_HmdDriverIdIsNone );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_HmdNotFoundPresenceFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRMonitorNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRMonitorStartupFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_LowPowerWatchdogNotSupported );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidApplicationType );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_NotAvailableToWatchdogApps );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_WatchdogDisabledInSettings );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRDashboardStartupFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRHomeNotFound );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRHomeStartupFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_RebootingBusy );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_FirmwareUpdateBusy );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_FirmwareRecoveryBusy );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_USBServiceBusy );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRWebHelperStartupFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_TrackerManagerInitFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_AlreadyRunning );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_FailedForVrMonitor);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_PropertyManagerInitFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_WebServerFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_IllegalTypeTransition );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_MismatchedRuntimes );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_InvalidProcessId );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_VRServiceStartupFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_PrismNeedsNewDrivers );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_PrismStartupTimedOut );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_CouldNotStartPrism );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_CreateDriverDirectDeviceFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Init_PrismExitedUnexpectedly );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_Failed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_Unknown );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdUnknown);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_NotLoaded);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_RuntimeOutOfDate);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdInUse);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_NotCalibrated);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_CalibrationInvalid);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFound);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_TrackedDeviceInterfaceUnknown );
 | 
				
			||||||
 | 
							// RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFoundAfterFix );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDriverIdOutOfBounds );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayMirrored );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Driver_HmdDisplayNotFoundLaptop );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_ServerInitFailed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_SharedStateInitFailed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorInitFailed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_MutexInitFailed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_Failed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorConnectFailed);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_CompositorInvalidConnectResponse);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailedAfterMultipleAttempts );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_ConnectFailedAfterTargetExited );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_IPC_NamespaceUnavailable );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_Failed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_D3D11HardwareRequired );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FirmwareRequiresUpdate );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_OverlayInitFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_ScreenshotsInitFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_UnableToCreateDevice );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_SharedStateIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_NotificationManagerIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_ResourceManagerClientIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_MessageOverlaySharedStateInitFailure );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_PropertiesInterfaceIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateFullscreenWindowFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_SettingsInterfaceIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToShowWindow );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_DistortInterfaceIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_DisplayFrequencyFailure );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_RendererInitializationFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_DXGIFactoryInterfaceIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_DXGIFactoryCreateFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_DXGIFactoryQueryFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_InvalidAdapterDesktop );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_InvalidHmdAttachment );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_InvalidOutputDesktop );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_InvalidDeviceProvided );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_D3D11RendererInitializationFailed );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToFindDisplayMode );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateSwapChain );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToGetBackBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateRenderTarget );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateDXGI2SwapChain );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedtoGetDXGI2BackBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateDXGI2RenderTarget );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToGetDXGIDeviceInterface );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_SelectDisplayMode );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateNvAPIRenderTargets );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_NvAPISetDisplayMode );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateDirectModeDisplay );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_InvalidHmdPropertyContainer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_UpdateDisplayFrequency );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateRasterizerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateWireframeRasterizerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateSamplerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateClampToBorderSamplerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateAnisoSamplerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlaySamplerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreatePanoramaSamplerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateFontSamplerState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateNoBlendState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateBlendState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateAlphaBlendState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateBlendStateMaskR );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateBlendStateMaskG );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateBlendStateMaskB );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateDepthStencilState );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateDepthStencilStateNoWrite );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateDepthStencilStateNoDepth );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateFlushTexture );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateDistortionSurfaces );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateHmdPoseConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateHmdPoseStagingConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateSharedFrameInfoConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateSceneTextureIndexConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateReadableSceneTextureIndexConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateLayerGraphicsTextureIndexConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateLayerComputeTextureIndexConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateLayerComputeSceneTextureIndexConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateComputeHmdPoseConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateGeomConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreatePanelMaskConstantBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreatePixelSimUBO );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateMSAARenderTextures );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateResolveRenderTextures );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateComputeResolveRenderTextures );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateDriverDirectModeResolveTextures );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_OpenDriverDirectModeResolveTextures );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateFallbackSyncTexture );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_ShareFallbackSyncTexture );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayIndexBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayVertexBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateTextVertexBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateTextIndexBuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateMirrorTextures );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateLastFrameRenderTexture );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateMirrorOverlay );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateVirtualDisplayBackbuffer );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_DisplayModeNotSupported );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayInvalidCall );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_CreateOverlayAlreadyInitialized );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_FailedToCreateMailbox );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_WindowInterfaceIsNull );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_SystemLayerCreateInstance );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Compositor_SystemLayerCreateSession );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Vendor-specific errors
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_UnableToConnectToOculusRuntime);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_WindowsNotInDevMode );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_OculusRuntimeBadInstall );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Lighthouse
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_CantOpenDevice);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToRequestConfigStart);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_NoStoredConfig);
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigFailedSanityCheck );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigTooBig );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_ConfigTooSmall );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToInitZLib );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_CantReadFirmwareVersion );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToSendUserDataStart );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataStart );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UnableToGetUserDataNext );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataAddressRange );
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_VendorSpecific_HmdFound_UserDataError );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							RETURN_ENUM_AS_STRING( VRInitError_Steam_SteamInstallationNotFound );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								static char buf[128];
 | 
				
			||||||
 | 
								sprintf( buf, "Unknown error (%d)", eError );
 | 
				
			||||||
 | 
								return buf;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								contrib/openvr/src/vrcommon/hmderrors_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								contrib/openvr/src/vrcommon/hmderrors_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *GetEnglishStringForHmdError( vr::EVRInitError eError );
 | 
				
			||||||
 | 
					const char *GetIDForVRInitError( vr::EVRInitError eError );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										988
									
								
								contrib/openvr/src/vrcommon/pathtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										988
									
								
								contrib/openvr/src/vrcommon/pathtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,988 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#include <vrcommon/strtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/pathtools_public.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32)
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#include <direct.h>
 | 
				
			||||||
 | 
					#include <shobjidl.h>
 | 
				
			||||||
 | 
					#include <knownfolders.h>
 | 
				
			||||||
 | 
					#include <shlobj.h>
 | 
				
			||||||
 | 
					#include <share.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef GetEnvironmentVariable
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <alloca.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined OSX
 | 
				
			||||||
 | 
					#include <Foundation/Foundation.h>
 | 
				
			||||||
 | 
					#include <AppKit/AppKit.h>
 | 
				
			||||||
 | 
					#include <mach-o/dyld.h>
 | 
				
			||||||
 | 
					#define _S_IFDIR S_IFDIR     // really from tier0/platform.h which we dont have yet
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the path (including filename) to the current executable */
 | 
				
			||||||
 | 
					std::string Path_GetExecutablePath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						wchar_t *pwchPath = new wchar_t[MAX_UNICODE_PATH];
 | 
				
			||||||
 | 
						char *pchPath = new char[MAX_UNICODE_PATH_IN_UTF8];
 | 
				
			||||||
 | 
						::GetModuleFileNameW( NULL, pwchPath, MAX_UNICODE_PATH );
 | 
				
			||||||
 | 
						WideCharToMultiByte( CP_UTF8, 0, pwchPath, -1, pchPath, MAX_UNICODE_PATH_IN_UTF8, NULL, NULL );
 | 
				
			||||||
 | 
						delete[] pwchPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sPath = pchPath;
 | 
				
			||||||
 | 
						delete[] pchPath;
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					#elif defined( OSX )
 | 
				
			||||||
 | 
						char rchPath[1024];
 | 
				
			||||||
 | 
						uint32_t nBuff = sizeof( rchPath );
 | 
				
			||||||
 | 
						bool bSuccess = _NSGetExecutablePath(rchPath, &nBuff) == 0;
 | 
				
			||||||
 | 
						rchPath[nBuff-1] = '\0';
 | 
				
			||||||
 | 
						if( bSuccess )
 | 
				
			||||||
 | 
							return rchPath;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					#elif defined LINUX
 | 
				
			||||||
 | 
						char rchPath[1024];
 | 
				
			||||||
 | 
						size_t nBuff = sizeof( rchPath );
 | 
				
			||||||
 | 
						ssize_t nRead = readlink("/proc/self/exe", rchPath, nBuff-1 );
 | 
				
			||||||
 | 
						if ( nRead != -1 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							rchPath[ nRead ] = 0;
 | 
				
			||||||
 | 
							return rchPath;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						AssertMsg( false, "Implement Plat_GetExecutablePath" );
 | 
				
			||||||
 | 
						return "";
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the path of the current working directory */
 | 
				
			||||||
 | 
					std::string Path_GetWorkingDirectory()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sPath;
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						wchar_t buf[MAX_UNICODE_PATH];
 | 
				
			||||||
 | 
						sPath = UTF16to8( _wgetcwd( buf, MAX_UNICODE_PATH ) );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						char buf[ 1024 ];
 | 
				
			||||||
 | 
						sPath = getcwd( buf, sizeof( buf ) );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Sets the path of the current working directory. Returns true if this was successful. */
 | 
				
			||||||
 | 
					bool Path_SetWorkingDirectory( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						bool bSuccess;
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						std::wstring wsPath = UTF8to16( sPath.c_str() );
 | 
				
			||||||
 | 
						bSuccess = 0 == _wchdir( wsPath.c_str() );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						bSuccess = 0 == chdir( sPath.c_str() );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						return bSuccess;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Gets the path to a temporary directory. */
 | 
				
			||||||
 | 
					std::string Path_GetTemporaryDirectory()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						wchar_t buf[MAX_UNICODE_PATH];
 | 
				
			||||||
 | 
						if ( GetTempPathW( MAX_UNICODE_PATH, buf ) == 0 )
 | 
				
			||||||
 | 
							return Path_GetWorkingDirectory();
 | 
				
			||||||
 | 
						return UTF16to8( buf );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						const char *pchTmpDir = getenv( "TMPDIR" );
 | 
				
			||||||
 | 
						if ( pchTmpDir == NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return pchTmpDir;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the specified path without its filename */
 | 
				
			||||||
 | 
					std::string Path_StripFilename( const std::string & sPath, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( slash == 0 )
 | 
				
			||||||
 | 
							slash = Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string::size_type n = sPath.find_last_of( slash );
 | 
				
			||||||
 | 
						if( n == std::string::npos )
 | 
				
			||||||
 | 
							return sPath;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return std::string( sPath.begin(), sPath.begin() + n );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns just the filename from the provided full or relative path. */
 | 
				
			||||||
 | 
					std::string Path_StripDirectory( const std::string & sPath, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( slash == 0 )
 | 
				
			||||||
 | 
							slash = Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string::size_type n = sPath.find_last_of( slash );
 | 
				
			||||||
 | 
						if( n == std::string::npos )
 | 
				
			||||||
 | 
							return sPath;
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return std::string( sPath.begin() + n + 1, sPath.end() );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns just the filename with no extension of the provided filename. 
 | 
				
			||||||
 | 
					* If there is a path the path is left intact. */
 | 
				
			||||||
 | 
					std::string Path_StripExtension( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						for( std::string::const_reverse_iterator i = sPath.rbegin(); i != sPath.rend(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( *i == '.' )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return std::string( sPath.begin(), i.base() - 1 );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// if we find a slash there is no extension
 | 
				
			||||||
 | 
							if( *i == '\\' || *i == '/' )
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// we didn't find an extension
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns just extension of the provided filename (if any). */
 | 
				
			||||||
 | 
					std::string Path_GetExtension( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						for ( std::string::const_reverse_iterator i = sPath.rbegin(); i != sPath.rend(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( *i == '.' )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return std::string( i.base(), sPath.end() );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// if we find a slash there is no extension
 | 
				
			||||||
 | 
							if ( *i == '\\' || *i == '/' )
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// we didn't find an extension
 | 
				
			||||||
 | 
						return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Path_IsAbsolute( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( sPath.empty() )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( WIN32 )
 | 
				
			||||||
 | 
						if ( sPath.size() < 3 ) // must be c:\x or \\x at least
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( sPath[1] == ':' ) // drive letter plus slash, but must test both slash cases
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( sPath[2] == '\\' || sPath[2] == '/' )
 | 
				
			||||||
 | 
								return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if ( sPath[0] == '\\' && sPath[1] == '\\' ) // UNC path
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						if( sPath[0] == '\\' || sPath[0] == '/' ) // any leading slash
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Makes an absolute path from a relative path and a base path */
 | 
				
			||||||
 | 
					std::string Path_MakeAbsolute( const std::string & sRelativePath, const std::string & sBasePath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( Path_IsAbsolute( sRelativePath ) )
 | 
				
			||||||
 | 
							return Path_Compact( sRelativePath );
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( !Path_IsAbsolute( sBasePath ) )
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::string sCompacted = Path_Compact( Path_Join( sBasePath, sRelativePath ) );
 | 
				
			||||||
 | 
							if( Path_IsAbsolute( sCompacted ) )
 | 
				
			||||||
 | 
								return sCompacted;
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Fixes the directory separators for the current platform */
 | 
				
			||||||
 | 
					std::string Path_FixSlashes( const std::string & sPath, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( slash == 0 )
 | 
				
			||||||
 | 
							slash = Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sFixed = sPath;
 | 
				
			||||||
 | 
						for( std::string::iterator i = sFixed.begin(); i != sFixed.end(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( *i == '/' || *i == '\\' )
 | 
				
			||||||
 | 
								*i = slash;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sFixed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char Path_GetSlash()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
						return '\\';
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return '/';
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Jams two paths together with the right kind of slash */
 | 
				
			||||||
 | 
					std::string Path_Join( const std::string & first, const std::string & second, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( slash == 0 )
 | 
				
			||||||
 | 
							slash = Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// only insert a slash if we don't already have one
 | 
				
			||||||
 | 
						std::string::size_type nLen = first.length();
 | 
				
			||||||
 | 
						if( !nLen )
 | 
				
			||||||
 | 
							return second;
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
						if( first.back() == '\\' || first.back() == '/' )
 | 
				
			||||||
 | 
						    nLen--;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						char last_char = first[first.length()-1];
 | 
				
			||||||
 | 
						if (last_char == '\\' || last_char == '/')
 | 
				
			||||||
 | 
						    nLen--;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return first.substr( 0, nLen ) + std::string( 1, slash ) + second;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string Path_Join( const std::string & first, const std::string & second, const std::string & third, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return Path_Join( Path_Join( first, second, slash ), third, slash );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string Path_Join( const std::string & first, const std::string & second, const std::string & third, const std::string &fourth, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return Path_Join( Path_Join( Path_Join( first, second, slash ), third, slash ), fourth, slash );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string Path_Join( 
 | 
				
			||||||
 | 
						const std::string & first, 
 | 
				
			||||||
 | 
						const std::string & second, 
 | 
				
			||||||
 | 
						const std::string & third, 
 | 
				
			||||||
 | 
						const std::string & fourth, 
 | 
				
			||||||
 | 
						const std::string & fifth, 
 | 
				
			||||||
 | 
						char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return Path_Join( Path_Join( Path_Join( Path_Join( first, second, slash ), third, slash ), fourth, slash ), fifth, slash );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string Path_RemoveTrailingSlash( const std::string & sRawPath, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( slash == 0 )
 | 
				
			||||||
 | 
							slash = Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sPath = sRawPath;
 | 
				
			||||||
 | 
						std::string::size_type nCurrent = sRawPath.length();
 | 
				
			||||||
 | 
						if ( nCurrent == 0 )
 | 
				
			||||||
 | 
							return sPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int nLastFound = -1;
 | 
				
			||||||
 | 
						nCurrent--;
 | 
				
			||||||
 | 
						while( nCurrent != 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( sRawPath[ nCurrent ] == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								nLastFound = (int)nCurrent;
 | 
				
			||||||
 | 
								nCurrent--;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
						if ( nLastFound >= 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sPath.erase( nLastFound, std::string::npos );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 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 */
 | 
				
			||||||
 | 
					std::string Path_Compact( const std::string & sRawPath, char slash )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( slash == 0 )
 | 
				
			||||||
 | 
							slash = Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sPath = Path_FixSlashes( sRawPath, slash );
 | 
				
			||||||
 | 
						std::string sSlashString( 1, slash );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// strip out all /./
 | 
				
			||||||
 | 
						for( std::string::size_type i = 0; (i + 3) < sPath.length();  )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( sPath[ i ] == slash && sPath[ i+1 ] == '.' && sPath[ i+2 ] == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								sPath.replace( i, 3, sSlashString );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								++i;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// get rid of trailing /. but leave the path separator
 | 
				
			||||||
 | 
						if( sPath.length() > 2 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::string::size_type len = sPath.length();
 | 
				
			||||||
 | 
							if( sPath[ len-1 ] == '.'  && sPath[ len-2 ] == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								sPath.pop_back();
 | 
				
			||||||
 | 
								//Not sure why the following line of code was used for a while.  It causes problems with strlen.
 | 
				
			||||||
 | 
								//sPath[len-1] = 0;  // for now, at least 
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// get rid of leading ./ 
 | 
				
			||||||
 | 
						if( sPath.length() > 2 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( sPath[ 0 ] == '.'  && sPath[ 1 ] == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								sPath.replace( 0, 2, "" );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// each time we encounter .. back up until we've found the previous directory name
 | 
				
			||||||
 | 
						// then get rid of both
 | 
				
			||||||
 | 
						std::string::size_type i = 0;
 | 
				
			||||||
 | 
						while( i < sPath.length() )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if( i > 0 && sPath.length() - i >= 2 
 | 
				
			||||||
 | 
								&& sPath[i] == '.'
 | 
				
			||||||
 | 
								&& sPath[i+1] == '.'
 | 
				
			||||||
 | 
								&& ( i + 2 == sPath.length() || sPath[ i+2 ] == slash )
 | 
				
			||||||
 | 
								&& sPath[ i-1 ] == slash )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// check if we've hit the start of the string and have a bogus path
 | 
				
			||||||
 | 
								if( i == 1 )
 | 
				
			||||||
 | 
									return "";
 | 
				
			||||||
 | 
								
 | 
				
			||||||
 | 
								// find the separator before i-1
 | 
				
			||||||
 | 
								std::string::size_type iDirStart = i-2;
 | 
				
			||||||
 | 
								while( iDirStart > 0 && sPath[ iDirStart - 1 ] != slash )
 | 
				
			||||||
 | 
									--iDirStart;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// remove everything from iDirStart to i+2
 | 
				
			||||||
 | 
								sPath.replace( iDirStart, (i - iDirStart) + 3, "" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// start over
 | 
				
			||||||
 | 
								i = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								++i;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns true if these two paths are the same without respect for internal . or ..
 | 
				
			||||||
 | 
					* sequences, slash type, or case (on case-insensitive platforms). */
 | 
				
			||||||
 | 
					bool Path_IsSamePath( const std::string & sPath1, const std::string & sPath2 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sCompact1 = Path_Compact( sPath1 );
 | 
				
			||||||
 | 
						std::string sCompact2 = Path_Compact( sPath2 );
 | 
				
			||||||
 | 
					#if defined(WIN32)
 | 
				
			||||||
 | 
						return !stricmp( sCompact1.c_str(), sCompact2.c_str() );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return !strcmp( sCompact1.c_str(), sCompact2.c_str() );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the path to the current DLL or exe */
 | 
				
			||||||
 | 
					std::string Path_GetThisModulePath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// gets the path of vrclient.dll itself
 | 
				
			||||||
 | 
					#ifdef WIN32
 | 
				
			||||||
 | 
						HMODULE hmodule = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						::GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, reinterpret_cast<LPCTSTR>(Path_GetThisModulePath), &hmodule );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						wchar_t *pwchPath = new wchar_t[MAX_UNICODE_PATH];
 | 
				
			||||||
 | 
						char *pchPath = new char[ MAX_UNICODE_PATH_IN_UTF8 ];
 | 
				
			||||||
 | 
						::GetModuleFileNameW( hmodule, pwchPath, MAX_UNICODE_PATH );
 | 
				
			||||||
 | 
						WideCharToMultiByte( CP_UTF8, 0, pwchPath, -1, pchPath, MAX_UNICODE_PATH_IN_UTF8, NULL, NULL );
 | 
				
			||||||
 | 
						delete[] pwchPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sPath = pchPath;
 | 
				
			||||||
 | 
						delete [] pchPath;
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined( OSX ) || defined( LINUX )
 | 
				
			||||||
 | 
						// get the addr of a function in vrclient.so and then ask the dlopen system about it
 | 
				
			||||||
 | 
						Dl_info info;
 | 
				
			||||||
 | 
						dladdr( (void *)Path_GetThisModulePath, &info );
 | 
				
			||||||
 | 
						return info.dli_fname;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns true if the specified path exists and is a directory */
 | 
				
			||||||
 | 
					bool Path_IsDirectory( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sFixedPath = Path_FixSlashes( sPath );
 | 
				
			||||||
 | 
						if( sFixedPath.empty() )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						char cLast = sFixedPath[ sFixedPath.length() - 1 ];
 | 
				
			||||||
 | 
						if( cLast == '/' || cLast == '\\' )
 | 
				
			||||||
 | 
							sFixedPath.erase( sFixedPath.end() - 1, sFixedPath.end() );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// see if the specified path actually exists.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(POSIX)
 | 
				
			||||||
 | 
						struct	stat	buf;
 | 
				
			||||||
 | 
						if ( stat( sFixedPath.c_str(), &buf ) == -1 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( LINUX ) || defined( OSX )
 | 
				
			||||||
 | 
						return S_ISDIR( buf.st_mode );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return (buf.st_mode & _S_IFDIR) != 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						struct	_stat	buf;
 | 
				
			||||||
 | 
						std::wstring wsFixedPath = UTF8to16( sFixedPath.c_str() );
 | 
				
			||||||
 | 
						if ( _wstat( wsFixedPath.c_str(), &buf ) == -1 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (buf.st_mode & _S_IFDIR) != 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns true if the specified path represents an app bundle */
 | 
				
			||||||
 | 
					bool Path_IsAppBundle( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined(OSX)
 | 
				
			||||||
 | 
						@autoreleasepool {
 | 
				
			||||||
 | 
							NSBundle *bundle = [ NSBundle bundleWithPath: [ NSString stringWithUTF8String:sPath.c_str() ] ];
 | 
				
			||||||
 | 
							bool bisAppBundle = ( nullptr != bundle );
 | 
				
			||||||
 | 
							return bisAppBundle;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: returns true if the the path exists
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool Path_Exists( const std::string & sPath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sFixedPath = Path_FixSlashes( sPath );
 | 
				
			||||||
 | 
						if( sFixedPath.empty() )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( WIN32 )
 | 
				
			||||||
 | 
						struct	_stat	buf;
 | 
				
			||||||
 | 
						std::wstring wsFixedPath = UTF8to16( sFixedPath.c_str() );
 | 
				
			||||||
 | 
						if ( _wstat( wsFixedPath.c_str(), &buf ) == -1 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						struct stat buf;
 | 
				
			||||||
 | 
						if ( stat ( sFixedPath.c_str(), &buf ) == -1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: helper to find a directory upstream from a given path
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string Path_FindParentDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string strFoundPath = "";
 | 
				
			||||||
 | 
						std::string strCurrentPath = Path_FixSlashes( strStartDirectory );
 | 
				
			||||||
 | 
						if ( strCurrentPath.length() == 0 )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool bExists = Path_Exists( strCurrentPath );
 | 
				
			||||||
 | 
						std::string strCurrentDirectoryName = Path_StripDirectory( strCurrentPath );
 | 
				
			||||||
 | 
						if ( bExists && stricmp( strCurrentDirectoryName.c_str(), strDirectoryName.c_str() ) == 0 )
 | 
				
			||||||
 | 
							return strCurrentPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while( bExists && strCurrentPath.length() != 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							strCurrentPath = Path_StripFilename( strCurrentPath );
 | 
				
			||||||
 | 
							strCurrentDirectoryName = Path_StripDirectory( strCurrentPath );
 | 
				
			||||||
 | 
							bExists = Path_Exists( strCurrentPath );
 | 
				
			||||||
 | 
							if ( bExists && stricmp( strCurrentDirectoryName.c_str(), strDirectoryName.c_str() ) == 0 )
 | 
				
			||||||
 | 
								return strCurrentPath;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return "";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: helper to find a subdirectory upstream from a given path
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string Path_FindParentSubDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string strFoundPath = "";
 | 
				
			||||||
 | 
						std::string strCurrentPath = Path_FixSlashes( strStartDirectory );
 | 
				
			||||||
 | 
						if ( strCurrentPath.length() == 0 )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool bExists = Path_Exists( strCurrentPath );
 | 
				
			||||||
 | 
						while( bExists && strCurrentPath.length() != 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							strCurrentPath = Path_StripFilename( strCurrentPath );
 | 
				
			||||||
 | 
							bExists = Path_Exists( strCurrentPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if( Path_Exists( Path_Join( strCurrentPath, strDirectoryName ) ) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								strFoundPath = Path_Join( strCurrentPath, strDirectoryName );
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return strFoundPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: reading and writing files in the vortex directory
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::vector<uint8_t> Path_ReadBinaryFile( const std::string & strFilename )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FILE *f;
 | 
				
			||||||
 | 
					#if defined( POSIX )
 | 
				
			||||||
 | 
						f = fopen( strFilename.c_str(), "rb" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						// the open operation needs to be sharable, therefore use of _wfsopen instead of _wfopen_s
 | 
				
			||||||
 | 
						f = _wfsopen( wstrFilename.c_str(), L"rb", _SH_DENYNO );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::vector<uint8_t> vecFileContents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( f != NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fseek( f, 0, SEEK_END );
 | 
				
			||||||
 | 
							int size = ftell( f );
 | 
				
			||||||
 | 
							fseek( f, 0, SEEK_SET );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							vecFileContents.resize( size );
 | 
				
			||||||
 | 
							if ( fread( &vecFileContents[ 0 ], size, 1, f ) == 1 )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								vecFileContents.clear();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fclose( f );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return vecFileContents ;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FILE *f;
 | 
				
			||||||
 | 
					#if defined( POSIX )
 | 
				
			||||||
 | 
						f = fopen( strFilename.c_str(), "rb" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						// the open operation needs to be sharable, therefore use of _wfsopen instead of _wfopen_s
 | 
				
			||||||
 | 
						f = _wfsopen( wstrFilename.c_str(), L"rb", _SH_DENYNO );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						unsigned char* buf = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( f != NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fseek(f, 0, SEEK_END);
 | 
				
			||||||
 | 
							int size = ftell(f);
 | 
				
			||||||
 | 
							fseek(f, 0, SEEK_SET);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							buf = new unsigned char[size];
 | 
				
			||||||
 | 
							if (buf && fread(buf, size, 1, f) == 1)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (pSize)
 | 
				
			||||||
 | 
									*pSize = size;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								delete[] buf;
 | 
				
			||||||
 | 
								buf = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fclose(f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t  Path_ReadBinaryFile( const std::string &strFilename, unsigned char *pBuffer, uint32_t unSize )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FILE *f;
 | 
				
			||||||
 | 
					#if defined( POSIX )
 | 
				
			||||||
 | 
						f = fopen( strFilename.c_str(), "rb" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						errno_t err = _wfopen_s( &f, wstrFilename.c_str(), L"rb" );
 | 
				
			||||||
 | 
						if ( err != 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							f = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uint32_t unSizeToReturn = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( f != NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							fseek( f, 0, SEEK_END );
 | 
				
			||||||
 | 
							uint32_t size = (uint32_t)ftell( f );
 | 
				
			||||||
 | 
							fseek( f, 0, SEEK_SET );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( size > unSize || !pBuffer )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								unSizeToReturn = (uint32_t)size;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if ( fread( pBuffer, size, 1, f ) == 1 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									unSizeToReturn = (uint32_t)size;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fclose( f );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return unSizeToReturn;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Path_WriteBinaryFile(const std::string &strFilename, unsigned char *pData, unsigned nSize)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FILE *f;
 | 
				
			||||||
 | 
					#if defined( POSIX )
 | 
				
			||||||
 | 
						f = fopen(strFilename.c_str(), "wb");
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						errno_t err = _wfopen_s( &f, wstrFilename.c_str(), L"wb" );
 | 
				
			||||||
 | 
						if (err != 0)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							f = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size_t written = 0;
 | 
				
			||||||
 | 
						if (f != NULL) {
 | 
				
			||||||
 | 
							written = fwrite(pData, sizeof(unsigned char), nSize, f);
 | 
				
			||||||
 | 
							fclose(f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return written == nSize ? true : false;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string Path_ReadTextFile( const std::string &strFilename )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// doing it this way seems backwards, but I don't
 | 
				
			||||||
 | 
						// see an easy way to do this with C/C++ style IO
 | 
				
			||||||
 | 
						// that isn't worse...
 | 
				
			||||||
 | 
						int size;
 | 
				
			||||||
 | 
						unsigned char* buf = Path_ReadBinaryFile( strFilename, &size );
 | 
				
			||||||
 | 
						if (!buf)
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// convert CRLF -> LF
 | 
				
			||||||
 | 
						size_t outsize = 1;
 | 
				
			||||||
 | 
						for (int i=1; i < size; i++)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if (buf[i] == '\n' && buf[i-1] == '\r') // CRLF
 | 
				
			||||||
 | 
								buf[outsize-1] = '\n'; // ->LF
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								buf[outsize++] = buf[i]; // just copy
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string ret((char *)buf, outsize);
 | 
				
			||||||
 | 
						delete[] buf;
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Path_MakeWritable( const std::string &strFilename )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined ( _WIN32 )
 | 
				
			||||||
 | 
						std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DWORD dwAttrs = GetFileAttributesW( wstrFilename.c_str() );
 | 
				
			||||||
 | 
						if ( dwAttrs != INVALID_FILE_ATTRIBUTES && ( dwAttrs & FILE_ATTRIBUTE_READONLY ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return SetFileAttributesW( wstrFilename.c_str(), dwAttrs & ~FILE_ATTRIBUTE_READONLY );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						struct stat sb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( stat( strFilename.c_str(), &sb ) == 0 && !( sb.st_mode & S_IWUSR ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return ( chmod( strFilename.c_str(), sb.st_mode | S_IWUSR ) == 0 );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Path_WriteStringToTextFile( const std::string &strFilename, const char *pchData )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FILE *f;
 | 
				
			||||||
 | 
					#if defined( POSIX )
 | 
				
			||||||
 | 
						f = fopen( strFilename.c_str(), "w" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						std::wstring wstrFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						errno_t err = _wfopen_s( &f, wstrFilename.c_str(), L"w" );
 | 
				
			||||||
 | 
						if ( err != 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							f = NULL;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						bool ok = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( f != NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							ok = fputs( pchData, f) >= 0;
 | 
				
			||||||
 | 
							fclose(f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ok;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool Path_WriteStringToTextFileAtomic( const std::string &strFilename, const char *pchData )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string strTmpFilename = strFilename + ".tmp";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( !Path_WriteStringToTextFile( strTmpFilename, pchData ) )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Platform specific atomic file replacement
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						std::wstring wsFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						std::wstring wsTmpFilename = UTF8to16( strTmpFilename.c_str() );
 | 
				
			||||||
 | 
						if ( !::ReplaceFileW( wsFilename.c_str(), wsTmpFilename.c_str(), nullptr, 0, 0, 0 ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// if we couldn't ReplaceFile, try a non-atomic write as a fallback
 | 
				
			||||||
 | 
							if ( !Path_WriteStringToTextFile( strFilename, pchData ) )
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#elif defined( POSIX )
 | 
				
			||||||
 | 
						if ( rename( strTmpFilename.c_str(), strFilename.c_str() ) == -1 )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#error Do not know how to write atomic file
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(WIN32)
 | 
				
			||||||
 | 
					#define FILE_URL_PREFIX "file:///"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define FILE_URL_PREFIX "file://"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ----------------------------------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Turns a path to a file on disk into a URL (or just returns the value if it's already a URL)
 | 
				
			||||||
 | 
					// ----------------------------------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string Path_FilePathToUrl( const std::string & sRelativePath, const std::string & sBasePath )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( StringHasPrefix( sRelativePath, "http://" )
 | 
				
			||||||
 | 
							|| StringHasPrefix( sRelativePath, "https://" )
 | 
				
			||||||
 | 
							|| StringHasPrefix( sRelativePath, "vr-input-workshop://" )
 | 
				
			||||||
 | 
							|| StringHasPrefix( sRelativePath, "file://" )
 | 
				
			||||||
 | 
						   )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return sRelativePath;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::string sAbsolute = Path_MakeAbsolute( sRelativePath, sBasePath );
 | 
				
			||||||
 | 
							if ( sAbsolute.empty() )
 | 
				
			||||||
 | 
								return sAbsolute;
 | 
				
			||||||
 | 
							sAbsolute = Path_FixSlashes( sAbsolute, '/' );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							size_t unBufferSize = sAbsolute.length() * 3;
 | 
				
			||||||
 | 
							char *pchBuffer = (char *)alloca( unBufferSize );
 | 
				
			||||||
 | 
							V_URLEncodeFullPath( pchBuffer, (int)unBufferSize, sAbsolute.c_str(), (int)sAbsolute.length() );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return std::string( FILE_URL_PREFIX ) + pchBuffer;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: 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 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( !strnicmp( sFileUrl.c_str(), FILE_URL_PREFIX, strlen( FILE_URL_PREFIX ) ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							char *pchBuffer = (char *)alloca( sFileUrl.length() );
 | 
				
			||||||
 | 
							V_URLDecodeNoPlusForSpace( pchBuffer, (int)sFileUrl.length(), 
 | 
				
			||||||
 | 
								sFileUrl.c_str() + strlen( FILE_URL_PREFIX ), (int)( sFileUrl.length() - strlen( FILE_URL_PREFIX ) ) );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return Path_FixSlashes( pchBuffer );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Returns the root of the directory the system wants us to store user documents in
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string GetUserDocumentsPath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( WIN32 )
 | 
				
			||||||
 | 
						WCHAR rwchPath[MAX_PATH];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( !SUCCEEDED( SHGetFolderPathW( NULL, CSIDL_MYDOCUMENTS | CSIDL_FLAG_CREATE, NULL, 0, rwchPath ) ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Convert the path to UTF-8 and store in the output
 | 
				
			||||||
 | 
						std::string sUserPath = UTF16to8( rwchPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sUserPath;
 | 
				
			||||||
 | 
					#elif defined( OSX )
 | 
				
			||||||
 | 
						@autoreleasepool {
 | 
				
			||||||
 | 
							NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
 | 
				
			||||||
 | 
							if ( [paths count] == 0 )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							return [[paths objectAtIndex:0] UTF8String];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#elif defined( LINUX )
 | 
				
			||||||
 | 
						// @todo: not solved/changed as part of OSX - still not real - just removed old class based steam cut and paste
 | 
				
			||||||
 | 
						const char *pchHome = getenv( "HOME" );
 | 
				
			||||||
 | 
						if ( pchHome == NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return pchHome;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: deletes / unlinks a single file
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool Path_UnlinkFile( const std::string &strFilename )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( WIN32 )
 | 
				
			||||||
 | 
						std::wstring wsFilename = UTF8to16( strFilename.c_str() );
 | 
				
			||||||
 | 
						return ( 0 != DeleteFileW( wsFilename.c_str() ) );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return ( 0 == unlink( strFilename.c_str() ) );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Limits the set of characters that are allowed in filenames
 | 
				
			||||||
 | 
					// -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string Path_SanitizeFilename( const std::string& sFilename )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sFixed = sFilename;
 | 
				
			||||||
 | 
						std::string::iterator iLastDot = sFixed.end();
 | 
				
			||||||
 | 
						for ( std::string::iterator i = sFixed.begin(); i != sFixed.end(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( *i == '.' )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								iLastDot = i;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// path-related characters are forbidden (except the last period)
 | 
				
			||||||
 | 
							switch ( *i )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								case '\0':
 | 
				
			||||||
 | 
								case '.':
 | 
				
			||||||
 | 
								case '\\':
 | 
				
			||||||
 | 
								case '/':
 | 
				
			||||||
 | 
								case ':':
 | 
				
			||||||
 | 
								case '|':
 | 
				
			||||||
 | 
								case '?':
 | 
				
			||||||
 | 
								case '>':
 | 
				
			||||||
 | 
								case '<':
 | 
				
			||||||
 | 
								case '&':
 | 
				
			||||||
 | 
								case '%':
 | 
				
			||||||
 | 
								case '@':
 | 
				
			||||||
 | 
								case '$':
 | 
				
			||||||
 | 
								case '*':
 | 
				
			||||||
 | 
								case '\"':
 | 
				
			||||||
 | 
									*i = '_';
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									if ( *i < 32 )
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										*i = '_';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( iLastDot != sFixed.end() && iLastDot != sFixed.begin() 
 | 
				
			||||||
 | 
							&& iLastDot+1 != sFixed.end() )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*iLastDot = '.';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sFixed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										153
									
								
								contrib/openvr/src/vrcommon/pathtools_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										153
									
								
								contrib/openvr/src/vrcommon/pathtools_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,153 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the path (including filename) to the current executable */
 | 
				
			||||||
 | 
					std::string Path_GetExecutablePath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the path of the current working directory */
 | 
				
			||||||
 | 
					std::string Path_GetWorkingDirectory();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Sets the path of the current working directory. Returns true if this was successful. */
 | 
				
			||||||
 | 
					bool Path_SetWorkingDirectory( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Gets the path to a temporary directory. */
 | 
				
			||||||
 | 
					std::string Path_GetTemporaryDirectory();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns the path (including filename) of the current shared lib or DLL */
 | 
				
			||||||
 | 
					std::string Path_GetThisModulePath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the specified path without its filename.
 | 
				
			||||||
 | 
					* If slash is unspecified the native path separator of the current platform
 | 
				
			||||||
 | 
					* will be used. */
 | 
				
			||||||
 | 
					std::string Path_StripFilename( const std::string & sPath, char slash = 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns just the filename from the provided full or relative path. */
 | 
				
			||||||
 | 
					std::string Path_StripDirectory( const std::string & sPath, char slash = 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns just the filename with no extension of the provided filename. 
 | 
				
			||||||
 | 
					* If there is a path the path is left intact. */
 | 
				
			||||||
 | 
					std::string Path_StripExtension( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns just extension of the provided filename (if any). */
 | 
				
			||||||
 | 
					std::string Path_GetExtension( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns true if the path is absolute */
 | 
				
			||||||
 | 
					bool Path_IsAbsolute( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Makes an absolute path from a relative path and a base path */
 | 
				
			||||||
 | 
					std::string Path_MakeAbsolute( const std::string & sRelativePath, const std::string & sBasePath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Fixes the directory separators for the current platform.
 | 
				
			||||||
 | 
					* If slash is unspecified the native path separator of the current platform
 | 
				
			||||||
 | 
					* will be used. */
 | 
				
			||||||
 | 
					std::string Path_FixSlashes( const std::string & sPath, char slash = 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the path separator for the current platform */
 | 
				
			||||||
 | 
					char Path_GetSlash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 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, 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, 
 | 
				
			||||||
 | 
						const std::string & fifth, 
 | 
				
			||||||
 | 
						char slash = 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 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.
 | 
				
			||||||
 | 
					* If slash is unspecified the native path separator of the current platform
 | 
				
			||||||
 | 
					* will be used. */
 | 
				
			||||||
 | 
					std::string Path_Compact( const std::string & sRawPath, char slash = 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns true if these two paths are the same without respect for internal . or ..
 | 
				
			||||||
 | 
					* sequences, slash type, or case (on case-insensitive platforms). */
 | 
				
			||||||
 | 
					bool Path_IsSamePath( const std::string & sPath1, const std::string & sPath2 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//** Removed trailing slashes */
 | 
				
			||||||
 | 
					std::string Path_RemoveTrailingSlash( const std::string & sRawPath, char slash = 0 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns true if the specified path exists and is a directory */
 | 
				
			||||||
 | 
					bool Path_IsDirectory( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns true if the specified path represents an app bundle */
 | 
				
			||||||
 | 
					bool Path_IsAppBundle( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns true if the the path exists */
 | 
				
			||||||
 | 
					bool Path_Exists( const std::string & sPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** 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_FindParentSubDirectoryRecursively( const std::string &strStartDirectory, const std::string &strDirectoryName );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Make a text file writable. */
 | 
				
			||||||
 | 
					bool Path_MakeWritable( const std::string &strFilename );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Path operations to read or write text/binary files */
 | 
				
			||||||
 | 
					unsigned char * Path_ReadBinaryFile( const std::string &strFilename, int *pSize );
 | 
				
			||||||
 | 
					uint32_t  Path_ReadBinaryFile( const std::string &strFilename, unsigned char *pBuffer, uint32_t unSize );
 | 
				
			||||||
 | 
					std::vector<uint8_t> Path_ReadBinaryFile( const std::string & strFilename );
 | 
				
			||||||
 | 
					bool Path_WriteBinaryFile( const std::string &strFilename, unsigned char *pData, unsigned nSize );
 | 
				
			||||||
 | 
					std::string Path_ReadTextFile( const std::string &strFilename );
 | 
				
			||||||
 | 
					bool Path_WriteStringToTextFile( 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 */
 | 
				
			||||||
 | 
					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 */
 | 
				
			||||||
 | 
					std::string Path_UrlToFilePath( const std::string & sFileUrl );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the root of the directory the system wants us to store user documents in */
 | 
				
			||||||
 | 
					std::string GetUserDocumentsPath();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** deletes / unlinks a single file */
 | 
				
			||||||
 | 
					bool Path_UnlinkFile( const std::string &strFilename );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string Path_SanitizeFilename( const std::string& sFilename );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MAX_UNICODE_PATH
 | 
				
			||||||
 | 
						#define MAX_UNICODE_PATH 32767
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MAX_UNICODE_PATH_IN_UTF8
 | 
				
			||||||
 | 
						#define MAX_UNICODE_PATH_IN_UTF8 (MAX_UNICODE_PATH * 4)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					#if defined(WIN32)
 | 
				
			||||||
 | 
					#define DYNAMIC_LIB_EXT	".dll"
 | 
				
			||||||
 | 
					#define PROGRAM_EXT ".exe"
 | 
				
			||||||
 | 
					#ifdef _WIN64
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"win64"
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"win32"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#elif defined(OSX)
 | 
				
			||||||
 | 
					#define DYNAMIC_LIB_EXT	".dylib"
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"osx32"
 | 
				
			||||||
 | 
					#define PROGRAM_EXT ""
 | 
				
			||||||
 | 
					#elif defined(LINUX)
 | 
				
			||||||
 | 
					#define DYNAMIC_LIB_EXT	".so"
 | 
				
			||||||
 | 
					#define PROGRAM_EXT ""
 | 
				
			||||||
 | 
					#if defined( LINUX32 )
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"linux32"
 | 
				
			||||||
 | 
					#elif defined( ANDROIDARM64 )
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"androidarm64" 
 | 
				
			||||||
 | 
					#elif defined( LINUXARM64 )
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"linuxarm64" 
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"linux64"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#warning "Unknown platform for PLATSUBDIR"
 | 
				
			||||||
 | 
					#define PLATSUBDIR	"unknown_platform"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										63
									
								
								contrib/openvr/src/vrcommon/sharedlibtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										63
									
								
								contrib/openvr/src/vrcommon/sharedlibtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#include <vrcommon/sharedlibtools_public.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(_WIN32)
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(POSIX)
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SharedLibHandle SharedLib_Load( const char *pchPath, uint32_t *pErrorCode )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						SharedLibHandle pHandle = nullptr;
 | 
				
			||||||
 | 
					#if defined( _WIN32)
 | 
				
			||||||
 | 
						pHandle = ( SharedLibHandle )LoadLibraryEx( pchPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );
 | 
				
			||||||
 | 
					#elif defined(POSIX)
 | 
				
			||||||
 | 
						pHandle = (SharedLibHandle) dlopen(pchPath, RTLD_LOCAL|RTLD_NOW);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( pErrorCode )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( pHandle == nullptr )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
					#if defined( _WIN32)
 | 
				
			||||||
 | 
								*pErrorCode = ( uint32_t ) GetLastError();
 | 
				
			||||||
 | 
					#elif defined(POSIX)
 | 
				
			||||||
 | 
								*pErrorCode = 1;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*pErrorCode = 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return pHandle;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( _WIN32)
 | 
				
			||||||
 | 
						return (void*)GetProcAddress( (HMODULE)lib, pchFunctionName );
 | 
				
			||||||
 | 
					#elif defined(POSIX)
 | 
				
			||||||
 | 
						return dlsym( lib, pchFunctionName );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void SharedLib_Unload( SharedLibHandle lib )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( !lib )
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					#if defined( _WIN32)
 | 
				
			||||||
 | 
						FreeLibrary( (HMODULE)lib );
 | 
				
			||||||
 | 
					#elif defined(POSIX)
 | 
				
			||||||
 | 
						dlclose( lib );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										12
									
								
								contrib/openvr/src/vrcommon/sharedlibtools_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										12
									
								
								contrib/openvr/src/vrcommon/sharedlibtools_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef void *SharedLibHandle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SharedLibHandle SharedLib_Load( const char *pchPath, uint32_t *pErrorCode = nullptr );
 | 
				
			||||||
 | 
					void *SharedLib_GetFunction( SharedLibHandle lib, const char *pchFunctionName);
 | 
				
			||||||
 | 
					void SharedLib_Unload( SharedLibHandle lib );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										606
									
								
								contrib/openvr/src/vrcommon/strtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										606
									
								
								contrib/openvr/src/vrcommon/strtools_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,606 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#include <vrcommon/strtools_public.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <sstream>
 | 
				
			||||||
 | 
					#include <codecvt>
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					#include <functional>
 | 
				
			||||||
 | 
					#include <locale>
 | 
				
			||||||
 | 
					#include <codecvt>
 | 
				
			||||||
 | 
					#include <stdarg.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( OSX ) || defined( LINUX )
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose:  stricmp -> strcasecmp bridge
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					int stricmp( const char *pStr1, const char *pStr2 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return strcasecmp( pStr1, pStr2 );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: strincmp -> strncasecmp bridge
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					int strnicmp( const char *pStr1, const char *pStr2, size_t unBufferLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return strncasecmp( pStr1, pStr2, unBufferLen );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose:
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool StringHasPrefix( const std::string & sString, const std::string & sPrefix )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 0 == strnicmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool StringHasPrefixCaseSensitive( const std::string & sString, const std::string & sPrefix )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return 0 == strncmp( sString.c_str(), sPrefix.c_str(), sPrefix.length() );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool StringHasSuffix( const std::string &sString, const std::string &sSuffix )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						size_t cStrLen = sString.length();
 | 
				
			||||||
 | 
						size_t cSuffixLen = sSuffix.length();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( cSuffixLen > cStrLen )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0 == stricmp( sStringSuffix.c_str(), sSuffix.c_str() );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool StringHasSuffixCaseSensitive( const std::string &sString, const std::string &sSuffix )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						size_t cStrLen = sString.length();
 | 
				
			||||||
 | 
						size_t cSuffixLen = sSuffix.length();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( cSuffixLen > cStrLen )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sStringSuffix = sString.substr( cStrLen - cSuffixLen, cSuffixLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0 == strncmp( sStringSuffix.c_str(), sSuffix.c_str(),cSuffixLen );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose:
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					typedef std::codecvt_utf8< wchar_t > convert_type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string UTF16to8(const wchar_t * in)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static std::wstring_convert< convert_type, wchar_t > s_converter;  // construction of this can be expensive (or even serialized) depending on locale
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						try
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return s_converter.to_bytes( in );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						catch ( ... )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return std::string();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string UTF16to8( const std::wstring & in ) { return UTF16to8( in.c_str() ); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::wstring UTF8to16(const char * in)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static std::wstring_convert< convert_type, wchar_t > s_converter;  // construction of this can be expensive (or even serialized) depending on locale
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						try
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return s_converter.from_bytes( in );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						catch ( ... )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return std::wstring();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::wstring UTF8to16( const std::string & in ) { return UTF8to16( in.c_str() ); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Format string to std::string converter
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string Format( const char *pchFormat, ... )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						static constexpr size_t k_ulMaxStackString = 4096;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						va_list args;
 | 
				
			||||||
 | 
						char pchBuffer[k_ulMaxStackString];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						va_start( args, pchFormat );
 | 
				
			||||||
 | 
						int unSize = vsnprintf( pchBuffer, sizeof( pchBuffer ), pchFormat, args );
 | 
				
			||||||
 | 
						va_end( args );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Something went fairly wrong
 | 
				
			||||||
 | 
						if ( unSize < 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//AssertMsg( false, "Format string parse failure" );
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Processing on the stack worked, success
 | 
				
			||||||
 | 
						if ( unSize < k_ulMaxStackString )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return pchBuffer;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If processing on the stack failed, fallback to a dynamic allocation
 | 
				
			||||||
 | 
						std::vector< char > vecChar{};
 | 
				
			||||||
 | 
						vecChar.resize( unSize + 1 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						va_start( args, pchFormat );
 | 
				
			||||||
 | 
						unSize = vsnprintf( vecChar.data(), vecChar.size(), pchFormat, args );
 | 
				
			||||||
 | 
						va_end( args );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Double check, just in case
 | 
				
			||||||
 | 
						if ( unSize < 0 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//AssertMsg( false, "Format string parse failure" );
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return vecChar.data();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Convert LPSTR in the default CodePage to UTF8
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string DefaultACPtoUTF8( const char *pszStr )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( GetACP() == CP_UTF8 )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return pszStr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::vector<wchar_t> vecBuf( strlen( pszStr ) + 1 ); // should be guaranteed to be enough
 | 
				
			||||||
 | 
							MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszStr, -1, vecBuf.data(), (int) vecBuf.size() );
 | 
				
			||||||
 | 
							return UTF16to8( vecBuf.data() );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// --------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose:
 | 
				
			||||||
 | 
					// --------------------------------------------------------------------
 | 
				
			||||||
 | 
					void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						strncpy( pchBuffer, pchSource, unBufferSizeBytes - 1 );
 | 
				
			||||||
 | 
						pchBuffer[unBufferSizeBytes - 1] = '\0';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// --------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: converts a string to upper case
 | 
				
			||||||
 | 
					// --------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string StringToUpper( const std::string & sString )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sOut;
 | 
				
			||||||
 | 
						sOut.reserve( sString.size() + 1 );
 | 
				
			||||||
 | 
						for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sOut.push_back( (char)toupper( *i ) );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sOut;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// --------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: converts a string to lower case
 | 
				
			||||||
 | 
					// --------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string StringToLower( const std::string & sString )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sOut;
 | 
				
			||||||
 | 
						sOut.reserve( sString.size() + 1 );
 | 
				
			||||||
 | 
						for( std::string::const_iterator i = sString.begin(); i != sString.end(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							sOut.push_back( (char)tolower( *i ) );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sOut;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint32_t ReturnStdString( const std::string & sValue, char *pchBuffer, uint32_t unBufferLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t unLen = (uint32_t)sValue.length() + 1;
 | 
				
			||||||
 | 
						if( !pchBuffer || !unBufferLen )
 | 
				
			||||||
 | 
							return unLen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( unBufferLen < unLen )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pchBuffer[0] = '\0';
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							memcpy( pchBuffer, sValue.c_str(), unLen );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return unLen;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns a std::string from a uint64_t */
 | 
				
			||||||
 | 
					std::string Uint64ToString( uint64_t ulValue )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						char buf[ 22 ];
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						sprintf_s( buf, "%llu", ulValue );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					    snprintf( buf, sizeof( buf ), "%llu", (long long unsigned int ) ulValue );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns a uint64_t from a string */
 | 
				
			||||||
 | 
					uint64_t StringToUint64( const std::string & sValue )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return strtoull( sValue.c_str(), NULL, 0 );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Helper for converting a numeric value to a hex digit, value should be 0-15.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					char cIntToHexDigit( int nValue )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//Assert( nValue >= 0 && nValue <= 15 );
 | 
				
			||||||
 | 
						return "0123456789ABCDEF"[ nValue & 15 ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Helper for converting a hex char value to numeric, return -1 if the char
 | 
				
			||||||
 | 
					//          is not a valid hex digit.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					int iHexCharToInt( char cValue )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int32_t iValue = cValue;
 | 
				
			||||||
 | 
						if ( (uint32_t)( iValue - '0' ) < 10 )
 | 
				
			||||||
 | 
							return iValue - '0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						iValue |= 0x20;
 | 
				
			||||||
 | 
						if ( (uint32_t)( iValue - 'a' ) < 6 )
 | 
				
			||||||
 | 
							return iValue - 'a' + 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return -1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: These define the set of characters to filter for components (which
 | 
				
			||||||
 | 
					//			need all the escaping we can muster) vs. paths (which don't want
 | 
				
			||||||
 | 
					//			/ and : escaped so we don't break less compliant URL handling code.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					static bool CharNeedsEscape_Component( const char c )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (!(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z') && !(c >= '0' && c <= '9')
 | 
				
			||||||
 | 
							&& c != '-' && c != '_' && c != '.');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					static bool CharNeedsEscape_FullPath( const char c )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return (!(c >= 'a' && c <= 'z') && !(c >= 'A' && c <= 'Z') && !(c >= '0' && c <= '9')
 | 
				
			||||||
 | 
							&& c != '-' && c != '_' && c != '.' && c != '/' && c != ':' );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Internal implementation of encode, works in the strict RFC manner, or
 | 
				
			||||||
 | 
					//          with spaces turned to + like HTML form encoding.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					void V_URLEncodeInternal( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen, 
 | 
				
			||||||
 | 
						bool bUsePlusForSpace, std::function< bool(const char)> fnNeedsEscape )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						//AssertMsg( nDestLen > 3*nSourceLen, "Target buffer for V_URLEncode should be 3x source length, plus one for terminating null\n" );
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						int iDestPos = 0;
 | 
				
			||||||
 | 
						for ( int i=0; i < nSourceLen; ++i )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// worst case we need 3 additional chars
 | 
				
			||||||
 | 
							if( (iDestPos+3) > nDestLen  )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								pchDest[0] = '\0';
 | 
				
			||||||
 | 
					//			AssertMsg( false, "Target buffer too short\n" );
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 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.
 | 
				
			||||||
 | 
							// Current specs also allow '~', but that is forbidden under original RFC 1738.
 | 
				
			||||||
 | 
							if ( fnNeedsEscape( pchSource[i] ) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if ( bUsePlusForSpace && pchSource[i] == ' ' )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									pchDest[iDestPos++] = '+';
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									pchDest[iDestPos++] = '%';
 | 
				
			||||||
 | 
									uint8_t iValue = pchSource[i];
 | 
				
			||||||
 | 
									if ( iValue == 0 )
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										pchDest[iDestPos++] = '0';
 | 
				
			||||||
 | 
										pchDest[iDestPos++] = '0';
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										char cHexDigit1 = cIntToHexDigit( iValue % 16 );
 | 
				
			||||||
 | 
										iValue /= 16;
 | 
				
			||||||
 | 
										char cHexDigit2 = cIntToHexDigit( iValue );
 | 
				
			||||||
 | 
										pchDest[iDestPos++] = cHexDigit2;
 | 
				
			||||||
 | 
										pchDest[iDestPos++] = cHexDigit1;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								pchDest[iDestPos++] = pchSource[i];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( (iDestPos+1) > nDestLen )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pchDest[0] = '\0';
 | 
				
			||||||
 | 
							//AssertMsg( false, "Target buffer too short to terminate\n" );
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Null terminate
 | 
				
			||||||
 | 
						pchDest[iDestPos++] = 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Internal implementation of decode, works in the strict RFC manner, or
 | 
				
			||||||
 | 
					//          with spaces turned to + like HTML form encoding.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//			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 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if ( nDecodeDestLen < nEncodedSourceLen )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							//AssertMsg( false, "V_URLDecode needs a dest buffer at least as large as the source" );
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int iDestPos = 0;
 | 
				
			||||||
 | 
						for( int i=0; i < nEncodedSourceLen; ++i )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( bUsePlusForSpace && pchEncodedSource[i] == '+' )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								pchDecodeDest[ iDestPos++ ] = ' ';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if ( pchEncodedSource[i] == '%' )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// 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
 | 
				
			||||||
 | 
								if ( i < nEncodedSourceLen - 2 )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									char cHexDigit1 = pchEncodedSource[i+1];
 | 
				
			||||||
 | 
									char cHexDigit2 = pchEncodedSource[i+2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// 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,
 | 
				
			||||||
 | 
									// even though this really shouldn't happen, who knows what bad clients
 | 
				
			||||||
 | 
									// may do with encoding.
 | 
				
			||||||
 | 
									bool bValid = false;
 | 
				
			||||||
 | 
									int iValue = iHexCharToInt( cHexDigit1 );
 | 
				
			||||||
 | 
									if ( iValue != -1 )
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										iValue *= 16;
 | 
				
			||||||
 | 
										int iValue2 = iHexCharToInt( cHexDigit2 );
 | 
				
			||||||
 | 
										if ( iValue2 != -1 )
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											iValue += iValue2;
 | 
				
			||||||
 | 
											pchDecodeDest[ iDestPos++ ] = (char)iValue;
 | 
				
			||||||
 | 
											bValid = true;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									if ( !bValid )
 | 
				
			||||||
 | 
									{
 | 
				
			||||||
 | 
										pchDecodeDest[ iDestPos++ ] = '%';
 | 
				
			||||||
 | 
										pchDecodeDest[ iDestPos++ ] = cHexDigit1;
 | 
				
			||||||
 | 
										pchDecodeDest[ iDestPos++ ] = cHexDigit2;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Skip ahead
 | 
				
			||||||
 | 
								i += 2;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								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
 | 
				
			||||||
 | 
						// go ahead and do it as this can avoid bugs.
 | 
				
			||||||
 | 
						if ( iDestPos < nDecodeDestLen )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							pchDecodeDest[iDestPos] = 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (size_t)iDestPos;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					//          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.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return V_URLEncodeInternal( pchDest, nDestLen, pchSource, nSourceLen, true, CharNeedsEscape_Component );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void V_URLEncodeNoPlusForSpace( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return V_URLEncodeInternal( pchDest, nDestLen, pchSource, nSourceLen, false, CharNeedsEscape_Component );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void V_URLEncodeFullPath( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return V_URLEncodeInternal( pchDest, nDestLen, pchSource, nSourceLen, false, CharNeedsEscape_FullPath );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					//          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 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 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return V_URLDecodeInternal( pchDecodeDest, nDecodeDestLen, pchEncodedSource, nEncodedSourceLen, true );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					size_t V_URLDecodeNoPlusForSpace( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return V_URLDecodeInternal( pchDecodeDest, nDecodeDestLen, pchEncodedSource, nEncodedSourceLen, false );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					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 
 | 
				
			||||||
 | 
						// directory specifier like ../../somedir/./blah.
 | 
				
			||||||
 | 
						std::string::size_type test = in.rfind( '.' );
 | 
				
			||||||
 | 
						if ( test != std::string::npos )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// This handles things like ".\blah" or "c:\my@email.com\abc\def\geh"
 | 
				
			||||||
 | 
							// Which would otherwise wind up with "" and "c:\my@email", respectively.
 | 
				
			||||||
 | 
							if ( in.rfind( '\\' ) < test && in.rfind( '/' ) < test )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								in.resize( test );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Tokenizes a string into a vector of strings
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::vector<std::string> TokenizeString( const std::string & sString, char cToken )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::vector<std::string> vecStrings;
 | 
				
			||||||
 | 
						std::istringstream stream( sString );
 | 
				
			||||||
 | 
						std::string s;
 | 
				
			||||||
 | 
						while ( std::getline( stream, s, cToken ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							vecStrings.push_back( s );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( !sString.empty() && sString.back() == cToken )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							vecStrings.push_back( "" );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return vecStrings;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Repairs a should-be-UTF-8 string to a for-sure-is-UTF-8 string, plus return boolean if we subbed in '?' somewhere
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool RepairUTF8( const char *pbegin, const char *pend, std::string & sOutputUtf8 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						typedef std::codecvt_utf8<char32_t> facet_type;
 | 
				
			||||||
 | 
						facet_type myfacet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::mbstate_t mystate = std::mbstate_t();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sOutputUtf8.clear();
 | 
				
			||||||
 | 
						sOutputUtf8.reserve( pend - pbegin );
 | 
				
			||||||
 | 
						bool bSqueakyClean = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const char *pmid = pbegin;
 | 
				
			||||||
 | 
						while ( pmid != pend )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							bool bHasError = false;
 | 
				
			||||||
 | 
							bool bHasValidData = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							char32_t out = 0xdeadbeef, *pout;
 | 
				
			||||||
 | 
							pbegin = pmid;
 | 
				
			||||||
 | 
							switch ( myfacet.in( mystate, pbegin, pend, pmid, &out, &out + 1, pout ) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
							case facet_type::ok:
 | 
				
			||||||
 | 
								bHasValidData = true;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case facet_type::noconv:
 | 
				
			||||||
 | 
								// unexpected! always converting type
 | 
				
			||||||
 | 
								bSqueakyClean = false;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case facet_type::partial:
 | 
				
			||||||
 | 
								bHasError = pbegin == pmid;
 | 
				
			||||||
 | 
								if ( bHasError )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									bSqueakyClean = false;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									bHasValidData = true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case facet_type::error:
 | 
				
			||||||
 | 
								bHasError = true;
 | 
				
			||||||
 | 
								bSqueakyClean = false;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( bHasValidData )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								// could convert back, but no need
 | 
				
			||||||
 | 
								for ( const char *p = pbegin; p != pmid; ++p )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									sOutputUtf8 += *p;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( bHasError )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								sOutputUtf8 += '?';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if ( pmid == pbegin )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								pmid++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return bSqueakyClean;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Repairs a should-be-UTF-8 string to a for-sure-is-UTF-8 string, plus return boolean if we subbed in '?' somewhere
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool RepairUTF8( const std::string & sInputUtf8, std::string & sOutputUtf8 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return RepairUTF8( sInputUtf8.data(), sInputUtf8.data() + sInputUtf8.size(), sOutputUtf8 );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										154
									
								
								contrib/openvr/src/vrcommon/strtools_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										154
									
								
								contrib/openvr/src/vrcommon/strtools_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,154 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns true if the string has the prefix */
 | 
				
			||||||
 | 
					bool StringHasPrefix( 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 */
 | 
				
			||||||
 | 
					bool StringHasSuffix( 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 */
 | 
				
			||||||
 | 
					std::string UTF16to8( const wchar_t * in );
 | 
				
			||||||
 | 
					std::string UTF16to8( const std::wstring & in );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** converts a UTF-8 string to a UTF-16 string */
 | 
				
			||||||
 | 
					std::wstring UTF8to16(const char * in);
 | 
				
			||||||
 | 
					std::wstring UTF8to16( const std::string & in );
 | 
				
			||||||
 | 
					#define Utf16FromUtf8 UTF8to16
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
					std::string DefaultACPtoUTF8( const char *pszStr );
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Repairs a should-be-UTF-8 string to a for-sure-is-UTF-8 string, plus return boolean if we subbed in '?' somewhere */
 | 
				
			||||||
 | 
					bool RepairUTF8( const char *begin, const char *end, std::string & sOutputUtf8 );
 | 
				
			||||||
 | 
					bool RepairUTF8( const std::string & sInputUtf8, std::string & sOutputUtf8 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** safely copy a string into a buffer */
 | 
				
			||||||
 | 
					void strcpy_safe( char *pchBuffer, size_t unBufferSizeBytes, const char *pchSource );
 | 
				
			||||||
 | 
					template< size_t bufferSize >
 | 
				
			||||||
 | 
					void strcpy_safe( char (& buffer) [ bufferSize ], const char *pchSource ) 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						strcpy_safe( buffer, bufferSize, pchSource );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Turns printf-style format args into a std::string */
 | 
				
			||||||
 | 
					std::string Format( const char *pchFormat, ... );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** converts a string to upper case */
 | 
				
			||||||
 | 
					std::string StringToUpper( const std::string & sString );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** converts a string to lower case */
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					#if defined( OSX ) || defined( LINUX )
 | 
				
			||||||
 | 
					int stricmp(const char *pStr1, const char *pStr2);
 | 
				
			||||||
 | 
					#ifndef _stricmp
 | 
				
			||||||
 | 
					#define _stricmp stricmp
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					int strnicmp( const char *pStr1, const char *pStr2, size_t unBufferLen );
 | 
				
			||||||
 | 
					#ifndef _strnicmp
 | 
				
			||||||
 | 
					#define _strnicmp strnicmp
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _vsnprintf_s
 | 
				
			||||||
 | 
					#define _vsnprintf_s vsnprintf
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _TRUNCATE ((size_t)-1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( OSX )
 | 
				
			||||||
 | 
					// behaviors ensure NULL-termination at least as well as _TRUNCATE does, but
 | 
				
			||||||
 | 
					// 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)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return wcslcpy(strDest, strSource, numberOfElements);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline errno_t strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return strlcpy(strDest, strSource, numberOfElements);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( LINUX )
 | 
				
			||||||
 | 
					// this implementation does not return whether or not the destination was 
 | 
				
			||||||
 | 
					// truncated, but that is straightforward to fix if anybody actually needs the
 | 
				
			||||||
 | 
					// return code. 
 | 
				
			||||||
 | 
					#include "string.h"
 | 
				
			||||||
 | 
					inline void wcsncpy_s(wchar_t *strDest, size_t numberOfElements, const wchar_t *strSource, size_t count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						wcsncpy(strDest, strSource, numberOfElements);
 | 
				
			||||||
 | 
						strDest[numberOfElements-1] = '\0';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					inline void strncpy_s(char *strDest, size_t numberOfElements, const char *strSource, size_t count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						strncpy(strDest, strSource, numberOfElements);
 | 
				
			||||||
 | 
						strDest[numberOfElements-1] = '\0';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32 ) && _MSC_VER < 1800
 | 
				
			||||||
 | 
					inline uint64_t strtoull(const char *str, char **endptr, int base) { return _strtoui64( str, endptr, base ); }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* 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 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns a std::string from a uint64_t */
 | 
				
			||||||
 | 
					std::string Uint64ToString( uint64_t ulValue );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** returns a uint64_t from a string */
 | 
				
			||||||
 | 
					uint64_t StringToUint64( const std::string & sValue );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					//          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.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					void V_URLEncode( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Same as V_URLEncode, but without plus for space. */
 | 
				
			||||||
 | 
					void V_URLEncodeNoPlusForSpace( char *pchDest, int nDestLen, const char *pchSource, int nSourceLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Same as V_URLEncodeNoPlusForSpace, but without escaping / and : */
 | 
				
			||||||
 | 
					void V_URLEncodeFullPath( 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.  
 | 
				
			||||||
 | 
					//          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.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//          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.
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					size_t V_URLDecode( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Same as V_URLDecode, but without plus for space. */
 | 
				
			||||||
 | 
					size_t V_URLDecodeNoPlusForSpace( char *pchDecodeDest, int nDecodeDestLen, const char *pchEncodedSource, int nEncodedSourceLen );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: strip extension from a path
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					void V_StripExtension( std::string &in );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Tokenizes a string into a vector of strings */
 | 
				
			||||||
 | 
					std::vector<std::string> TokenizeString( const std::string & sString, char cToken );
 | 
				
			||||||
							
								
								
									
										483
									
								
								contrib/openvr/src/vrcommon/vrpathregistry_public.cpp
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										483
									
								
								contrib/openvr/src/vrcommon/vrpathregistry_public.cpp
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,483 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <vrcommon/vrpathregistry_public.h>
 | 
				
			||||||
 | 
					#include <json/json.h>
 | 
				
			||||||
 | 
					#include <vrcommon/pathtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/envvartools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/strtools_public.h>
 | 
				
			||||||
 | 
					#include <vrcommon/dirtools_public.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( WIN32 )
 | 
				
			||||||
 | 
					#include <windows.h>
 | 
				
			||||||
 | 
					#include <shlobj.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#undef GetEnvironmentVariable
 | 
				
			||||||
 | 
					#elif defined OSX
 | 
				
			||||||
 | 
					#include <Foundation/Foundation.h>
 | 
				
			||||||
 | 
					#include <AppKit/AppKit.h>
 | 
				
			||||||
 | 
					#elif defined(LINUX)
 | 
				
			||||||
 | 
					#include <dlfcn.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <algorithm>
 | 
				
			||||||
 | 
					#include <sstream>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef VRLog
 | 
				
			||||||
 | 
						#if defined( __MINGW32__ )
 | 
				
			||||||
 | 
							#define VRLog(args...)		fprintf(stderr, args)
 | 
				
			||||||
 | 
						#elif defined( WIN32 )
 | 
				
			||||||
 | 
							#define VRLog(fmt, ...)		fprintf(stderr, fmt, __VA_ARGS__)
 | 
				
			||||||
 | 
						#else
 | 
				
			||||||
 | 
							#define VRLog(args...)		fprintf(stderr, args)
 | 
				
			||||||
 | 
						#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Returns the root of the directory the system wants us to store user config data in */
 | 
				
			||||||
 | 
					static std::string GetAppSettingsPath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( WIN32 )
 | 
				
			||||||
 | 
						WCHAR rwchPath[MAX_PATH];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( !SUCCEEDED( SHGetFolderPathW( NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, rwchPath ) ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Convert the path to UTF-8 and store in the output
 | 
				
			||||||
 | 
						std::string sUserPath = UTF16to8( rwchPath );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sUserPath;
 | 
				
			||||||
 | 
					#elif defined( OSX )
 | 
				
			||||||
 | 
						std::string sSettingsDir;
 | 
				
			||||||
 | 
						@autoreleasepool {
 | 
				
			||||||
 | 
							// Search for the path
 | 
				
			||||||
 | 
							NSArray *paths = NSSearchPathForDirectoriesInDomains( NSApplicationSupportDirectory, NSUserDomainMask, YES );
 | 
				
			||||||
 | 
							if ( [paths count] == 0 )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							NSString *resolvedPath = [paths objectAtIndex:0];
 | 
				
			||||||
 | 
							resolvedPath = [resolvedPath stringByAppendingPathComponent: @"OpenVR"];
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if ( ![[NSFileManager defaultManager] createDirectoryAtPath: resolvedPath withIntermediateDirectories:YES attributes:nil error:nil] )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							sSettingsDir.assign( [resolvedPath UTF8String] );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sSettingsDir;
 | 
				
			||||||
 | 
					#elif defined( LINUX )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// As defined by XDG Base Directory Specification 
 | 
				
			||||||
 | 
						// https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const char *pchHome = getenv("XDG_CONFIG_HOME");
 | 
				
			||||||
 | 
						if ( ( pchHome != NULL) && ( pchHome[0] != '\0' ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return pchHome;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//
 | 
				
			||||||
 | 
						// XDG_CONFIG_HOME is not defined, use ~/.config instead
 | 
				
			||||||
 | 
						// 
 | 
				
			||||||
 | 
						pchHome = getenv( "HOME" );
 | 
				
			||||||
 | 
						if ( pchHome == NULL )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sUserPath( pchHome );
 | 
				
			||||||
 | 
						sUserPath = Path_Join( sUserPath, ".config" );
 | 
				
			||||||
 | 
						return sUserPath;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						#warning "Unsupported platform"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Constructor
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					CVRPathRegistry_Public::CVRPathRegistry_Public()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Computes the registry filename
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string CVRPathRegistry_Public::GetOpenVRConfigPath()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sConfigPath = GetAppSettingsPath();
 | 
				
			||||||
 | 
						if( sConfigPath.empty() )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32 ) || defined( LINUX )
 | 
				
			||||||
 | 
						sConfigPath = Path_Join( sConfigPath, "openvr" );
 | 
				
			||||||
 | 
					#elif defined ( OSX ) 
 | 
				
			||||||
 | 
						sConfigPath = Path_Join( sConfigPath, ".openvr" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						#warning "Unsupported platform"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						sConfigPath = Path_FixSlashes( sConfigPath );
 | 
				
			||||||
 | 
						return sConfigPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose:
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string CVRPathRegistry_Public::GetVRPathRegistryFilename()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sOverridePath = GetEnvironmentVariable( "VR_PATHREG_OVERRIDE" );
 | 
				
			||||||
 | 
						if ( !sOverridePath.empty() )
 | 
				
			||||||
 | 
							return sOverridePath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sPath = GetOpenVRConfigPath();
 | 
				
			||||||
 | 
						if ( sPath.empty() )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined( _WIN32 )
 | 
				
			||||||
 | 
						sPath = Path_Join( sPath, "openvrpaths.vrpath" );
 | 
				
			||||||
 | 
					#elif defined ( POSIX ) 
 | 
				
			||||||
 | 
						sPath = Path_Join( sPath, "openvrpaths.vrpath" );
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						#error "Unsupported platform"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						sPath = Path_FixSlashes( sPath );
 | 
				
			||||||
 | 
						return sPath;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Converts JSON to a history array
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					static void ParseStringListFromJson( std::vector< std::string > *pvecHistory, const Json::Value & root, const char *pchArrayName )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( !root.isMember( pchArrayName ) )
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						const Json::Value & arrayNode = root[ pchArrayName ];
 | 
				
			||||||
 | 
						if( !arrayNode )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							VRLog( "VR Path Registry node %s is not an array\n", pchArrayName );
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pvecHistory->clear();
 | 
				
			||||||
 | 
						pvecHistory->reserve( arrayNode.size() );
 | 
				
			||||||
 | 
						for( uint32_t unIndex = 0; unIndex < arrayNode.size(); unIndex++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							std::string sPath( arrayNode[ unIndex ].asString() );
 | 
				
			||||||
 | 
							pvecHistory->push_back( sPath );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Converts a history array to JSON
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					static void StringListToJson( const std::vector< std::string > & vecHistory, Json::Value & root, const char *pchArrayName )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Json::Value & arrayNode = root[ pchArrayName ];
 | 
				
			||||||
 | 
						for( auto i = vecHistory.begin(); i != vecHistory.end(); i++ )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							arrayNode.append( *i );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose:
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool CVRPathRegistry_Public::ToJsonString( std::string &sJsonString )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sRegPath = GetVRPathRegistryFilename();
 | 
				
			||||||
 | 
						if( sRegPath.empty() )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						std::string sRegistryContents = Path_ReadTextFile( sRegPath );
 | 
				
			||||||
 | 
						if( sRegistryContents.empty() )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sJsonString = sRegistryContents;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Loads the config file from its well known location
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool CVRPathRegistry_Public::BLoadFromFile( std::string *psLoadError )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sRegPath = GetVRPathRegistryFilename();
 | 
				
			||||||
 | 
						if( sRegPath.empty() )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( psLoadError )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLoadError = "Unable to determine VR Path Registry filename";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string sRegistryContents = Path_ReadTextFile( sRegPath );
 | 
				
			||||||
 | 
						if( sRegistryContents.empty() )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( psLoadError )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLoadError = "Unable to read VR Path Registry from " + sRegPath;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Json::Value root;
 | 
				
			||||||
 | 
						Json::CharReaderBuilder builder;
 | 
				
			||||||
 | 
						std::istringstream istream( sRegistryContents );
 | 
				
			||||||
 | 
						std::string sErrors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						try {
 | 
				
			||||||
 | 
							if ( !parseFromStream( builder, istream, &root, &sErrors ) )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if ( psLoadError )
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									*psLoadError = "Unable to parse " + sRegPath + ": " + sErrors;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return false;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ParseStringListFromJson( &m_vecRuntimePath, root, "runtime" );
 | 
				
			||||||
 | 
							ParseStringListFromJson( &m_vecConfigPath, root, "config" );
 | 
				
			||||||
 | 
							ParseStringListFromJson( &m_vecLogPath, root, "log" );
 | 
				
			||||||
 | 
							if ( root.isMember( "external_drivers" ) && root["external_drivers"].isArray() )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ParseStringListFromJson( &m_vecExternalDrivers, root, "external_drivers" );
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						catch ( ... )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							if ( psLoadError )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLoadError = "Unable to parse " + sRegPath + ": exception thrown in JSON library";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Saves the config file to its well known location
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool CVRPathRegistry_Public::BSaveToFile() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sRegPath = GetVRPathRegistryFilename();
 | 
				
			||||||
 | 
						if( sRegPath.empty() )
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						Json::Value root;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						root[ "version" ] = 1;
 | 
				
			||||||
 | 
						root[ "jsonid" ] = "vrpathreg";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						StringListToJson( m_vecRuntimePath, root, "runtime" );
 | 
				
			||||||
 | 
						StringListToJson( m_vecConfigPath, root, "config" );
 | 
				
			||||||
 | 
						StringListToJson( m_vecLogPath, root, "log" );
 | 
				
			||||||
 | 
						StringListToJson( m_vecExternalDrivers, root, "external_drivers" );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Json::StreamWriterBuilder builder;
 | 
				
			||||||
 | 
						std::string sRegistryContents = Json::writeString( builder, root );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// make sure the directory we're writing into actually exists
 | 
				
			||||||
 | 
						std::string sRegDirectory = Path_StripFilename( sRegPath );
 | 
				
			||||||
 | 
						if( !BCreateDirectoryRecursive( sRegDirectory.c_str() ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							VRLog( "Unable to create path registry directory %s\n", sRegDirectory.c_str() );
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( !Path_WriteStringToTextFile( sRegPath, sRegistryContents.c_str() ) )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							VRLog( "Unable to write VR path registry to %s\n", sRegPath.c_str() );
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Returns the current runtime path or NULL if no path is configured.
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string CVRPathRegistry_Public::GetRuntimePath() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( m_vecRuntimePath.empty() )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return m_vecRuntimePath.front().c_str();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Returns the current config path or NULL if no path is configured.
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string CVRPathRegistry_Public::GetConfigPath() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( m_vecConfigPath.empty() )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return m_vecConfigPath.front().c_str();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Returns the current log path or NULL if no path is configured.
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					std::string CVRPathRegistry_Public::GetLogPath() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if( m_vecLogPath.empty() )
 | 
				
			||||||
 | 
							return "";
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							return m_vecLogPath.front().c_str();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ---------------------------------------------------------------------------
 | 
				
			||||||
 | 
					// Purpose: Returns paths using the path registry and the provided override 
 | 
				
			||||||
 | 
					//			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 )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						std::string sLoadError;
 | 
				
			||||||
 | 
						CVRPathRegistry_Public pathReg;
 | 
				
			||||||
 | 
						bool bLoadedRegistry = pathReg.BLoadFromFile( &sLoadError );
 | 
				
			||||||
 | 
						int nCountEnvironmentVariables = 0;
 | 
				
			||||||
 | 
						int nRequestedPaths = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( psRuntimePath )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							nRequestedPaths++;
 | 
				
			||||||
 | 
							if ( GetEnvironmentVariable( k_pchRuntimeOverrideVar ).length() != 0 )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psRuntimePath = GetEnvironmentVariable( k_pchRuntimeOverrideVar );
 | 
				
			||||||
 | 
								nCountEnvironmentVariables++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if( !pathReg.GetRuntimePath().empty() )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psRuntimePath = pathReg.GetRuntimePath();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psRuntimePath = "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( psConfigPath )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							nRequestedPaths++;
 | 
				
			||||||
 | 
							if ( GetEnvironmentVariable( k_pchConfigOverrideVar ).length() != 0 )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psConfigPath = GetEnvironmentVariable( k_pchConfigOverrideVar );
 | 
				
			||||||
 | 
								nCountEnvironmentVariables++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if( pchConfigPathOverride )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psConfigPath = pchConfigPathOverride;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if( !pathReg.GetConfigPath().empty() )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psConfigPath = pathReg.GetConfigPath();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psConfigPath = "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if( psLogPath )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							nRequestedPaths++;
 | 
				
			||||||
 | 
							if ( GetEnvironmentVariable( k_pchLogOverrideVar ).length() != 0 )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLogPath = GetEnvironmentVariable( k_pchLogOverrideVar );
 | 
				
			||||||
 | 
								nCountEnvironmentVariables++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if( pchLogPathOverride )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLogPath = pchLogPathOverride;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else if( !pathReg.GetLogPath().empty() )
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLogPath = pathReg.GetLogPath();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								*psLogPath = "";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( pvecExternalDrivers )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							*pvecExternalDrivers = pathReg.m_vecExternalDrivers;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ( nCountEnvironmentVariables == nRequestedPaths )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							// all three environment variables were set, so we don't need the physical file
 | 
				
			||||||
 | 
							return true;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else if( !bLoadedRegistry )
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							VRLog( "%s\n", sLoadError.c_str() );
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return bLoadedRegistry;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					uint32_t CVRPathRegistry_Public::GetSteamAppId()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if !defined( REL_BRANCH_ONLY )
 | 
				
			||||||
 | 
						uint32_t nSteamAppId = k_unSteamVRMainAppId;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						uint32_t nSteamAppId = k_unSteamVRAppId;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nSteamAppId;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					bool CVRPathRegistry_Public::IsSteamVRMain()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#if defined( REL_BRANCH_ONLY )
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					//-----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					uint32_t CVRPathRegistry_Public::InitSteamAppId()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t nSteamAppId = CVRPathRegistry_Public::GetSteamAppId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Forcefully setting to what it should be before SteamAPI_Init() since SteamVR is more often
 | 
				
			||||||
 | 
						// started as child processes of the game app and otherwise Steam then considers us as the
 | 
				
			||||||
 | 
						// wrong app id.
 | 
				
			||||||
 | 
						SetEnvironmentVariable( "SteamAppId", std::to_string( nSteamAppId ).c_str() );
 | 
				
			||||||
 | 
						SetEnvironmentVariable( "SteamGameId", std::to_string( nSteamAppId ).c_str() );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nSteamAppId;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										52
									
								
								contrib/openvr/src/vrcommon/vrpathregistry_public.h
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										52
									
								
								contrib/openvr/src/vrcommon/vrpathregistry_public.h
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,52 @@
 | 
				
			||||||
 | 
					//========= Copyright Valve Corporation ============//
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <vector>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *k_pchRuntimeOverrideVar = "VR_OVERRIDE";
 | 
				
			||||||
 | 
					static const char *k_pchConfigOverrideVar = "VR_CONFIG_PATH";
 | 
				
			||||||
 | 
					static const char *k_pchLogOverrideVar = "VR_LOG_PATH";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const uint32_t k_unSteamVRAppId = 250820;
 | 
				
			||||||
 | 
					static const uint32_t k_unSteamVRMainAppId = 330050;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CVRPathRegistry_Public
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						static std::string GetVRPathRegistryFilename();
 | 
				
			||||||
 | 
						static std::string GetOpenVRConfigPath();
 | 
				
			||||||
 | 
						static uint32_t GetSteamAppId();
 | 
				
			||||||
 | 
						static bool IsSteamVRMain();
 | 
				
			||||||
 | 
						static uint32_t InitSteamAppId();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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 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 );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool BLoadFromFile( std::string *psError = nullptr );
 | 
				
			||||||
 | 
						bool BSaveToFile() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						bool ToJsonString( std::string &sJsonString );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// methods to get the current values
 | 
				
			||||||
 | 
						std::string GetRuntimePath() const;
 | 
				
			||||||
 | 
						std::string GetConfigPath() const;
 | 
				
			||||||
 | 
						std::string GetLogPath() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
						typedef std::vector< std::string > StringVector_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// index 0 is the current setting
 | 
				
			||||||
 | 
						StringVector_t m_vecRuntimePath;
 | 
				
			||||||
 | 
						StringVector_t m_vecLogPath;
 | 
				
			||||||
 | 
						StringVector_t m_vecConfigPath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// full list of external drivers
 | 
				
			||||||
 | 
						StringVector_t m_vecExternalDrivers;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue