summaryrefslogtreecommitdiffstats
path: root/chrome/browser/download/save_file.cc
diff options
context:
space:
mode:
authorpaulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-09-14 01:09:50 +0000
committerpaulg@google.com <paulg@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-09-14 01:09:50 +0000
commit37936eefdf1bf98d1a4458d8f3b85233d28c37e4 (patch)
tree96e1ffcf546b7fb4ad458f9a2ab8b8268d5f122a /chrome/browser/download/save_file.cc
parentda5de3c98d0613411df3acb9b692fa200e51dcfb (diff)
downloadchromium_src-37936eefdf1bf98d1a4458d8f3b85233d28c37e4.zip
chromium_src-37936eefdf1bf98d1a4458d8f3b85233d28c37e4.tar.gz
chromium_src-37936eefdf1bf98d1a4458d8f3b85233d28c37e4.tar.bz2
Move the Save Page code to the browser/download/ directory.
Review URL: http://codereview.chromium.org/3040 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2174 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/download/save_file.cc')
-rw-r--r--chrome/browser/download/save_file.cc103
1 files changed, 103 insertions, 0 deletions
diff --git a/chrome/browser/download/save_file.cc b/chrome/browser/download/save_file.cc
new file mode 100644
index 0000000..b92edf2
--- /dev/null
+++ b/chrome/browser/download/save_file.cc
@@ -0,0 +1,103 @@
+// Copyright (c) 2006-2008 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 "chrome/browser/download/save_file.h"
+
+#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/path_service.h"
+#include "chrome/browser/download/save_types.h"
+#include "chrome/common/win_util.h"
+#include "chrome/common/win_safe_util.h"
+
+SaveFile::SaveFile(const SaveFileCreateInfo* info)
+ : info_(info),
+ file_(NULL),
+ bytes_so_far_(0),
+ path_renamed_(false),
+ in_progress_(true) {
+ DCHECK(info);
+ DCHECK(info->path.empty());
+ if (file_util::CreateTemporaryFileName(&full_path_))
+ Open(L"wb");
+}
+
+SaveFile::~SaveFile() {
+ Close();
+}
+
+// Return false indicate that we got disk error, save file manager will tell
+// SavePackage this error, then SavePackage will call its Cancel() method to
+// cancel whole save job.
+bool SaveFile::AppendDataToFile(const char* data, int data_len) {
+ if (file_) {
+ if (data_len == fwrite(data, 1, data_len, file_)) {
+ bytes_so_far_ += data_len;
+ return true;
+ } else {
+ Close();
+ return false;
+ }
+ }
+ // No file_, treat it as disk error.
+ return false;
+}
+
+void SaveFile::Cancel() {
+ Close();
+ // If this job has been canceled, and it has created file,
+ // We need to delete this created file.
+ if (!full_path_.empty()) {
+ DeleteFile(full_path_.c_str());
+ }
+}
+
+// Rename the file when we have final name.
+bool SaveFile::Rename(const std::wstring& new_path) {
+ Close();
+
+ DCHECK(!path_renamed());
+ // We cannot rename because rename will keep the same security descriptor
+ // on the destination file. We want to recreate the security descriptor
+ // with the security that makes sense in the new path. If the last parameter
+ // is FALSE and the new file already exists, the function overwrites the
+ // existing file and succeeds.
+ if (!CopyFile(full_path_.c_str(), new_path.c_str(), FALSE))
+ return false;
+
+ DeleteFile(full_path_.c_str());
+
+ full_path_ = new_path;
+ path_renamed_ = true;
+
+ // Still in saving process, reopen the file.
+ if (in_progress_ && !Open(L"a+b"))
+ return false;
+ return true;
+}
+
+void SaveFile::Finish() {
+ Close();
+ in_progress_ = false;
+}
+
+void SaveFile::Close() {
+ if (file_) {
+ fclose(file_);
+ file_ = NULL;
+ }
+}
+
+bool SaveFile::Open(const wchar_t* open_mode) {
+ DCHECK(!full_path_.empty());
+ if (_wfopen_s(&file_, full_path_.c_str(), open_mode)) {
+ file_ = NULL;
+ return false;
+ }
+ // Sets the zone to tell Windows that this file comes from the Internet.
+ // We ignore the return value because a failure is not fatal.
+ win_util::SetInternetZoneIdentifier(full_path_);
+ return true;
+}
+