18 # include <CoreFoundation/CoreFoundation.h> 21 #include <glog/logging.h> 33 std::string GetBundleDir() {
34 CFRef<CFURLRef> url(CFBundleCopyBundleURL(CFBundleGetMainBundle()));
35 CFRef<CFStringRef> str(CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle));
36 return CFStringGetCStringPtr(str, CFStringGetSystemEncoding());
47 bool is_bundle_relative,
48 const std::string& file) {
50 if (is_bundle_relative)
53 return PathJoin(static_data_dir, file);
58 const std::string& dynamic_data_dir,
const std::string& file) {
59 return PathJoin(dynamic_data_dir, file);
63 std::ifstream file(path, std::ios::binary | std::ios::in);
65 PLOG(ERROR) <<
"Error opening file '" << path <<
"'";
70 file.seekg(0, std::ios::end);
72 PLOG(ERROR) <<
"Error seeking in file";
80 std::vector<uint8_t>* data)
const {
81 std::ifstream file(path, std::ios::binary | std::ios::in);
83 PLOG(ERROR) <<
"Error opening file '" << path <<
"'";
88 file.seekg(0, std::ios::end);
90 const std::streamsize file_size = file.tellg();
94 data->resize(file_size);
95 file.read(reinterpret_cast<char*>(data->data()), file_size);
97 PLOG(ERROR) <<
"Error reading file '" << path <<
"'";
100 DCHECK_EQ(file_size, file.gcount());
106 const std::vector<uint8_t>& data)
const {
107 std::ofstream file(path, std::ios::binary | std::ios::out | std::ios::trunc);
109 PLOG(ERROR) <<
"Error opening file '" << path <<
"'";
114 file.write(reinterpret_cast<const char*>(data.data()), data.size());
116 PLOG(ERROR) <<
"Error writing file '" << path <<
"'";
119 DCHECK_EQ(static_cast<std::streamsize>(data.size()), file.tellp());
static std::string GetPathForStaticFile(const std::string &static_data_dir, bool is_bundle_relative, const std::string &file)
virtual MUST_USE_RESULT bool WriteFile(const std::string &path, const std::vector< uint8_t > &data) const
static std::string GetPathForDynamicFile(const std::string &dynamic_data_dir, const std::string &file)
virtual ssize_t FileSize(const std::string &path) const
virtual MUST_USE_RESULT bool ReadFile(const std::string &path, std::vector< uint8_t > *data) const
static std::string PathJoin(const std::string &a, const std::string &b)