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

Side by Side Diff: net/disk_cache/file_win.cc

Issue 8843: Add write and read/write support to FileStream (renamed from FileInputStream)... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 12 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/disk_cache/file_posix.cc ('k') | net/disk_cache/mapped_file_posix.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "net/disk_cache/file.h" 5 #include "net/disk_cache/file.h"
6 6
7 #include "net/disk_cache/disk_cache.h" 7 #include "net/disk_cache/disk_cache.h"
8 8
9 namespace { 9 namespace {
10 10
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 delete data; 81 delete data;
82 } else { 82 } else {
83 // Somebody is waiting for this so don't delete data and instead notify 83 // Somebody is waiting for this so don't delete data and instead notify
84 // that we were called. 84 // that we were called.
85 data->actual_bytes = actual_bytes; 85 data->actual_bytes = actual_bytes;
86 data->file->Release(); 86 data->file->Release();
87 data->called = true; 87 data->called = true;
88 } 88 }
89 } 89 }
90 90
91 File::File(OSFile file) 91 File::File(base::PlatformFile file)
92 : init_(true), mixed_(true), os_file_(INVALID_HANDLE_VALUE), 92 : init_(true), mixed_(true), platform_file_(INVALID_HANDLE_VALUE),
93 sync_os_file_(file) { 93 sync_platform_file_(file) {
94 } 94 }
95 95
96 bool File::Init(const std::wstring& name) { 96 bool File::Init(const std::wstring& name) {
97 DCHECK(!init_); 97 DCHECK(!init_);
98 if (init_) 98 if (init_)
99 return false; 99 return false;
100 100
101 os_file_ = CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 101 platform_file_ = CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE,
102 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 102 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
103 FILE_FLAG_OVERLAPPED, NULL); 103 FILE_FLAG_OVERLAPPED, NULL);
104 104
105 if (INVALID_HANDLE_VALUE == os_file_) 105 if (INVALID_HANDLE_VALUE == platform_file_)
106 return false; 106 return false;
107 107
108 init_ = true; 108 init_ = true;
109 if (mixed_) { 109 if (mixed_) {
110 sync_os_file_ = CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 110 sync_platform_file_ = CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE,
111 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 111 FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
112 OPEN_EXISTING, 0, NULL); 112 OPEN_EXISTING, 0, NULL);
113 113
114 if (INVALID_HANDLE_VALUE == sync_os_file_) 114 if (INVALID_HANDLE_VALUE == sync_platform_file_)
115 return false; 115 return false;
116 } else { 116 } else {
117 sync_os_file_ = INVALID_HANDLE_VALUE; 117 sync_platform_file_ = INVALID_HANDLE_VALUE;
118 } 118 }
119 119
120 return true; 120 return true;
121 } 121 }
122 122
123 File::~File() { 123 File::~File() {
124 if (!init_) 124 if (!init_)
125 return; 125 return;
126 126
127 if (INVALID_HANDLE_VALUE != os_file_) 127 if (INVALID_HANDLE_VALUE != platform_file_)
128 CloseHandle(os_file_); 128 CloseHandle(platform_file_);
129 if (mixed_ && INVALID_HANDLE_VALUE != sync_os_file_) 129 if (mixed_ && INVALID_HANDLE_VALUE != sync_platform_file_)
130 CloseHandle(sync_os_file_); 130 CloseHandle(sync_platform_file_);
131 } 131 }
132 132
133 OSFile File::os_file() const { 133 base::PlatformFile File::platform_file() const {
134 DCHECK(init_); 134 DCHECK(init_);
135 return (INVALID_HANDLE_VALUE == os_file_) ? sync_os_file_ : os_file_; 135 return (INVALID_HANDLE_VALUE == platform_file_) ? sync_platform_file_ :
136 platform_file_;
136 } 137 }
137 138
138 bool File::IsValid() const { 139 bool File::IsValid() const {
139 if (!init_) 140 if (!init_)
140 return false; 141 return false;
141 return (INVALID_HANDLE_VALUE != os_file_ || 142 return (INVALID_HANDLE_VALUE != platform_file_ ||
142 INVALID_HANDLE_VALUE != sync_os_file_); 143 INVALID_HANDLE_VALUE != sync_platform_file_);
143 } 144 }
144 145
145 bool File::Read(void* buffer, size_t buffer_len, size_t offset) { 146 bool File::Read(void* buffer, size_t buffer_len, size_t offset) {
146 DCHECK(init_); 147 DCHECK(init_);
147 if (!mixed_ || buffer_len > ULONG_MAX || offset > LONG_MAX) 148 if (!mixed_ || buffer_len > ULONG_MAX || offset > LONG_MAX)
148 return false; 149 return false;
149 150
150 DWORD ret = SetFilePointer(sync_os_file_, static_cast<LONG>(offset), NULL, 151 DWORD ret = SetFilePointer(sync_platform_file_,
152 static_cast<LONG>(offset),
153 NULL,
151 FILE_BEGIN); 154 FILE_BEGIN);
152 if (INVALID_SET_FILE_POINTER == ret) 155 if (INVALID_SET_FILE_POINTER == ret)
153 return false; 156 return false;
154 157
155 DWORD actual; 158 DWORD actual;
156 DWORD size = static_cast<DWORD>(buffer_len); 159 DWORD size = static_cast<DWORD>(buffer_len);
157 if (!ReadFile(sync_os_file_, buffer, size, &actual, NULL)) 160 if (!ReadFile(sync_platform_file_, buffer, size, &actual, NULL))
158 return false; 161 return false;
159 return actual == size; 162 return actual == size;
160 } 163 }
161 164
162 bool File::Write(const void* buffer, size_t buffer_len, size_t offset) { 165 bool File::Write(const void* buffer, size_t buffer_len, size_t offset) {
163 DCHECK(init_); 166 DCHECK(init_);
164 if (!mixed_ || buffer_len > ULONG_MAX || offset > ULONG_MAX) 167 if (!mixed_ || buffer_len > ULONG_MAX || offset > ULONG_MAX)
165 return false; 168 return false;
166 169
167 DWORD ret = SetFilePointer(sync_os_file_, static_cast<LONG>(offset), NULL, 170 DWORD ret = SetFilePointer(sync_platform_file_,
171 static_cast<LONG>(offset),
172 NULL,
168 FILE_BEGIN); 173 FILE_BEGIN);
169 if (INVALID_SET_FILE_POINTER == ret) 174 if (INVALID_SET_FILE_POINTER == ret)
170 return false; 175 return false;
171 176
172 DWORD actual; 177 DWORD actual;
173 DWORD size = static_cast<DWORD>(buffer_len); 178 DWORD size = static_cast<DWORD>(buffer_len);
174 if (!WriteFile(sync_os_file_, buffer, size, &actual, NULL)) 179 if (!WriteFile(sync_platform_file_, buffer, size, &actual, NULL))
175 return false; 180 return false;
176 return actual == size; 181 return actual == size;
177 } 182 }
178 183
179 // We have to increase the ref counter of the file before performing the IO to 184 // We have to increase the ref counter of the file before performing the IO to
180 // prevent the completion to happen with an invalid handle (if the file is 185 // prevent the completion to happen with an invalid handle (if the file is
181 // closed while the IO is in flight). 186 // closed while the IO is in flight).
182 bool File::Read(void* buffer, size_t buffer_len, size_t offset, 187 bool File::Read(void* buffer, size_t buffer_len, size_t offset,
183 FileIOCallback* callback, bool* completed) { 188 FileIOCallback* callback, bool* completed) {
184 DCHECK(init_); 189 DCHECK(init_);
185 if (buffer_len > ULONG_MAX || offset > ULONG_MAX) 190 if (buffer_len > ULONG_MAX || offset > ULONG_MAX)
186 return false; 191 return false;
187 192
188 MyOverlapped* data = new MyOverlapped; 193 MyOverlapped* data = new MyOverlapped;
189 memset(data, 0, sizeof(*data)); 194 memset(data, 0, sizeof(*data));
190 195
191 SyncCallback local_callback; 196 SyncCallback local_callback;
192 data->overlapped.Offset = static_cast<DWORD>(offset); 197 data->overlapped.Offset = static_cast<DWORD>(offset);
193 data->callback = callback ? callback : &local_callback; 198 data->callback = callback ? callback : &local_callback;
194 data->file = this; 199 data->file = this;
195 200
196 DWORD size = static_cast<DWORD>(buffer_len); 201 DWORD size = static_cast<DWORD>(buffer_len);
197 AddRef(); 202 AddRef();
198 203
199 if (!ReadFileEx(os_file_, buffer, size, &data->overlapped, &IoCompletion)) { 204 if (!ReadFileEx(platform_file_, buffer, size, &data->overlapped,
205 &IoCompletion)) {
200 Release(); 206 Release();
201 delete data; 207 delete data;
202 return false; 208 return false;
203 } 209 }
204 210
205 if (callback) { 211 if (callback) {
206 *completed = false; 212 *completed = false;
207 // Let's check if the operation is already finished. 213 // Let's check if the operation is already finished.
208 SleepEx(0, TRUE); 214 SleepEx(0, TRUE);
209 if (data->called) { 215 if (data->called) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
253 data->file = this; 259 data->file = this;
254 if (!callback && !notify) { 260 if (!callback && !notify) {
255 data->delete_buffer = true; 261 data->delete_buffer = true;
256 data->callback = NULL; 262 data->callback = NULL;
257 data->buffer = buffer; 263 data->buffer = buffer;
258 } 264 }
259 265
260 DWORD size = static_cast<DWORD>(buffer_len); 266 DWORD size = static_cast<DWORD>(buffer_len);
261 AddRef(); 267 AddRef();
262 268
263 if (!WriteFileEx(os_file_, buffer, size, &data->overlapped, &IoCompletion)) { 269 if (!WriteFileEx(platform_file_, buffer, size, &data->overlapped,
270 &IoCompletion)) {
264 Release(); 271 Release();
265 delete data; 272 delete data;
266 return false; 273 return false;
267 } 274 }
268 275
269 if (callback) { 276 if (callback) {
270 *completed = false; 277 *completed = false;
271 SleepEx(0, TRUE); 278 SleepEx(0, TRUE);
272 if (data->called) { 279 if (data->called) {
273 *completed = (data->actual_bytes == size); 280 *completed = (data->actual_bytes == size);
(...skipping 14 matching lines...) Expand all
288 295
289 return true; 296 return true;
290 } 297 }
291 298
292 bool File::SetLength(size_t length) { 299 bool File::SetLength(size_t length) {
293 DCHECK(init_); 300 DCHECK(init_);
294 if (length > ULONG_MAX) 301 if (length > ULONG_MAX)
295 return false; 302 return false;
296 303
297 DWORD size = static_cast<DWORD>(length); 304 DWORD size = static_cast<DWORD>(length);
298 HANDLE file = os_file(); 305 HANDLE file = platform_file();
299 if (INVALID_SET_FILE_POINTER == SetFilePointer(file, size, NULL, FILE_BEGIN)) 306 if (INVALID_SET_FILE_POINTER == SetFilePointer(file, size, NULL, FILE_BEGIN))
300 return false; 307 return false;
301 308
302 return TRUE == SetEndOfFile(file); 309 return TRUE == SetEndOfFile(file);
303 } 310 }
304 311
305 size_t File::GetLength() { 312 size_t File::GetLength() {
306 DCHECK(init_); 313 DCHECK(init_);
307 LARGE_INTEGER size; 314 LARGE_INTEGER size;
308 HANDLE file = os_file(); 315 HANDLE file = platform_file();
309 if (!GetFileSizeEx(file, &size)) 316 if (!GetFileSizeEx(file, &size))
310 return 0; 317 return 0;
311 if (size.HighPart) 318 if (size.HighPart)
312 return ULONG_MAX; 319 return ULONG_MAX;
313 320
314 return static_cast<size_t>(size.LowPart); 321 return static_cast<size_t>(size.LowPart);
315 } 322 }
316 323
317 } // namespace disk_cache 324 } // namespace disk_cache
318 325
OLDNEW
« no previous file with comments | « net/disk_cache/file_posix.cc ('k') | net/disk_cache/mapped_file_posix.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698