17951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org/* 27a281a563452715e48724b07725f2a2fa34dcca3andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 37951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org * 47951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org * Use of this source code is governed by a BSD-style license 57951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org * that can be found in the LICENSE file in the root of the source 67951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org * tree. An additional intellectual property rights grant can be found 77951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org * in the file PATENTS. All contributing project authors may 87951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org * be found in the AUTHORS file in the root of the source tree. 97951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org */ 107951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org 1134741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h" 127951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org 137de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <assert.h> 14f2aafe4355c4b7ecbd122798f08a5c5ec5d2693ahenrike@webrtc.org 15f2aafe4355c4b7ecbd122798f08a5c5ec5d2693ahenrike@webrtc.org#ifdef WIN32 167951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#include <direct.h> 177de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <tchar.h> 187de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <windows.h> 19de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org#include <algorithm> 207de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org 2198f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/utf_util_win.h" 227951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#define GET_CURRENT_DIR _getcwd 237951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#else 247951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#include <unistd.h> 257de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org 2600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org#include "webrtc/base/scoped_ptr.h" 277951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#define GET_CURRENT_DIR getcwd 284d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#endif 294d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org 304d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#include <sys/stat.h> // To check for directory existence. 314d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#ifndef S_ISDIR // Not defined in stat.h on Windows. 324d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) 337951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org#endif 347951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org 3512dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <stdio.h> 367de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#include <stdlib.h> 3712dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <string.h> 387951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org 3934741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include "webrtc/typedefs.h" // For architecture defines 404ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 417951e819af005e0c45a19367c549984d67509969kjellander@webrtc.orgnamespace webrtc { 427951e819af005e0c45a19367c549984d67509969kjellander@webrtc.orgnamespace test { 437951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org 441d34fe979c52e5826c5c8162759b0167b2607836henrika#if defined(WEBRTC_IOS) 451d34fe979c52e5826c5c8162759b0167b2607836henrika// Defined in iosfileutils.mm. No header file to discourage use elsewhere. 461d34fe979c52e5826c5c8162759b0167b2607836henrikastd::string IOSResourcePath(std::string name, std::string extension); 471d34fe979c52e5826c5c8162759b0167b2607836henrika#endif 481d34fe979c52e5826c5c8162759b0167b2607836henrika 4934773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgnamespace { 5034773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org 514d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#ifdef WIN32 5234773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kPathDelimiter = "\\"; 534d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#else 5434773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kPathDelimiter = "/"; 554d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#endif 56363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 57363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#ifdef WEBRTC_ANDROID 5872fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kRootDirName = "/sdcard/"; 59363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#else 601e10bb32b92798012338bf8b44ba990b9904128dandrew@webrtc.org// The file we're looking for to identify the project root dir. 6134773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kProjectRootFileName = "DEPS"; 6272fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kOutputDirName = "out"; 6372fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kFallbackPath = "./"; 64fb59442c4048c443f23b8f581db5bc85f34947e9leozwang@webrtc.org#endif 651d34fe979c52e5826c5c8162759b0167b2607836henrika#if !defined(WEBRTC_IOS) 6672fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.orgconst char* kResourcesDirName = "resources"; 671d34fe979c52e5826c5c8162759b0167b2607836henrika#endif 681e10bb32b92798012338bf8b44ba990b9904128dandrew@webrtc.org 6983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.orgchar relative_dir_path[FILENAME_MAX]; 7083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.orgbool relative_dir_path_set = false; 7134773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org 7234773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org} // namespace 7334773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org 7434773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.orgconst char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR"; 7534773d9b6bcb3105ded58e1569bc15f3cd3b99d6henrike@webrtc.org 76193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.orgvoid SetExecutablePath(const std::string& path) { 77193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org std::string working_dir = WorkingDir(); 78193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org std::string temp_path = path; 79193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org 80193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org // Handle absolute paths; convert them to relative paths to the working dir. 81193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org if (path.find(working_dir) != std::string::npos) { 82193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org temp_path = path.substr(working_dir.length() + 1); 83193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org } 84de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org // On Windows, when tests are run under memory tools like DrMemory and TSan, 85de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org // slashes occur in the path as directory separators. Make sure we replace 86de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org // such cases with backslashes in order for the paths to be correct. 87de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org#ifdef WIN32 88de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org std::replace(temp_path.begin(), temp_path.end(), '/', '\\'); 89de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org#endif 90de499669ef49ec851ef18ef45c13dc2698bd20dfkjellander@webrtc.org 91193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org // Trim away the executable name; only store the relative dir path. 92193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org temp_path = temp_path.substr(0, temp_path.find_last_of(kPathDelimiter)); 9383b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org strncpy(relative_dir_path, temp_path.c_str(), FILENAME_MAX); 9483b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org relative_dir_path_set = true; 9583b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org} 9683b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org 9783b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.orgbool FileExists(std::string& file_name) { 98f81b46177164dd722b6b3ad4093f1718b91e564fGlenn Kasten struct stat file_info = {0, 0}; 9983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org return stat(file_name.c_str(), &file_info) == 0; 10083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org} 10183b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org 102363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#ifdef WEBRTC_ANDROID 103363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 104363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.orgstd::string ProjectRootPath() { 10572fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org return kRootDirName; 106363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org} 107363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 108363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.orgstd::string OutputPath() { 10972fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org return kRootDirName; 110363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org} 111363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 112363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.orgstd::string WorkingDir() { 11372fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org return kRootDirName; 114363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org} 115363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 116363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#else // WEBRTC_ANDROID 117363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 1180db7dc6e18e24294a57d4efc2ea5280ea025a830andrew@webrtc.orgstd::string ProjectRootPath() { 11983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org std::string path = WorkingDir(); 12083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org if (path == kFallbackPath) { 1217951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org return kCannotFindProjectRootDir; 1227951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org } 12383b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org if (relative_dir_path_set) { 12483b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org path = path + kPathDelimiter + relative_dir_path; 12583b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org } 1267951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org // Check for our file that verifies the root dir. 127193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org size_t path_delimiter_index = path.find_last_of(kPathDelimiter); 128193600b7cfc793cf6a2f35a0a000ca564e00ea34kjellander@webrtc.org while (path_delimiter_index != std::string::npos) { 12983b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org std::string root_filename = path + kPathDelimiter + kProjectRootFileName; 13083b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org if (FileExists(root_filename)) { 13183b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org return path + kPathDelimiter; 1327951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org } 1337951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org // Move up one directory in the directory tree. 13483b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org path = path.substr(0, path_delimiter_index); 13583b767b0f517d7a6afb77dfdfa6e4dc6f1c344cekjellander@webrtc.org path_delimiter_index = path.find_last_of(kPathDelimiter); 1367951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org } 1377951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org // Reached the root directory. 1387951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org fprintf(stderr, "Cannot find project root directory!\n"); 1397951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org return kCannotFindProjectRootDir; 1407951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org} 1417951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org 1420db7dc6e18e24294a57d4efc2ea5280ea025a830andrew@webrtc.orgstd::string OutputPath() { 14372fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org std::string path = ProjectRootPath(); 14472fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org if (path == kCannotFindProjectRootDir) { 14572fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org return kFallbackPath; 14672fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org } 14772fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org path += kOutputDirName; 14872fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org if (!CreateDir(path)) { 14972fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org return kFallbackPath; 15072fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org } 15172fd33935274d7f2a018feabc2f85c18c54f8393kjellander@webrtc.org return path + kPathDelimiter; 1524ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org} 1534ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 1544ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.orgstd::string WorkingDir() { 1554ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org char path_buffer[FILENAME_MAX]; 1564ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) { 1574ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org fprintf(stderr, "Cannot get current directory!\n"); 1584ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return kFallbackPath; 1595b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org } else { 1604ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return std::string(path_buffer); 1614ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org } 1624ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org} 1634ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 164363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org#endif // !WEBRTC_ANDROID 165363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 1667de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org// Generate a temporary filename in a safe way. 1677de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org// Largely copied from talk/base/{unixfilesystem,win32filesystem}.cc. 1687de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.orgstd::string TempFilename(const std::string &dir, const std::string &prefix) { 1697de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#ifdef WIN32 1707de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org wchar_t filename[MAX_PATH]; 1717de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org if (::GetTempFileName(ToUtf16(dir).c_str(), 1727de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org ToUtf16(prefix).c_str(), 0, filename) != 0) 1737de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org return ToUtf8(filename); 1747de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org assert(false); 1757de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org return ""; 1767de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#else 1777de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org int len = dir.size() + prefix.size() + 2 + 6; 17800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org rtc::scoped_ptr<char[]> tempname(new char[len]); 1797de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org 1807de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org snprintf(tempname.get(), len, "%s/%sXXXXXX", dir.c_str(), 1817de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org prefix.c_str()); 1827de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org int fd = ::mkstemp(tempname.get()); 1837de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org if (fd == -1) { 1847de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org assert(false); 1857de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org return ""; 1867de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org } else { 1877de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org ::close(fd); 1887de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org } 1897de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org std::string ret(tempname.get()); 1907de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org return ret; 1917de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org#endif 1927de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org} 1937de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.org 1947de47bce12a19edfe1f968822ef93f92e779476dkjellander@webrtc.orgbool CreateDir(std::string directory_name) { 195f81b46177164dd722b6b3ad4093f1718b91e564fGlenn Kasten struct stat path_info = {0, 0}; 1964d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org // Check if the path exists already: 1974ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org if (stat(directory_name.c_str(), &path_info) == 0) { 1984d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org if (!S_ISDIR(path_info.st_mode)) { 1994ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org fprintf(stderr, "Path %s exists but is not a directory! Remove this " 2004ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org "file and re-run to create the directory.\n", 2014ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org directory_name.c_str()); 2024ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return false; 2034d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org } 2044d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org } else { 2054d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#ifdef WIN32 2064ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return _mkdir(directory_name.c_str()) == 0; 2074d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#else 2084ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return mkdir(directory_name.c_str(), S_IRWXU | S_IRWXG | S_IRWXO) == 0; 2094d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org#endif 2104d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org } 2114ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return true; 2124d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org} 2134ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 2144ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.orgstd::string ResourcePath(std::string name, std::string extension) { 2151d34fe979c52e5826c5c8162759b0167b2607836henrika#if defined(WEBRTC_IOS) 2161d34fe979c52e5826c5c8162759b0167b2607836henrika return IOSResourcePath(name, extension); 2171d34fe979c52e5826c5c8162759b0167b2607836henrika#else 2184ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org std::string platform = "win"; 2194ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#ifdef WEBRTC_LINUX 2204ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org platform = "linux"; 2214ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#endif // WEBRTC_LINUX 2224ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#ifdef WEBRTC_MAC 2234ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org platform = "mac"; 2244ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#endif // WEBRTC_MAC 2254ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 2264ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#ifdef WEBRTC_ARCH_64_BITS 2274ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org std::string architecture = "64"; 2284ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#else 2294ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org std::string architecture = "32"; 2304ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org#endif // WEBRTC_ARCH_64_BITS 2314ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 2325b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org std::string resources_path = ProjectRootPath() + kResourcesDirName + 2335b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org kPathDelimiter; 2344ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org std::string resource_file = resources_path + name + "_" + platform + "_" + 2354ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org architecture + "." + extension; 23680b2661dc6adb530aa891bc9376fcc5ef1dadc54kjellander@webrtc.org if (FileExists(resource_file)) { 2374ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return resource_file; 2384ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org } 2394ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org // Try without architecture. 2404ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org resource_file = resources_path + name + "_" + platform + "." + extension; 2414ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org if (FileExists(resource_file)) { 2424ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return resource_file; 2434ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org } 2444ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org // Try without platform. 2454ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org resource_file = resources_path + name + "_" + architecture + "." + extension; 2464ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org if (FileExists(resource_file)) { 2474ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return resource_file; 2484ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org } 249363efef64ab73110f2a4578561633bd2fe9c5586leozwang@webrtc.org 2504ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org // Fall back on name without architecture or platform. 2514ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org return resources_path + name + "." + extension; 2521d34fe979c52e5826c5c8162759b0167b2607836henrika#endif // defined (WEBRTC_IOS) 2534ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org} 2544ed4f24074dd5ed0605da4e8a5721054ef903fa6kjellander@webrtc.org 2555b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.orgsize_t GetFileSize(std::string filename) { 2565b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org FILE* f = fopen(filename.c_str(), "rb"); 2575b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org size_t size = 0; 2585b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org if (f != NULL) { 2595b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org if (fseek(f, 0, SEEK_END) == 0) { 2605b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org size = ftell(f); 2615b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org } 2625b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org fclose(f); 2635b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org } 2645b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org return size; 2655b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org} 2665b97b1216fbb8061216d4075d46596fc38d9cff4kjellander@webrtc.org 2677951e819af005e0c45a19367c549984d67509969kjellander@webrtc.org} // namespace test 2684d8cd9d055a674aae2ca9754dd50f08dcf176a3akjellander@webrtc.org} // namespace webrtc 269