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" |
(...skipping 21 matching lines...) Expand all Loading... |
32 scoped_ptr<google_apis::ResourceList> resource_list, | 32 scoped_ptr<google_apis::ResourceList> resource_list, |
33 std::vector<SearchResultInfo>* result) { | 33 std::vector<SearchResultInfo>* result) { |
34 DCHECK(resource_metadata); | 34 DCHECK(resource_metadata); |
35 DCHECK(result); | 35 DCHECK(result); |
36 | 36 |
37 const ScopedVector<google_apis::ResourceEntry>& entries = | 37 const ScopedVector<google_apis::ResourceEntry>& entries = |
38 resource_list->entries(); | 38 resource_list->entries(); |
39 result->reserve(entries.size()); | 39 result->reserve(entries.size()); |
40 for (size_t i = 0; i < entries.size(); ++i) { | 40 for (size_t i = 0; i < entries.size(); ++i) { |
41 ResourceEntry entry = ConvertToResourceEntry(*entries[i]); | 41 ResourceEntry entry = ConvertToResourceEntry(*entries[i]); |
42 base::FilePath drive_file_path; | 42 const std::string id = entry.resource_id(); |
43 FileError error = resource_metadata->RefreshEntry( | 43 FileError error = resource_metadata->RefreshEntry(entry, NULL, &entry); |
44 entry, &drive_file_path, &entry); | 44 if (error == FILE_ERROR_NOT_FOUND) { |
45 if (error == FILE_ERROR_OK) { | 45 // The result is absent in local resource metadata. This can happen if |
46 result->push_back(SearchResultInfo(drive_file_path, entry)); | 46 // the metadata is not synced to the latest server state yet. In that |
47 } else if (error == FILE_ERROR_NOT_FOUND) { | 47 // case, we temporarily add the file to the special "drive/other" |
48 // The result is absent in local resource metadata. There are two cases: | 48 // directory in order to assign a path, which is needed to access the |
| 49 // file through FileSystem API. |
49 // | 50 // |
50 // 1) Resource metadata is not up-to-date, and the entry has recently | 51 // It will be moved to the right place when the metadata gets synced |
51 // been added to the drive. This is not a fatal error, so just skip to | 52 // in normal loading process in ChangeListProcessor. |
52 // add the result. We should soon receive XMPP update notification | 53 entry.set_parent_resource_id(util::kDriveOtherDirSpecialResourceId); |
53 // and refresh both the metadata and search result UI in Files.app. | 54 error = resource_metadata->AddEntry(entry); |
54 // | 55 |
55 // 2) Resource metadata is not fully loaded. | 56 // FILE_ERROR_EXISTS may happen if we have already added the entry to |
56 // TODO(kinaba) crbug.com/181075: | 57 // "drive/other" once before. That's not an error. |
57 // In this case, we are doing "fast fetch" fetching directory lists on | 58 if (error == FILE_ERROR_OK || error == FILE_ERROR_EXISTS) |
58 // the fly to quickly deliver results to the user. However, we have no | 59 error = resource_metadata->GetResourceEntryById(id, &entry); |
59 // such equivalent for Search. | 60 } |
60 } else { | 61 // Other errors are fatal. Give up to return the search result. |
61 // Otherwise, it is a fatal error. Give up to return the search result. | 62 if (error != FILE_ERROR_OK) |
62 return error; | 63 return error; |
63 } | 64 result->push_back(SearchResultInfo(resource_metadata->GetFilePath(id), |
| 65 entry)); |
64 } | 66 } |
65 | 67 |
66 return FILE_ERROR_OK; | 68 return FILE_ERROR_OK; |
67 } | 69 } |
68 | 70 |
69 } // namespace | 71 } // namespace |
70 | 72 |
71 SearchOperation::SearchOperation( | 73 SearchOperation::SearchOperation( |
72 base::SequencedTaskRunner* blocking_task_runner, | 74 base::SequencedTaskRunner* blocking_task_runner, |
73 JobScheduler* scheduler, | 75 JobScheduler* scheduler, |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 if (error != FILE_ERROR_OK) { | 161 if (error != FILE_ERROR_OK) { |
160 callback.Run(error, GURL(), scoped_ptr<std::vector<SearchResultInfo> >()); | 162 callback.Run(error, GURL(), scoped_ptr<std::vector<SearchResultInfo> >()); |
161 return; | 163 return; |
162 } | 164 } |
163 | 165 |
164 callback.Run(error, next_feed, result.Pass()); | 166 callback.Run(error, next_feed, result.Pass()); |
165 } | 167 } |
166 | 168 |
167 } // namespace file_system | 169 } // namespace file_system |
168 } // namespace drive | 170 } // namespace drive |
OLD | NEW |