| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "chrome/browser/renderer_host/database_dispatcher_host.h" | 5 #include "chrome/browser/renderer_host/database_dispatcher_host.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 | 57 |
| 58 // Every time we get a DB-related message, we AddRef() the resource | 58 // Every time we get a DB-related message, we AddRef() the resource |
| 59 // message filterto make sure it doesn't get destroyed before we have | 59 // message filterto make sure it doesn't get destroyed before we have |
| 60 // a chance to send the reply back. So we need to Release() is here | 60 // a chance to send the reply back. So we need to Release() is here |
| 61 // and allow it to be destroyed if needed. | 61 // and allow it to be destroyed if needed. |
| 62 sender->Release(); | 62 sender->Release(); |
| 63 } | 63 } |
| 64 | 64 |
| 65 // Make sure the flags used to open a DB file are consistent. | 65 // Make sure the flags used to open a DB file are consistent. |
| 66 static bool OpenFileFlagsAreConsistent(const OpenFileParams& params) { | 66 static bool OpenFileFlagsAreConsistent(const OpenFileParams& params) { |
| 67 if (params.file_name == params.db_dir) { | 67 // Is this a request for a temp file? |
| 68 return (params.desired_flags == SQLITE_OPEN_READONLY); | 68 // We should be able to delete temp files when they're closed |
| 69 // and create them as needed |
| 70 if ((params.file_name == params.db_dir) && |
| 71 (!(params.desired_flags & SQLITE_OPEN_DELETEONCLOSE) || |
| 72 !(params.desired_flags & SQLITE_OPEN_CREATE))) { |
| 73 return false; |
| 69 } | 74 } |
| 70 | 75 |
| 71 const int file_type = params.desired_flags & 0x00007F00; | 76 const int file_type = params.desired_flags & 0x00007F00; |
| 72 const bool is_exclusive = | 77 const bool is_exclusive = |
| 73 (params.desired_flags & SQLITE_OPEN_EXCLUSIVE) != 0; | 78 (params.desired_flags & SQLITE_OPEN_EXCLUSIVE) != 0; |
| 74 const bool is_delete = | 79 const bool is_delete = |
| 75 (params.desired_flags & SQLITE_OPEN_DELETEONCLOSE) != 0; | 80 (params.desired_flags & SQLITE_OPEN_DELETEONCLOSE) != 0; |
| 76 const bool is_create = | 81 const bool is_create = |
| 77 (params.desired_flags & SQLITE_OPEN_CREATE) != 0; | 82 (params.desired_flags & SQLITE_OPEN_CREATE) != 0; |
| 78 const bool is_read_only = | 83 const bool is_read_only = |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 if (params.desired_flags & SQLITE_OPEN_EXCLUSIVE) { | 164 if (params.desired_flags & SQLITE_OPEN_EXCLUSIVE) { |
| 160 flags |= base::PLATFORM_FILE_EXCLUSIVE_READ | | 165 flags |= base::PLATFORM_FILE_EXCLUSIVE_READ | |
| 161 base::PLATFORM_FILE_EXCLUSIVE_WRITE; | 166 base::PLATFORM_FILE_EXCLUSIVE_WRITE; |
| 162 } | 167 } |
| 163 | 168 |
| 164 if (params.desired_flags & SQLITE_OPEN_DELETEONCLOSE) { | 169 if (params.desired_flags & SQLITE_OPEN_DELETEONCLOSE) { |
| 165 flags |= base::PLATFORM_FILE_TEMPORARY | base::PLATFORM_FILE_HIDDEN | | 170 flags |= base::PLATFORM_FILE_TEMPORARY | base::PLATFORM_FILE_HIDDEN | |
| 166 base::PLATFORM_FILE_DELETE_ON_CLOSE; | 171 base::PLATFORM_FILE_DELETE_ON_CLOSE; |
| 167 } | 172 } |
| 168 | 173 |
| 174 // If this is a request for a handle to a temp file, get a unique file name |
| 175 FilePath file_name; |
| 176 if (params.file_name == params.db_dir) { |
| 177 if (!file_util::CreateTemporaryFileInDir(params.db_dir, &file_name)) { |
| 178 file_name = FilePath(); |
| 179 } |
| 180 } else { |
| 181 file_name = params.file_name; |
| 182 } |
| 183 |
| 169 // Try to open/create the DB file. | 184 // Try to open/create the DB file. |
| 170 base::PlatformFile file_handle = | 185 base::PlatformFile file_handle = |
| 171 base::CreatePlatformFile(params.file_name.ToWStringHack(), flags, NULL); | 186 (file_name.empty() ? base::kInvalidPlatformFileValue : |
| 187 base::CreatePlatformFile(file_name.ToWStringHack(), flags, NULL)); |
| 172 if (file_handle != base::kInvalidPlatformFileValue) { | 188 if (file_handle != base::kInvalidPlatformFileValue) { |
| 173 #if defined(OS_WIN) | 189 #if defined(OS_WIN) |
| 174 // Duplicate the file handle. | 190 // Duplicate the file handle. |
| 175 if (!DuplicateHandle(GetCurrentProcess(), file_handle, | 191 if (!DuplicateHandle(GetCurrentProcess(), file_handle, |
| 176 params.handle, &target_handle, 0, false, | 192 params.handle, &target_handle, 0, false, |
| 177 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { | 193 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) { |
| 178 // file_handle is closed whether or not DuplicateHandle succeeds. | 194 // file_handle is closed whether or not DuplicateHandle succeeds. |
| 179 target_handle = INVALID_HANDLE_VALUE; | 195 target_handle = INVALID_HANDLE_VALUE; |
| 180 } | 196 } |
| 181 #elif defined(OS_POSIX) | 197 #elif defined(OS_POSIX) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 193 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ, NULL); | 209 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ, NULL); |
| 194 if (target_dir_handle == base::kInvalidPlatformFileValue) { | 210 if (target_dir_handle == base::kInvalidPlatformFileValue) { |
| 195 base::ClosePlatformFile(target_handle); | 211 base::ClosePlatformFile(target_handle); |
| 196 target_handle = base::kInvalidPlatformFileValue; | 212 target_handle = base::kInvalidPlatformFileValue; |
| 197 } | 213 } |
| 198 } | 214 } |
| 199 #endif | 215 #endif |
| 200 } | 216 } |
| 201 } | 217 } |
| 202 | 218 |
| 203 ViewMsg_DatabaseOpenFileResponse_Params response_params = | 219 ViewMsg_DatabaseOpenFileResponse_Params response_params; |
| 204 #if defined(OS_WIN) | 220 #if defined(OS_WIN) |
| 205 { target_handle }; | 221 response_params.file_handle = target_handle; |
| 206 #elif defined(OS_POSIX) | 222 #elif defined(OS_POSIX) |
| 207 { base::FileDescriptor(target_handle, true), | 223 response_params.file_handle = base::FileDescriptor(target_handle, true); |
| 208 base::FileDescriptor(target_dir_handle, true) }; | 224 response_params.dir_handle = base::FileDescriptor(target_dir_handle, true); |
| 209 #endif | 225 #endif |
| 210 | 226 |
| 211 io_thread_message_loop->PostTask(FROM_HERE, | 227 io_thread_message_loop->PostTask(FROM_HERE, |
| 212 NewRunnableFunction(SendMessage, sender, | 228 NewRunnableFunction(SendMessage, sender, |
| 213 new ViewMsg_DatabaseOpenFileResponse(message_id, response_params))); | 229 new ViewMsg_DatabaseOpenFileResponse(message_id, response_params))); |
| 214 } | 230 } |
| 215 | 231 |
| 216 // Scheduled by the IO thread on the file thread. | 232 // Scheduled by the IO thread on the file thread. |
| 217 // Deletes the given database file, then schedules | 233 // Deletes the given database file, then schedules |
| 218 // a task on the IO thread's message loop to send an IPC back to | 234 // a task on the IO thread's message loop to send an IPC back to |
| 219 // corresponding renderer process with the error code. | 235 // corresponding renderer process with the error code. |
| 220 static void DatabaseDeleteFile( | 236 static void DatabaseDeleteFile( |
| 221 MessageLoop* io_thread_message_loop, | 237 MessageLoop* io_thread_message_loop, |
| 222 const DeleteFileParams& params, | 238 const DeleteFileParams& params, |
| 223 int32 message_id, | 239 int32 message_id, |
| 224 int reschedule_count, | 240 int reschedule_count, |
| 225 ResourceMessageFilter* sender) { | 241 ResourceMessageFilter* sender) { |
| 226 // Return an error if the file could not be deleted | 242 // Return an error if the file could not be deleted |
| 227 // after kNumDeleteRetries times. | 243 // after kNumDeleteRetries times. |
| 228 if (!reschedule_count) { | 244 if (!reschedule_count) { |
| 229 io_thread_message_loop->PostTask(FROM_HERE, | 245 io_thread_message_loop->PostTask(FROM_HERE, |
| 230 NewRunnableFunction(SendMessage, sender, | 246 NewRunnableFunction(SendMessage, sender, |
| 231 new ViewMsg_DatabaseDeleteFileResponse( | 247 new ViewMsg_DatabaseDeleteFileResponse( |
| 232 message_id, SQLITE_IOERR_DELETE))); | 248 message_id, SQLITE_IOERR_DELETE))); |
| 233 return; | 249 return; |
| 234 } | 250 } |
| 235 | 251 |
| 236 // If the file does not exist, we're done. | 252 // If the file does not exist, we're done. |
| 237 if (!file_util::PathExists(params.file_name)) { | 253 if (!file_util::PathExists(params.file_name)) { |
| 238 io_thread_message_loop->PostTask(FROM_HERE, | 254 io_thread_message_loop->PostTask(FROM_HERE, |
| 239 NewRunnableFunction(SendMessage, sender, | 255 NewRunnableFunction(SendMessage, sender, |
| 240 new ViewMsg_DatabaseDeleteFileResponse(message_id, SQLITE_OK))); | 256 new ViewMsg_DatabaseDeleteFileResponse(message_id, SQLITE_OK))); |
| 241 return; | 257 return; |
| 242 } | 258 } |
| 243 | 259 |
| 244 | 260 |
| 245 // If the file could not be deleted, try again. | 261 // If the file could not be deleted, try again. |
| 246 if (!file_util::Delete(params.file_name, false)) { | 262 if (!file_util::Delete(params.file_name, false)) { |
| 247 MessageLoop::current()->PostDelayedTask(FROM_HERE, | 263 MessageLoop::current()->PostDelayedTask(FROM_HERE, |
| 248 NewRunnableFunction(DatabaseDeleteFile, io_thread_message_loop, | 264 NewRunnableFunction(DatabaseDeleteFile, io_thread_message_loop, |
| 249 params, message_id, reschedule_count - 1, sender), | 265 params, message_id, reschedule_count - 1, sender), |
| 250 kDelayDeleteRetryMs); | 266 kDelayDeleteRetryMs); |
| 251 return; | 267 return; |
| 252 } | 268 } |
| 253 | 269 |
| 254 // File existed and it was successfully deleted | 270 // File existed and it was successfully deleted |
| 255 int error_code = SQLITE_OK; | 271 int error_code = SQLITE_OK; |
| 256 #if defined(OS_POSIX) | 272 #if defined(OS_POSIX) |
| 257 // sync the DB directory if needed | 273 // sync the DB directory if needed |
| 258 if (params.sync_dir) { | 274 if (params.sync_dir) { |
| 259 base::PlatformFile dir_fd = base::CreatePlatformFile( | 275 base::PlatformFile dir_fd = base::CreatePlatformFile( |
| 260 params.db_dir.ToWStringHack(), base::PLATFORM_FILE_READ, NULL); | 276 params.db_dir.ToWStringHack(), base::PLATFORM_FILE_READ, NULL); |
| 261 if (dir_fd == base::kInvalidPlatformFileValue) { | 277 if (dir_fd == base::kInvalidPlatformFileValue) { |
| 262 error_code = SQLITE_CANTOPEN; | 278 error_code = SQLITE_CANTOPEN; |
| 263 } else { | 279 } else { |
| 264 if (fsync(dir_fd)) { | 280 if (fsync(dir_fd)) { |
| 265 error_code = SQLITE_IOERR_DIR_FSYNC; | 281 error_code = SQLITE_IOERR_DIR_FSYNC; |
| 266 } | 282 } |
| 267 base::ClosePlatformFile(dir_fd); | 283 base::ClosePlatformFile(dir_fd); |
| 268 } | 284 } |
| 269 } | 285 } |
| 270 #endif | 286 #endif |
| 271 | 287 |
| 272 io_thread_message_loop->PostTask(FROM_HERE, | 288 io_thread_message_loop->PostTask(FROM_HERE, |
| 273 NewRunnableFunction(SendMessage, sender, | 289 NewRunnableFunction(SendMessage, sender, |
| 274 new ViewMsg_DatabaseDeleteFileResponse(message_id, error_code))); | 290 new ViewMsg_DatabaseDeleteFileResponse(message_id, error_code))); |
| 275 } | 291 } |
| 276 | 292 |
| 277 // Scheduled by the IO thread on the file thread. | 293 // Scheduled by the IO thread on the file thread. |
| 278 // Gets the attributes of the given database file, then schedules | 294 // Gets the attributes of the given database file, then schedules |
| 279 // a task on the IO thread's message loop to send an IPC back to | 295 // a task on the IO thread's message loop to send an IPC back to |
| 280 // corresponding renderer process. | 296 // corresponding renderer process. |
| 281 static void DatabaseGetFileAttributes( | 297 static void DatabaseGetFileAttributes( |
| 282 MessageLoop* io_thread_message_loop, | 298 MessageLoop* io_thread_message_loop, |
| 283 const FilePath& file_name, | 299 const FilePath& file_name, |
| 284 int32 message_id, | 300 int32 message_id, |
| 285 ResourceMessageFilter* sender) { | 301 ResourceMessageFilter* sender) { |
| 286 #if defined(OS_WIN) | 302 #if defined(OS_WIN) |
| 287 uint32 attributes = GetFileAttributes(file_name.value().c_str()); | 303 uint32 attributes = GetFileAttributes(file_name.value().c_str()); |
| 288 #elif defined(OS_POSIX) | 304 #elif defined(OS_POSIX) |
| 289 uint32 attributes = 0; | 305 uint32 attributes = 0; |
| 290 if (!access(file_name.value().c_str(), R_OK)) { | 306 if (!access(file_name.value().c_str(), R_OK)) { |
| 291 attributes |= static_cast<uint32>(R_OK); | 307 attributes |= static_cast<uint32>(R_OK); |
| 292 } | 308 } |
| 293 if (!access(file_name.value().c_str(), W_OK)) { | 309 if (!access(file_name.value().c_str(), W_OK)) { |
| 294 attributes |= static_cast<uint32>(W_OK); | 310 attributes |= static_cast<uint32>(W_OK); |
| 295 } | 311 } |
| 296 if (!attributes) { | 312 if (!attributes) { |
| 297 attributes = -1; | 313 attributes = -1; |
| 298 } | 314 } |
| 299 #endif | 315 #endif |
| 300 | 316 |
| 301 io_thread_message_loop->PostTask(FROM_HERE, | 317 io_thread_message_loop->PostTask(FROM_HERE, |
| 302 NewRunnableFunction(SendMessage, sender, | 318 NewRunnableFunction(SendMessage, sender, |
| 303 new ViewMsg_DatabaseGetFileAttributesResponse(message_id, attributes))); | 319 new ViewMsg_DatabaseGetFileAttributesResponse( |
| 320 message_id, attributes))); |
| 304 } | 321 } |
| 305 | 322 |
| 306 // Scheduled by the IO thread on the file thread. | 323 // Scheduled by the IO thread on the file thread. |
| 307 // Gets the size of the given file, then schedules a task | 324 // Gets the size of the given file, then schedules a task |
| 308 // on the IO thread's message loop to send an IPC back to | 325 // on the IO thread's message loop to send an IPC back to |
| 309 // the corresponding renderer process. | 326 // the corresponding renderer process. |
| 310 static void DatabaseGetFileSize( | 327 static void DatabaseGetFileSize( |
| 311 MessageLoop* io_thread_message_loop, | 328 MessageLoop* io_thread_message_loop, |
| 312 const FilePath& file_name, | 329 const FilePath& file_name, |
| 313 int32 message_id, | 330 int32 message_id, |
| 314 ResourceMessageFilter* sender) { | 331 ResourceMessageFilter* sender) { |
| 315 int64 size = 0; | 332 int64 size = 0; |
| 316 if (!file_util::GetFileSize(file_name, &size)) { | 333 if (!file_util::GetFileSize(file_name, &size)) { |
| 317 size = 0; | 334 size = 0; |
| 318 } | 335 } |
| 319 | 336 |
| 320 io_thread_message_loop->PostTask(FROM_HERE, | 337 io_thread_message_loop->PostTask(FROM_HERE, |
| 321 NewRunnableFunction(SendMessage, sender, | 338 NewRunnableFunction(SendMessage, sender, |
| 322 new ViewMsg_DatabaseGetFileSizeResponse(message_id, size))); | 339 new ViewMsg_DatabaseGetFileSizeResponse(message_id, size))); |
| 323 } | 340 } |
| 324 | 341 |
| 325 } // namespace | 342 } // namespace |
| 326 | 343 |
| 327 DatabaseDispatcherHost::DatabaseDispatcherHost( | 344 DatabaseDispatcherHost::DatabaseDispatcherHost( |
| 328 const FilePath& profile_path, | 345 const FilePath& profile_path, |
| 329 ResourceMessageFilter* resource_message_filter) | 346 ResourceMessageFilter* resource_message_filter) |
| 330 : profile_path_(profile_path), | 347 : profile_path_(profile_path), |
| 331 resource_message_filter_(resource_message_filter), | 348 resource_message_filter_(resource_message_filter), |
| 332 file_thread_message_loop_( | 349 file_thread_message_loop_( |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 } | 398 } |
| 382 return GetDBDir().Append(file_name); | 399 return GetDBDir().Append(file_name); |
| 383 } | 400 } |
| 384 | 401 |
| 385 void DatabaseDispatcherHost::OnDatabaseOpenFile( | 402 void DatabaseDispatcherHost::OnDatabaseOpenFile( |
| 386 const FilePath& file_name, int desired_flags, | 403 const FilePath& file_name, int desired_flags, |
| 387 int32 message_id) { | 404 int32 message_id) { |
| 388 FilePath db_file_name = GetDBFileFullPath(file_name); | 405 FilePath db_file_name = GetDBFileFullPath(file_name); |
| 389 | 406 |
| 390 if (db_file_name.empty()) { | 407 if (db_file_name.empty()) { |
| 391 ViewMsg_DatabaseOpenFileResponse_Params response_params = | 408 ViewMsg_DatabaseOpenFileResponse_Params response_params; |
| 392 #if defined(OS_WIN) | 409 #if defined(OS_WIN) |
| 393 { base::kInvalidPlatformFileValue }; | 410 response_params.file_handle = base::kInvalidPlatformFileValue; |
| 394 #elif defined(OS_POSIX) | 411 #elif defined(OS_POSIX) |
| 395 { base::FileDescriptor(base::kInvalidPlatformFileValue, true), | 412 response_params.file_handle = |
| 396 base::FileDescriptor(base::kInvalidPlatformFileValue, true) }; | 413 base::FileDescriptor(base::kInvalidPlatformFileValue, true); |
| 414 response_params.dir_handle = |
| 415 base::FileDescriptor(base::kInvalidPlatformFileValue, true); |
| 397 #endif | 416 #endif |
| 398 resource_message_filter_->Send(new ViewMsg_DatabaseOpenFileResponse( | 417 resource_message_filter_->Send(new ViewMsg_DatabaseOpenFileResponse( |
| 399 message_id, response_params)); | 418 message_id, response_params)); |
| 400 return; | 419 return; |
| 401 } | 420 } |
| 402 | 421 |
| 403 OpenFileParams params = { GetDBDir(), db_file_name, desired_flags, | 422 OpenFileParams params = { GetDBDir(), db_file_name, desired_flags, |
| 404 resource_message_filter_->handle() }; | 423 resource_message_filter_->handle() }; |
| 405 resource_message_filter_->AddRef(); | 424 resource_message_filter_->AddRef(); |
| 406 file_thread_message_loop_->PostTask(FROM_HERE, | 425 file_thread_message_loop_->PostTask(FROM_HERE, |
| 407 NewRunnableFunction(DatabaseOpenFile, MessageLoop::current(), | 426 NewRunnableFunction(DatabaseOpenFile, MessageLoop::current(), |
| 408 params, message_id, resource_message_filter_)); | 427 params, message_id, resource_message_filter_)); |
| 409 } | 428 } |
| 410 | 429 |
| 411 void DatabaseDispatcherHost::OnDatabaseDeleteFile( | 430 void DatabaseDispatcherHost::OnDatabaseDeleteFile( |
| 412 const FilePath& file_name, const bool& sync_dir, int32 message_id) { | 431 const FilePath& file_name, const bool& sync_dir, int32 message_id) { |
| 413 FilePath db_file_name = GetDBFileFullPath(file_name); | 432 FilePath db_file_name = GetDBFileFullPath(file_name); |
| 414 if (db_file_name.empty()) { | 433 if (db_file_name.empty()) { |
| 415 resource_message_filter_->Send(new ViewMsg_DatabaseDeleteFileResponse( | 434 resource_message_filter_->Send(new ViewMsg_DatabaseDeleteFileResponse( |
| 416 message_id, SQLITE_IOERR_DELETE)); | 435 message_id, SQLITE_IOERR_DELETE)); |
| 417 return; | 436 return; |
| 418 } | 437 } |
| 419 | 438 |
| 420 DeleteFileParams params = { GetDBDir(), db_file_name, sync_dir }; | 439 DeleteFileParams params = { GetDBDir(), db_file_name, sync_dir }; |
| 421 resource_message_filter_->AddRef(); | 440 resource_message_filter_->AddRef(); |
| 422 file_thread_message_loop_->PostTask(FROM_HERE, | 441 file_thread_message_loop_->PostTask(FROM_HERE, |
| 423 NewRunnableFunction(DatabaseDeleteFile, MessageLoop::current(), | 442 NewRunnableFunction(DatabaseDeleteFile, MessageLoop::current(), |
| 424 params, message_id, kNumDeleteRetries, resource_message_filter_)); | 443 params, message_id, kNumDeleteRetries, resource_message_filter_)); |
| 425 } | 444 } |
| 426 | 445 |
| 427 void DatabaseDispatcherHost::OnDatabaseGetFileAttributes( | 446 void DatabaseDispatcherHost::OnDatabaseGetFileAttributes( |
| 428 const FilePath& file_name, int32 message_id) { | 447 const FilePath& file_name, int32 message_id) { |
| 429 FilePath db_file_name = GetDBFileFullPath(file_name); | 448 FilePath db_file_name = GetDBFileFullPath(file_name); |
| 430 if (db_file_name.empty()) { | 449 if (db_file_name.empty()) { |
| 431 resource_message_filter_->Send( | 450 resource_message_filter_->Send( |
| 432 new ViewMsg_DatabaseGetFileAttributesResponse( | 451 new ViewMsg_DatabaseGetFileAttributesResponse( |
| 433 message_id, -1)); | 452 message_id, -1)); |
| 434 return; | 453 return; |
| 435 } | 454 } |
| 436 | 455 |
| 437 resource_message_filter_->AddRef(); | 456 resource_message_filter_->AddRef(); |
| 438 file_thread_message_loop_->PostTask(FROM_HERE, | 457 file_thread_message_loop_->PostTask(FROM_HERE, |
| 439 NewRunnableFunction(DatabaseGetFileAttributes, MessageLoop::current(), | 458 NewRunnableFunction(DatabaseGetFileAttributes, MessageLoop::current(), |
| 440 db_file_name, message_id, resource_message_filter_)); | 459 db_file_name, message_id, resource_message_filter_)); |
| 441 } | 460 } |
| 442 | 461 |
| 443 void DatabaseDispatcherHost::OnDatabaseGetFileSize( | 462 void DatabaseDispatcherHost::OnDatabaseGetFileSize( |
| 444 const FilePath& file_name, int32 message_id) { | 463 const FilePath& file_name, int32 message_id) { |
| 445 FilePath db_file_name = GetDBFileFullPath(file_name); | 464 FilePath db_file_name = GetDBFileFullPath(file_name); |
| 446 if (db_file_name.empty()) { | 465 if (db_file_name.empty()) { |
| 447 resource_message_filter_->Send(new ViewMsg_DatabaseGetFileSizeResponse( | 466 resource_message_filter_->Send(new ViewMsg_DatabaseGetFileSizeResponse( |
| 448 message_id, 0)); | 467 message_id, 0)); |
| 449 return; | 468 return; |
| 450 } | 469 } |
| 451 | 470 |
| 452 resource_message_filter_->AddRef(); | 471 resource_message_filter_->AddRef(); |
| 453 file_thread_message_loop_->PostTask(FROM_HERE, | 472 file_thread_message_loop_->PostTask(FROM_HERE, |
| 454 NewRunnableFunction(DatabaseGetFileSize, MessageLoop::current(), | 473 NewRunnableFunction(DatabaseGetFileSize, MessageLoop::current(), |
| 455 db_file_name, message_id, resource_message_filter_)); | 474 db_file_name, message_id, resource_message_filter_)); |
| 456 } | 475 } |
| OLD | NEW |