| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkOSFile.h" | 8 #include "SkOSFile.h" |
| 9 | 9 |
| 10 #include "SkTFitsIn.h" | 10 #include "SkTFitsIn.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 }; | 72 }; |
| 73 typedef SkAutoNullKernelHandle SkAutoWinMMap; | 73 typedef SkAutoNullKernelHandle SkAutoWinMMap; |
| 74 | 74 |
| 75 void sk_fmunmap(const void* addr, size_t) { | 75 void sk_fmunmap(const void* addr, size_t) { |
| 76 UnmapViewOfFile(addr); | 76 UnmapViewOfFile(addr); |
| 77 } | 77 } |
| 78 | 78 |
| 79 void* sk_fdmmap(int fileno, size_t* length) { | 79 void* sk_fdmmap(int fileno, size_t* length) { |
| 80 HANDLE file = (HANDLE)_get_osfhandle(fileno); | 80 HANDLE file = (HANDLE)_get_osfhandle(fileno); |
| 81 if (INVALID_HANDLE_VALUE == file) { | 81 if (INVALID_HANDLE_VALUE == file) { |
| 82 return NULL; | 82 return nullptr; |
| 83 } | 83 } |
| 84 | 84 |
| 85 LARGE_INTEGER fileSize; | 85 LARGE_INTEGER fileSize; |
| 86 if (0 == GetFileSizeEx(file, &fileSize)) { | 86 if (0 == GetFileSizeEx(file, &fileSize)) { |
| 87 //TODO: use SK_TRACEHR(GetLastError(), "Could not get file size.") to re
port. | 87 //TODO: use SK_TRACEHR(GetLastError(), "Could not get file size.") to re
port. |
| 88 return NULL; | 88 return nullptr; |
| 89 } | 89 } |
| 90 if (!SkTFitsIn<size_t>(fileSize.QuadPart)) { | 90 if (!SkTFitsIn<size_t>(fileSize.QuadPart)) { |
| 91 return NULL; | 91 return nullptr; |
| 92 } | 92 } |
| 93 | 93 |
| 94 SkAutoWinMMap mmap(CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL))
; | 94 SkAutoWinMMap mmap(CreateFileMapping(file, nullptr, PAGE_READONLY, 0, 0, nul
lptr)); |
| 95 if (!mmap.isValid()) { | 95 if (!mmap.isValid()) { |
| 96 //TODO: use SK_TRACEHR(GetLastError(), "Could not create file mapping.")
to report. | 96 //TODO: use SK_TRACEHR(GetLastError(), "Could not create file mapping.")
to report. |
| 97 return NULL; | 97 return nullptr; |
| 98 } | 98 } |
| 99 | 99 |
| 100 // Eventually call UnmapViewOfFile | 100 // Eventually call UnmapViewOfFile |
| 101 void* addr = MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0); | 101 void* addr = MapViewOfFile(mmap, FILE_MAP_READ, 0, 0, 0); |
| 102 if (NULL == addr) { | 102 if (nullptr == addr) { |
| 103 //TODO: use SK_TRACEHR(GetLastError(), "Could not map view of file.") to
report. | 103 //TODO: use SK_TRACEHR(GetLastError(), "Could not map view of file.") to
report. |
| 104 return NULL; | 104 return nullptr; |
| 105 } | 105 } |
| 106 | 106 |
| 107 *length = static_cast<size_t>(fileSize.QuadPart); | 107 *length = static_cast<size_t>(fileSize.QuadPart); |
| 108 return addr; | 108 return addr; |
| 109 } | 109 } |
| 110 | 110 |
| 111 int sk_fileno(SkFILE* f) { | 111 int sk_fileno(SkFILE* f) { |
| 112 return _fileno((FILE*)f); | 112 return _fileno((FILE*)f); |
| 113 } | 113 } |
| 114 | 114 |
| 115 void* sk_fmmap(SkFILE* f, size_t* length) { | 115 void* sk_fmmap(SkFILE* f, size_t* length) { |
| 116 int fileno = sk_fileno(f); | 116 int fileno = sk_fileno(f); |
| 117 if (fileno < 0) { | 117 if (fileno < 0) { |
| 118 return NULL; | 118 return nullptr; |
| 119 } | 119 } |
| 120 | 120 |
| 121 return sk_fdmmap(fileno, length); | 121 return sk_fdmmap(fileno, length); |
| 122 } | 122 } |
| 123 | 123 |
| 124 //////////////////////////////////////////////////////////////////////////// | 124 //////////////////////////////////////////////////////////////////////////// |
| 125 | 125 |
| 126 struct SkOSFileIterData { | 126 struct SkOSFileIterData { |
| 127 SkOSFileIterData() : fHandle(0), fPath16(NULL) { } | 127 SkOSFileIterData() : fHandle(0), fPath16(nullptr) { } |
| 128 HANDLE fHandle; | 128 HANDLE fHandle; |
| 129 uint16_t* fPath16; | 129 uint16_t* fPath16; |
| 130 }; | 130 }; |
| 131 static_assert(sizeof(SkOSFileIterData) <= SkOSFile::Iter::kStorageSize, "not_eno
ugh_space"); | 131 static_assert(sizeof(SkOSFileIterData) <= SkOSFile::Iter::kStorageSize, "not_eno
ugh_space"); |
| 132 | 132 |
| 133 static uint16_t* concat_to_16(const char src[], const char suffix[]) { | 133 static uint16_t* concat_to_16(const char src[], const char suffix[]) { |
| 134 size_t i, len = strlen(src); | 134 size_t i, len = strlen(src); |
| 135 size_t len2 = 3 + (suffix ? strlen(suffix) : 0); | 135 size_t len2 = 3 + (suffix ? strlen(suffix) : 0); |
| 136 uint16_t* dst = (uint16_t*)sk_malloc_throw((len + len2) * sizeof(uint16_t)); | 136 uint16_t* dst = (uint16_t*)sk_malloc_throw((len + len2) * sizeof(uint16_t)); |
| 137 | 137 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 170 } | 170 } |
| 171 self.~SkOSFileIterData(); | 171 self.~SkOSFileIterData(); |
| 172 } | 172 } |
| 173 | 173 |
| 174 void SkOSFile::Iter::reset(const char path[], const char suffix[]) { | 174 void SkOSFile::Iter::reset(const char path[], const char suffix[]) { |
| 175 SkOSFileIterData& self = *static_cast<SkOSFileIterData*>(fSelf.get()); | 175 SkOSFileIterData& self = *static_cast<SkOSFileIterData*>(fSelf.get()); |
| 176 if (self.fHandle) { | 176 if (self.fHandle) { |
| 177 ::FindClose(self.fHandle); | 177 ::FindClose(self.fHandle); |
| 178 self.fHandle = 0; | 178 self.fHandle = 0; |
| 179 } | 179 } |
| 180 if (NULL == path) { | 180 if (nullptr == path) { |
| 181 path = ""; | 181 path = ""; |
| 182 } | 182 } |
| 183 | 183 |
| 184 sk_free(self.fPath16); | 184 sk_free(self.fPath16); |
| 185 self.fPath16 = concat_to_16(path, suffix); | 185 self.fPath16 = concat_to_16(path, suffix); |
| 186 } | 186 } |
| 187 | 187 |
| 188 static bool is_magic_dir(const uint16_t dir[]) { | 188 static bool is_magic_dir(const uint16_t dir[]) { |
| 189 // return true for "." and ".." | 189 // return true for "." and ".." |
| 190 return dir[0] == '.' && (dir[1] == 0 || (dir[1] == '.' && dir[2] == 0)); | 190 return dir[0] == '.' && (dir[1] == 0 || (dir[1] == '.' && dir[2] == 0)); |
| 191 } | 191 } |
| 192 | 192 |
| 193 static bool get_the_file(HANDLE handle, SkString* name, WIN32_FIND_DATAW* dataPt
r, bool getDir) { | 193 static bool get_the_file(HANDLE handle, SkString* name, WIN32_FIND_DATAW* dataPt
r, bool getDir) { |
| 194 WIN32_FIND_DATAW data; | 194 WIN32_FIND_DATAW data; |
| 195 | 195 |
| 196 if (NULL == dataPtr) { | 196 if (nullptr == dataPtr) { |
| 197 if (::FindNextFileW(handle, &data)) | 197 if (::FindNextFileW(handle, &data)) |
| 198 dataPtr = &data; | 198 dataPtr = &data; |
| 199 else | 199 else |
| 200 return false; | 200 return false; |
| 201 } | 201 } |
| 202 | 202 |
| 203 for (;;) { | 203 for (;;) { |
| 204 if (getDir) { | 204 if (getDir) { |
| 205 if ((dataPtr->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && | 205 if ((dataPtr->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && |
| 206 !is_magic_dir((uint16_t*)dataPtr->cFileName)) | 206 !is_magic_dir((uint16_t*)dataPtr->cFileName)) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 219 // if we get here, we've found a file/dir | 219 // if we get here, we've found a file/dir |
| 220 if (name) { | 220 if (name) { |
| 221 name->setUTF16((uint16_t*)dataPtr->cFileName); | 221 name->setUTF16((uint16_t*)dataPtr->cFileName); |
| 222 } | 222 } |
| 223 return true; | 223 return true; |
| 224 } | 224 } |
| 225 | 225 |
| 226 bool SkOSFile::Iter::next(SkString* name, bool getDir) { | 226 bool SkOSFile::Iter::next(SkString* name, bool getDir) { |
| 227 SkOSFileIterData& self = *static_cast<SkOSFileIterData*>(fSelf.get()); | 227 SkOSFileIterData& self = *static_cast<SkOSFileIterData*>(fSelf.get()); |
| 228 WIN32_FIND_DATAW data; | 228 WIN32_FIND_DATAW data; |
| 229 WIN32_FIND_DATAW* dataPtr = NULL; | 229 WIN32_FIND_DATAW* dataPtr = nullptr; |
| 230 | 230 |
| 231 if (self.fHandle == 0) { // our first time | 231 if (self.fHandle == 0) { // our first time |
| 232 if (self.fPath16 == NULL || *self.fPath16 == 0) { // check for no path | 232 if (self.fPath16 == nullptr || *self.fPath16 == 0) { // check for no pa
th |
| 233 return false; | 233 return false; |
| 234 } | 234 } |
| 235 | 235 |
| 236 self.fHandle = ::FindFirstFileW((LPCWSTR)self.fPath16, &data); | 236 self.fHandle = ::FindFirstFileW((LPCWSTR)self.fPath16, &data); |
| 237 if (self.fHandle != 0 && self.fHandle != (HANDLE)~0) { | 237 if (self.fHandle != 0 && self.fHandle != (HANDLE)~0) { |
| 238 dataPtr = &data; | 238 dataPtr = &data; |
| 239 } | 239 } |
| 240 } | 240 } |
| 241 return self.fHandle != (HANDLE)~0 && get_the_file(self.fHandle, name, dataPt
r, getDir); | 241 return self.fHandle != (HANDLE)~0 && get_the_file(self.fHandle, name, dataPt
r, getDir); |
| 242 } | 242 } |
| OLD | NEW |