1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1120a5c465cf17718743e5c5758baf9266bbb6d852pbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h" 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 131ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <assert.h> 14151f6f2b95bc99093ecaf0d41e1843f0c0c1a547henrike@webrtc.org 15151f6f2b95bc99093ecaf0d41e1843f0c0c1a547henrike@webrtc.org#ifdef WIN32 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <direct.h> 171ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <tchar.h> 181ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <windows.h> 1927103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org#include <algorithm> 201ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org 211ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include "webrtc/system_wrappers/interface/utf_util_win.h" 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define GET_CURRENT_DIR _getcwd 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <unistd.h> 251ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org 261ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define GET_CURRENT_DIR getcwd 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <sys/stat.h> // To check for directory existence. 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef S_ISDIR // Not defined in stat.h on Windows. 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 353f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <stdio.h> 361ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#include <stdlib.h> 373f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <string.h> 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 3920a5c465cf17718743e5c5758baf9266bbb6d852pbos@webrtc.org#include "webrtc/typedefs.h" // For architecture defines 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace test { 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 44e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgnamespace { 45e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WIN32 47e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kPathDelimiter = "\\"; 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 49e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kPathDelimiter = "/"; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID 53e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kResourcesDirName = "resources"; 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// The file we're looking for to identify the project root dir. 56e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kProjectRootFileName = "DEPS"; 57e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kResourcesDirName = "resources"; 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 60e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kFallbackPath = "./"; 61e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kOutputDirName = "out"; 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgchar relative_dir_path[FILENAME_MAX]; 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool relative_dir_path_set = false; 64e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org 65e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org} // namespace 66e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org 67e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgconst char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR"; 68e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org 69e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgstd::string OutputPathAndroid(); 70f9c7018a0b8ae48b1b921e69041f7281750dbf9dpbos@webrtc.orgstd::string ProjectRootPathAndroid(); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetExecutablePath(const std::string& path) { 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string working_dir = WorkingDir(); 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string temp_path = path; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Handle absolute paths; convert them to relative paths to the working dir. 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (path.find(working_dir) != std::string::npos) { 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org temp_path = path.substr(working_dir.length() + 1); 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 8027103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org // On Windows, when tests are run under memory tools like DrMemory and TSan, 8127103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org // slashes occur in the path as directory separators. Make sure we replace 8227103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org // such cases with backslashes in order for the paths to be correct. 8327103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org#ifdef WIN32 8427103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org std::replace(temp_path.begin(), temp_path.end(), '/', '\\'); 8527103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org#endif 8627103e5917380fd80091701876bb16f33a9d72f8kjellander@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Trim away the executable name; only store the relative dir path. 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org temp_path = temp_path.substr(0, temp_path.find_last_of(kPathDelimiter)); 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org strncpy(relative_dir_path, temp_path.c_str(), FILENAME_MAX); 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org relative_dir_path_set = true; 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool FileExists(std::string& file_name) { 94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org struct stat file_info = {0}; 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return stat(file_name.c_str(), &file_info) == 0; 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 98e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.orgstd::string OutputPathImpl() { 99e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org std::string path = ProjectRootPath(); 100e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org if (path == kCannotFindProjectRootDir) { 101e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org return kFallbackPath; 102e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org } 103e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org path += kOutputDirName; 1041ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org if (!CreateDir(path)) { 105e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org return kFallbackPath; 106e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org } 107e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org return path + kPathDelimiter; 108e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org} 109e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ANDROID 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string ProjectRootPath() { 113f9c7018a0b8ae48b1b921e69041f7281750dbf9dpbos@webrtc.org return ProjectRootPathAndroid(); 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string OutputPath() { 117e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org return OutputPathAndroid(); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string WorkingDir() { 121e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org return ProjectRootPath(); 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else // WEBRTC_ANDROID 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string ProjectRootPath() { 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string path = WorkingDir(); 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (path == kFallbackPath) { 129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kCannotFindProjectRootDir; 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (relative_dir_path_set) { 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org path = path + kPathDelimiter + relative_dir_path; 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check for our file that verifies the root dir. 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org size_t path_delimiter_index = path.find_last_of(kPathDelimiter); 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while (path_delimiter_index != std::string::npos) { 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string root_filename = path + kPathDelimiter + kProjectRootFileName; 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (FileExists(root_filename)) { 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return path + kPathDelimiter; 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Move up one directory in the directory tree. 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org path = path.substr(0, path_delimiter_index); 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org path_delimiter_index = path.find_last_of(kPathDelimiter); 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Reached the root directory. 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fprintf(stderr, "Cannot find project root directory!\n"); 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kCannotFindProjectRootDir; 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string OutputPath() { 151e25e28fb459b42a69797400b4a2df89e58b65f2bhenrike@webrtc.org return OutputPathImpl(); 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string WorkingDir() { 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org char path_buffer[FILENAME_MAX]; 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) { 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fprintf(stderr, "Cannot get current directory!\n"); 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return kFallbackPath; 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else { 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return std::string(path_buffer); 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // !WEBRTC_ANDROID 165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 1661ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org// Generate a temporary filename in a safe way. 1671ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org// Largely copied from talk/base/{unixfilesystem,win32filesystem}.cc. 1681ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orgstd::string TempFilename(const std::string &dir, const std::string &prefix) { 1691ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#ifdef WIN32 1701ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org wchar_t filename[MAX_PATH]; 1711ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org if (::GetTempFileName(ToUtf16(dir).c_str(), 1721ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org ToUtf16(prefix).c_str(), 0, filename) != 0) 1731ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org return ToUtf8(filename); 1741ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org assert(false); 1751ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org return ""; 1761ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#else 1771ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org int len = dir.size() + prefix.size() + 2 + 6; 1781ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org scoped_ptr<char[]> tempname(new char[len]); 1791ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org 1801ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org snprintf(tempname.get(), len, "%s/%sXXXXXX", dir.c_str(), 1811ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org prefix.c_str()); 1821ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org int fd = ::mkstemp(tempname.get()); 1831ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org if (fd == -1) { 1841ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org assert(false); 1851ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org return ""; 1861ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org } else { 1871ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org ::close(fd); 1881ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org } 1891ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org std::string ret(tempname.get()); 1901ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org return ret; 1911ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org#endif 1921ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org} 1931ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.org 1941ed7008c34205d4f606ed4436c3bdd8902c4428akjellander@webrtc.orgbool CreateDir(std::string directory_name) { 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org struct stat path_info = {0}; 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Check if the path exists already: 197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (stat(directory_name.c_str(), &path_info) == 0) { 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (!S_ISDIR(path_info.st_mode)) { 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fprintf(stderr, "Path %s exists but is not a directory! Remove this " 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org "file and re-run to create the directory.\n", 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org directory_name.c_str()); 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return false; 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else { 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WIN32 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return _mkdir(directory_name.c_str()) == 0; 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return mkdir(directory_name.c_str(), S_IRWXU | S_IRWXG | S_IRWXO) == 0; 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return true; 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstd::string ResourcePath(std::string name, std::string extension) { 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string platform = "win"; 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_LINUX 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org platform = "linux"; 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_LINUX 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_MAC 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org platform = "mac"; 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MAC 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_ARCH_64_BITS 224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string architecture = "64"; 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string architecture = "32"; 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_ARCH_64_BITS 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string resources_path = ProjectRootPath() + kResourcesDirName + 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org kPathDelimiter; 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org std::string resource_file = resources_path + name + "_" + platform + "_" + 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org architecture + "." + extension; 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (FileExists(resource_file)) { 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return resource_file; 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Try without architecture. 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org resource_file = resources_path + name + "_" + platform + "." + extension; 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (FileExists(resource_file)) { 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return resource_file; 240b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 241b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Try without platform. 242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org resource_file = resources_path + name + "_" + architecture + "." + extension; 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (FileExists(resource_file)) { 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return resource_file; 245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Fall back on name without architecture or platform. 248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return resources_path + name + "." + extension; 249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgsize_t GetFileSize(std::string filename) { 252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FILE* f = fopen(filename.c_str(), "rb"); 253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org size_t size = 0; 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (f != NULL) { 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (fseek(f, 0, SEEK_END) == 0) { 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org size = ftell(f); 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org fclose(f); 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return size; 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace test 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 265