| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| 11 #include "webrtc/base/win32filesystem.h" | 11 #include "webrtc/base/win32filesystem.h" | 
| 12 | 12 | 
| 13 #include "webrtc/base/win32.h" | 13 #include "webrtc/base/win32.h" | 
| 14 #include <shellapi.h> | 14 #include <shellapi.h> | 
| 15 #include <shlobj.h> | 15 #include <shlobj.h> | 
| 16 #include <tchar.h> | 16 #include <tchar.h> | 
| 17 | 17 | 
|  | 18 #include "webrtc/base/arraysize.h" | 
| 18 #include "webrtc/base/fileutils.h" | 19 #include "webrtc/base/fileutils.h" | 
| 19 #include "webrtc/base/pathutils.h" | 20 #include "webrtc/base/pathutils.h" | 
| 20 #include "webrtc/base/scoped_ptr.h" | 21 #include "webrtc/base/scoped_ptr.h" | 
| 21 #include "webrtc/base/stream.h" | 22 #include "webrtc/base/stream.h" | 
| 22 #include "webrtc/base/stringutils.h" | 23 #include "webrtc/base/stringutils.h" | 
| 23 | 24 | 
| 24 // In several places in this file, we test the integrity level of the process | 25 // In several places in this file, we test the integrity level of the process | 
| 25 // before calling GetLongPathName. We do this because calling GetLongPathName | 26 // before calling GetLongPathName. We do this because calling GetLongPathName | 
| 26 // when running under protected mode IE (a low integrity process) can result in | 27 // when running under protected mode IE (a low integrity process) can result in | 
| 27 // a virtualized path being returned, which is wrong if you only plan to read. | 28 // a virtualized path being returned, which is wrong if you only plan to read. | 
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 190 bool Win32Filesystem::DeleteEmptyFolder(const Pathname &folder) { | 191 bool Win32Filesystem::DeleteEmptyFolder(const Pathname &folder) { | 
| 191   LOG(LS_INFO) << "Deleting folder " << folder.pathname(); | 192   LOG(LS_INFO) << "Deleting folder " << folder.pathname(); | 
| 192 | 193 | 
| 193   std::string no_slash(folder.pathname(), 0, folder.pathname().length()-1); | 194   std::string no_slash(folder.pathname(), 0, folder.pathname().length()-1); | 
| 194   return ::RemoveDirectory(ToUtf16(no_slash).c_str()) != 0; | 195   return ::RemoveDirectory(ToUtf16(no_slash).c_str()) != 0; | 
| 195 } | 196 } | 
| 196 | 197 | 
| 197 bool Win32Filesystem::GetTemporaryFolder(Pathname &pathname, bool create, | 198 bool Win32Filesystem::GetTemporaryFolder(Pathname &pathname, bool create, | 
| 198                                          const std::string *append) { | 199                                          const std::string *append) { | 
| 199   wchar_t buffer[MAX_PATH + 1]; | 200   wchar_t buffer[MAX_PATH + 1]; | 
| 200   if (!::GetTempPath(ARRAY_SIZE(buffer), buffer)) | 201   if (!::GetTempPath(arraysize(buffer), buffer)) | 
| 201     return false; | 202     return false; | 
| 202   if (!IsCurrentProcessLowIntegrity() && | 203   if (!IsCurrentProcessLowIntegrity() && | 
| 203       !::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer))) | 204       !::GetLongPathName(buffer, buffer, arraysize(buffer))) | 
| 204     return false; | 205     return false; | 
| 205   size_t len = strlen(buffer); | 206   size_t len = strlen(buffer); | 
| 206   if ((len > 0) && (buffer[len-1] != '\\')) { | 207   if ((len > 0) && (buffer[len-1] != '\\')) { | 
| 207     len += strcpyn(buffer + len, ARRAY_SIZE(buffer) - len, L"\\"); | 208     len += strcpyn(buffer + len, arraysize(buffer) - len, L"\\"); | 
| 208   } | 209   } | 
| 209   if (len >= ARRAY_SIZE(buffer) - 1) | 210   if (len >= arraysize(buffer) - 1) | 
| 210     return false; | 211     return false; | 
| 211   pathname.clear(); | 212   pathname.clear(); | 
| 212   pathname.SetFolder(ToUtf8(buffer)); | 213   pathname.SetFolder(ToUtf8(buffer)); | 
| 213   if (append != NULL) { | 214   if (append != NULL) { | 
| 214     ASSERT(!append->empty()); | 215     ASSERT(!append->empty()); | 
| 215     pathname.AppendFolder(*append); | 216     pathname.AppendFolder(*append); | 
| 216   } | 217   } | 
| 217   return !create || CreateFolder(pathname); | 218   return !create || CreateFolder(pathname); | 
| 218 } | 219 } | 
| 219 | 220 | 
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 288 } | 289 } | 
| 289 | 290 | 
| 290 bool Win32Filesystem::CopyFile(const Pathname &old_path, | 291 bool Win32Filesystem::CopyFile(const Pathname &old_path, | 
| 291                                const Pathname &new_path) { | 292                                const Pathname &new_path) { | 
| 292   return ::CopyFile(ToUtf16(old_path.pathname()).c_str(), | 293   return ::CopyFile(ToUtf16(old_path.pathname()).c_str(), | 
| 293                     ToUtf16(new_path.pathname()).c_str(), TRUE) != 0; | 294                     ToUtf16(new_path.pathname()).c_str(), TRUE) != 0; | 
| 294 } | 295 } | 
| 295 | 296 | 
| 296 bool Win32Filesystem::IsTemporaryPath(const Pathname& pathname) { | 297 bool Win32Filesystem::IsTemporaryPath(const Pathname& pathname) { | 
| 297   TCHAR buffer[MAX_PATH + 1]; | 298   TCHAR buffer[MAX_PATH + 1]; | 
| 298   if (!::GetTempPath(ARRAY_SIZE(buffer), buffer)) | 299   if (!::GetTempPath(arraysize(buffer), buffer)) | 
| 299     return false; | 300     return false; | 
| 300   if (!IsCurrentProcessLowIntegrity() && | 301   if (!IsCurrentProcessLowIntegrity() && | 
| 301       !::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer))) | 302       !::GetLongPathName(buffer, buffer, arraysize(buffer))) | 
| 302     return false; | 303     return false; | 
| 303   return (::strnicmp(ToUtf16(pathname.pathname()).c_str(), | 304   return (::strnicmp(ToUtf16(pathname.pathname()).c_str(), | 
| 304                      buffer, strlen(buffer)) == 0); | 305                      buffer, strlen(buffer)) == 0); | 
| 305 } | 306 } | 
| 306 | 307 | 
| 307 bool Win32Filesystem::GetFileSize(const Pathname &pathname, size_t *size) { | 308 bool Win32Filesystem::GetFileSize(const Pathname &pathname, size_t *size) { | 
| 308   WIN32_FILE_ATTRIBUTE_DATA data = {0}; | 309   WIN32_FILE_ATTRIBUTE_DATA data = {0}; | 
| 309   if (::GetFileAttributesEx(ToUtf16(pathname.pathname()).c_str(), | 310   if (::GetFileAttributesEx(ToUtf16(pathname.pathname()).c_str(), | 
| 310                             GetFileExInfoStandard, &data) == 0) | 311                             GetFileExInfoStandard, &data) == 0) | 
| 311   return false; | 312   return false; | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 330     FileTimeToUnixTime(data.ftLastAccessTime, time); | 331     FileTimeToUnixTime(data.ftLastAccessTime, time); | 
| 331     break; | 332     break; | 
| 332   default: | 333   default: | 
| 333     return false; | 334     return false; | 
| 334   } | 335   } | 
| 335   return true; | 336   return true; | 
| 336 } | 337 } | 
| 337 | 338 | 
| 338 bool Win32Filesystem::GetAppPathname(Pathname* path) { | 339 bool Win32Filesystem::GetAppPathname(Pathname* path) { | 
| 339   TCHAR buffer[MAX_PATH + 1]; | 340   TCHAR buffer[MAX_PATH + 1]; | 
| 340   if (0 == ::GetModuleFileName(NULL, buffer, ARRAY_SIZE(buffer))) | 341   if (0 == ::GetModuleFileName(NULL, buffer, arraysize(buffer))) | 
| 341     return false; | 342     return false; | 
| 342   path->SetPathname(ToUtf8(buffer)); | 343   path->SetPathname(ToUtf8(buffer)); | 
| 343   return true; | 344   return true; | 
| 344 } | 345 } | 
| 345 | 346 | 
| 346 bool Win32Filesystem::GetAppDataFolder(Pathname* path, bool per_user) { | 347 bool Win32Filesystem::GetAppDataFolder(Pathname* path, bool per_user) { | 
| 347   ASSERT(!organization_name_.empty()); | 348   ASSERT(!organization_name_.empty()); | 
| 348   ASSERT(!application_name_.empty()); | 349   ASSERT(!application_name_.empty()); | 
| 349   TCHAR buffer[MAX_PATH + 1]; | 350   TCHAR buffer[MAX_PATH + 1]; | 
| 350   int csidl = per_user ? CSIDL_LOCAL_APPDATA : CSIDL_COMMON_APPDATA; | 351   int csidl = per_user ? CSIDL_LOCAL_APPDATA : CSIDL_COMMON_APPDATA; | 
| 351   if (!::SHGetSpecialFolderPath(NULL, buffer, csidl, TRUE)) | 352   if (!::SHGetSpecialFolderPath(NULL, buffer, csidl, TRUE)) | 
| 352     return false; | 353     return false; | 
| 353   if (!IsCurrentProcessLowIntegrity() && | 354   if (!IsCurrentProcessLowIntegrity() && | 
| 354       !::GetLongPathName(buffer, buffer, ARRAY_SIZE(buffer))) | 355       !::GetLongPathName(buffer, buffer, arraysize(buffer))) | 
| 355     return false; | 356     return false; | 
| 356   size_t len = strcatn(buffer, ARRAY_SIZE(buffer), __T("\\")); | 357   size_t len = strcatn(buffer, arraysize(buffer), __T("\\")); | 
| 357   len += strcpyn(buffer + len, ARRAY_SIZE(buffer) - len, | 358   len += strcpyn(buffer + len, arraysize(buffer) - len, | 
| 358                  ToUtf16(organization_name_).c_str()); | 359                  ToUtf16(organization_name_).c_str()); | 
| 359   if ((len > 0) && (buffer[len-1] != __T('\\'))) { | 360   if ((len > 0) && (buffer[len-1] != __T('\\'))) { | 
| 360     len += strcpyn(buffer + len, ARRAY_SIZE(buffer) - len, __T("\\")); | 361     len += strcpyn(buffer + len, arraysize(buffer) - len, __T("\\")); | 
| 361   } | 362   } | 
| 362   len += strcpyn(buffer + len, ARRAY_SIZE(buffer) - len, | 363   len += strcpyn(buffer + len, arraysize(buffer) - len, | 
| 363                  ToUtf16(application_name_).c_str()); | 364                  ToUtf16(application_name_).c_str()); | 
| 364   if ((len > 0) && (buffer[len-1] != __T('\\'))) { | 365   if ((len > 0) && (buffer[len-1] != __T('\\'))) { | 
| 365     len += strcpyn(buffer + len, ARRAY_SIZE(buffer) - len, __T("\\")); | 366     len += strcpyn(buffer + len, arraysize(buffer) - len, __T("\\")); | 
| 366   } | 367   } | 
| 367   if (len >= ARRAY_SIZE(buffer) - 1) | 368   if (len >= arraysize(buffer) - 1) | 
| 368     return false; | 369     return false; | 
| 369   path->clear(); | 370   path->clear(); | 
| 370   path->SetFolder(ToUtf8(buffer)); | 371   path->SetFolder(ToUtf8(buffer)); | 
| 371   return CreateFolder(*path); | 372   return CreateFolder(*path); | 
| 372 } | 373 } | 
| 373 | 374 | 
| 374 bool Win32Filesystem::GetAppTempFolder(Pathname* path) { | 375 bool Win32Filesystem::GetAppTempFolder(Pathname* path) { | 
| 375   if (!GetAppPathname(path)) | 376   if (!GetAppPathname(path)) | 
| 376     return false; | 377     return false; | 
| 377   std::string filename(path->filename()); | 378   std::string filename(path->filename()); | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 452   temp_path16.append(1, '\0'); | 453   temp_path16.append(1, '\0'); | 
| 453 | 454 | 
| 454   SHFILEOPSTRUCT file_op = { 0 }; | 455   SHFILEOPSTRUCT file_op = { 0 }; | 
| 455   file_op.wFunc = FO_DELETE; | 456   file_op.wFunc = FO_DELETE; | 
| 456   file_op.pFrom = temp_path16.c_str(); | 457   file_op.pFrom = temp_path16.c_str(); | 
| 457   file_op.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; | 458   file_op.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT; | 
| 458   return (0 == SHFileOperation(&file_op)); | 459   return (0 == SHFileOperation(&file_op)); | 
| 459 */ | 460 */ | 
| 460 | 461 | 
| 461 }  // namespace rtc | 462 }  // namespace rtc | 
| OLD | NEW | 
|---|