OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/common/blob/scoped_file.h" | 5 #include "storage/common/blob/scoped_file.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/location.h" | 10 #include "base/location.h" |
11 #include "base/message_loop/message_loop_proxy.h" | 11 #include "base/message_loop/message_loop_proxy.h" |
12 #include "base/task_runner.h" | 12 #include "base/task_runner.h" |
13 | 13 |
14 namespace webkit_blob { | 14 namespace storage { |
15 | 15 |
16 ScopedFile::ScopedFile() | 16 ScopedFile::ScopedFile() : scope_out_policy_(DONT_DELETE_ON_SCOPE_OUT) { |
17 : scope_out_policy_(DONT_DELETE_ON_SCOPE_OUT) { | |
18 } | 17 } |
19 | 18 |
20 ScopedFile::ScopedFile( | 19 ScopedFile::ScopedFile(const base::FilePath& path, |
21 const base::FilePath& path, ScopeOutPolicy policy, | 20 ScopeOutPolicy policy, |
22 base::TaskRunner* file_task_runner) | 21 base::TaskRunner* file_task_runner) |
23 : path_(path), | 22 : path_(path), |
24 scope_out_policy_(policy), | 23 scope_out_policy_(policy), |
25 file_task_runner_(file_task_runner) { | 24 file_task_runner_(file_task_runner) { |
26 DCHECK(path.empty() || policy != DELETE_ON_SCOPE_OUT || file_task_runner) | 25 DCHECK(path.empty() || policy != DELETE_ON_SCOPE_OUT || file_task_runner) |
27 << "path:" << path.value() | 26 << "path:" << path.value() << " policy:" << policy |
28 << " policy:" << policy | |
29 << " runner:" << file_task_runner; | 27 << " runner:" << file_task_runner; |
30 } | 28 } |
31 | 29 |
32 ScopedFile::ScopedFile(RValue other) { | 30 ScopedFile::ScopedFile(RValue other) { |
33 MoveFrom(*other.object); | 31 MoveFrom(*other.object); |
34 } | 32 } |
35 | 33 |
36 ScopedFile::~ScopedFile() { | 34 ScopedFile::~ScopedFile() { |
37 Reset(); | 35 Reset(); |
38 } | 36 } |
39 | 37 |
40 void ScopedFile::AddScopeOutCallback( | 38 void ScopedFile::AddScopeOutCallback(const ScopeOutCallback& callback, |
41 const ScopeOutCallback& callback, | 39 base::TaskRunner* callback_runner) { |
42 base::TaskRunner* callback_runner) { | |
43 if (!callback_runner) | 40 if (!callback_runner) |
44 callback_runner = base::MessageLoopProxy::current().get(); | 41 callback_runner = base::MessageLoopProxy::current().get(); |
45 scope_out_callbacks_.push_back(std::make_pair(callback, callback_runner)); | 42 scope_out_callbacks_.push_back(std::make_pair(callback, callback_runner)); |
46 } | 43 } |
47 | 44 |
48 base::FilePath ScopedFile::Release() { | 45 base::FilePath ScopedFile::Release() { |
49 base::FilePath path = path_; | 46 base::FilePath path = path_; |
50 path_.clear(); | 47 path_.clear(); |
51 scope_out_callbacks_.clear(); | 48 scope_out_callbacks_.clear(); |
52 scope_out_policy_ = DONT_DELETE_ON_SCOPE_OUT; | 49 scope_out_policy_ = DONT_DELETE_ON_SCOPE_OUT; |
53 return path; | 50 return path; |
54 } | 51 } |
55 | 52 |
56 void ScopedFile::Reset() { | 53 void ScopedFile::Reset() { |
57 if (path_.empty()) | 54 if (path_.empty()) |
58 return; | 55 return; |
59 | 56 |
60 for (ScopeOutCallbackList::iterator iter = scope_out_callbacks_.begin(); | 57 for (ScopeOutCallbackList::iterator iter = scope_out_callbacks_.begin(); |
61 iter != scope_out_callbacks_.end(); ++iter) { | 58 iter != scope_out_callbacks_.end(); |
| 59 ++iter) { |
62 iter->second->PostTask(FROM_HERE, base::Bind(iter->first, path_)); | 60 iter->second->PostTask(FROM_HERE, base::Bind(iter->first, path_)); |
63 } | 61 } |
64 | 62 |
65 if (scope_out_policy_ == DELETE_ON_SCOPE_OUT) { | 63 if (scope_out_policy_ == DELETE_ON_SCOPE_OUT) { |
66 file_task_runner_->PostTask( | 64 file_task_runner_->PostTask( |
67 FROM_HERE, | 65 FROM_HERE, |
68 base::Bind(base::IgnoreResult(&base::DeleteFile), | 66 base::Bind(base::IgnoreResult(&base::DeleteFile), |
69 path_, false /* recursive */)); | 67 path_, |
| 68 false /* recursive */)); |
70 } | 69 } |
71 | 70 |
72 // Clear all fields. | 71 // Clear all fields. |
73 Release(); | 72 Release(); |
74 } | 73 } |
75 | 74 |
76 void ScopedFile::MoveFrom(ScopedFile& other) { | 75 void ScopedFile::MoveFrom(ScopedFile& other) { |
77 Reset(); | 76 Reset(); |
78 | 77 |
79 scope_out_policy_ = other.scope_out_policy_; | 78 scope_out_policy_ = other.scope_out_policy_; |
80 scope_out_callbacks_.swap(other.scope_out_callbacks_); | 79 scope_out_callbacks_.swap(other.scope_out_callbacks_); |
81 file_task_runner_ = other.file_task_runner_; | 80 file_task_runner_ = other.file_task_runner_; |
82 path_ = other.Release(); | 81 path_ = other.Release(); |
83 } | 82 } |
84 | 83 |
85 } // namespace webkit_blob | 84 } // namespace storage |
OLD | NEW |