Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Unified Diff: content/browser/download/base_file_posix.cc

Issue 11238044: Refactor BaseFile methods to return a DownloadInterruptReason instead of a net::Error. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/download/base_file_posix.cc
diff --git a/content/browser/download/base_file_posix.cc b/content/browser/download/base_file_posix.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b5538bf89894c5740e2f686be73be7be1d72e158
--- /dev/null
+++ b/content/browser/download/base_file_posix.cc
@@ -0,0 +1,40 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/download/base_file.h"
+
+#include "base/file_util.h"
+#include "content/public/browser/download_interrupt_reasons.h"
+
+content::DownloadInterruptReason BaseFile::MoveFileAndAdjustPermissions(
+ const FilePath& new_path) {
+ // Similarly, on Unix, we're moving a temp file created with permissions 600
+ // to |new_path|. Here, we try to fix up the destination file with appropriate
+ // permissions.
+ struct stat st;
+ // First check the file existence and create an empty file if it doesn't
+ // exist.
+ if (!file_util::PathExists(new_path)) {
+ int write_error = file_util::WriteFile(new_path, "", 0);
+ if (write_error < 0)
+ return LogSystemError("WriteFile", errno);
+ }
+ int stat_error = stat(new_path.value().c_str(), &st);
+ bool stat_succeeded = (stat_error == 0);
+ if (!stat_succeeded)
+ LogSystemError("stat", errno);
+
+ // TODO(estade): Move() falls back to copying and deleting when a simple
+ // rename fails. Copying sucks for large downloads. crbug.com/8737
+ if (!file_util::Move(full_path_, new_path))
+ return LogSystemError("Move", errno);
+
+ if (stat_succeeded) {
+ // On Windows file systems (FAT, NTFS), chmod fails. This is OK.
+ int chmod_error = chmod(new_path.value().c_str(), st.st_mode);
+ if (chmod_error < 0)
+ LogSystemError("chmod", errno);
+ }
+ return content::DOWNLOAD_INTERRUPT_REASON_NONE;
+}

Powered by Google App Engine
This is Rietveld 408576698