| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "chrome/browser/chromeos/drive/file_system/search_operation.h" | 5 #include "chrome/browser/chromeos/drive/file_system/search_operation.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
| 12 #include "base/callback.h" | 12 #include "base/callback.h" |
| 13 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
| 14 #include "chrome/browser/chromeos/drive/change_list_loader.h" |
| 14 #include "chrome/browser/chromeos/drive/file_system_util.h" | 15 #include "chrome/browser/chromeos/drive/file_system_util.h" |
| 15 #include "chrome/browser/chromeos/drive/job_scheduler.h" | 16 #include "chrome/browser/chromeos/drive/job_scheduler.h" |
| 16 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" | 17 #include "chrome/browser/chromeos/drive/resource_entry_conversion.h" |
| 17 #include "chrome/browser/chromeos/drive/resource_metadata.h" | 18 #include "chrome/browser/chromeos/drive/resource_metadata.h" |
| 18 #include "content/public/browser/browser_thread.h" | 19 #include "content/public/browser/browser_thread.h" |
| 19 #include "google_apis/drive/gdata_wapi_parser.h" | 20 #include "google_apis/drive/gdata_wapi_parser.h" |
| 20 #include "url/gurl.h" | 21 #include "url/gurl.h" |
| 21 | 22 |
| 22 using content::BrowserThread; | 23 using content::BrowserThread; |
| 23 | 24 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 } | 73 } |
| 73 | 74 |
| 74 return FILE_ERROR_OK; | 75 return FILE_ERROR_OK; |
| 75 } | 76 } |
| 76 | 77 |
| 77 } // namespace | 78 } // namespace |
| 78 | 79 |
| 79 SearchOperation::SearchOperation( | 80 SearchOperation::SearchOperation( |
| 80 base::SequencedTaskRunner* blocking_task_runner, | 81 base::SequencedTaskRunner* blocking_task_runner, |
| 81 JobScheduler* scheduler, | 82 JobScheduler* scheduler, |
| 82 internal::ResourceMetadata* metadata) | 83 internal::ResourceMetadata* metadata, |
| 84 internal::LoaderController* loader_controller) |
| 83 : blocking_task_runner_(blocking_task_runner), | 85 : blocking_task_runner_(blocking_task_runner), |
| 84 scheduler_(scheduler), | 86 scheduler_(scheduler), |
| 85 metadata_(metadata), | 87 metadata_(metadata), |
| 88 loader_controller_(loader_controller), |
| 86 weak_ptr_factory_(this) { | 89 weak_ptr_factory_(this) { |
| 87 } | 90 } |
| 88 | 91 |
| 89 SearchOperation::~SearchOperation() { | 92 SearchOperation::~SearchOperation() { |
| 90 } | 93 } |
| 91 | 94 |
| 92 void SearchOperation::Search(const std::string& search_query, | 95 void SearchOperation::Search(const std::string& search_query, |
| 93 const GURL& next_link, | 96 const GURL& next_link, |
| 94 const SearchCallback& callback) { | 97 const SearchCallback& callback) { |
| 95 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 98 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 | 133 |
| 131 scoped_ptr<std::vector<SearchResultInfo> > result( | 134 scoped_ptr<std::vector<SearchResultInfo> > result( |
| 132 new std::vector<SearchResultInfo>); | 135 new std::vector<SearchResultInfo>); |
| 133 if (resource_list->entries().empty()) { | 136 if (resource_list->entries().empty()) { |
| 134 // Short cut. If the resource entry is empty, we don't need to refresh | 137 // Short cut. If the resource entry is empty, we don't need to refresh |
| 135 // the resource metadata. | 138 // the resource metadata. |
| 136 callback.Run(FILE_ERROR_OK, next_url, result.Pass()); | 139 callback.Run(FILE_ERROR_OK, next_url, result.Pass()); |
| 137 return; | 140 return; |
| 138 } | 141 } |
| 139 | 142 |
| 143 // ResolveSearchResultOnBlockingPool() may add entries newly created on the |
| 144 // server to the local metadata. |
| 145 // This may race with sync tasks so we should ask LoaderController here. |
| 140 std::vector<SearchResultInfo>* result_ptr = result.get(); | 146 std::vector<SearchResultInfo>* result_ptr = result.get(); |
| 141 base::PostTaskAndReplyWithResult( | 147 loader_controller_->ScheduleRun(base::Bind( |
| 142 blocking_task_runner_.get(), | 148 base::IgnoreResult( |
| 149 &base::PostTaskAndReplyWithResult<FileError, FileError>), |
| 150 blocking_task_runner_, |
| 143 FROM_HERE, | 151 FROM_HERE, |
| 144 base::Bind(&ResolveSearchResultOnBlockingPool, | 152 base::Bind(&ResolveSearchResultOnBlockingPool, |
| 145 metadata_, | 153 metadata_, |
| 146 base::Passed(&resource_list), | 154 base::Passed(&resource_list), |
| 147 result_ptr), | 155 result_ptr), |
| 148 base::Bind(&SearchOperation::SearchAfterResolveSearchResult, | 156 base::Bind(&SearchOperation::SearchAfterResolveSearchResult, |
| 149 weak_ptr_factory_.GetWeakPtr(), | 157 weak_ptr_factory_.GetWeakPtr(), |
| 150 callback, | 158 callback, |
| 151 next_url, | 159 next_url, |
| 152 base::Passed(&result))); | 160 base::Passed(&result)))); |
| 153 } | 161 } |
| 154 | 162 |
| 155 void SearchOperation::SearchAfterResolveSearchResult( | 163 void SearchOperation::SearchAfterResolveSearchResult( |
| 156 const SearchCallback& callback, | 164 const SearchCallback& callback, |
| 157 const GURL& next_link, | 165 const GURL& next_link, |
| 158 scoped_ptr<std::vector<SearchResultInfo> > result, | 166 scoped_ptr<std::vector<SearchResultInfo> > result, |
| 159 FileError error) { | 167 FileError error) { |
| 160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 161 DCHECK(!callback.is_null()); | 169 DCHECK(!callback.is_null()); |
| 162 DCHECK(result); | 170 DCHECK(result); |
| 163 | 171 |
| 164 if (error != FILE_ERROR_OK) { | 172 if (error != FILE_ERROR_OK) { |
| 165 callback.Run(error, GURL(), scoped_ptr<std::vector<SearchResultInfo> >()); | 173 callback.Run(error, GURL(), scoped_ptr<std::vector<SearchResultInfo> >()); |
| 166 return; | 174 return; |
| 167 } | 175 } |
| 168 | 176 |
| 169 callback.Run(error, next_link, result.Pass()); | 177 callback.Run(error, next_link, result.Pass()); |
| 170 } | 178 } |
| 171 | 179 |
| 172 } // namespace file_system | 180 } // namespace file_system |
| 173 } // namespace drive | 181 } // namespace drive |
| OLD | NEW |