OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/gdata/gdata_file_system.h" | 5 #include "chrome/browser/chromeos/gdata/gdata_file_system.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/command_line.h" |
11 #include "base/file_util.h" | 12 #include "base/file_util.h" |
12 #include "base/json/json_file_value_serializer.h" | 13 #include "base/json/json_file_value_serializer.h" |
13 #include "base/json/json_reader.h" | 14 #include "base/json/json_reader.h" |
14 #include "base/json/json_writer.h" | 15 #include "base/json/json_writer.h" |
15 #include "base/message_loop.h" | 16 #include "base/message_loop.h" |
16 #include "base/message_loop_proxy.h" | 17 #include "base/message_loop_proxy.h" |
17 #include "base/metrics/histogram.h" | 18 #include "base/metrics/histogram.h" |
18 #include "base/platform_file.h" | 19 #include "base/platform_file.h" |
19 #include "base/threading/sequenced_worker_pool.h" | 20 #include "base/threading/sequenced_worker_pool.h" |
20 #include "base/values.h" | 21 #include "base/values.h" |
21 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" | 22 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" |
22 #include "chrome/browser/chromeos/gdata/gdata.pb.h" | 23 #include "chrome/browser/chromeos/gdata/gdata.pb.h" |
23 #include "chrome/browser/chromeos/gdata/gdata_documents_service.h" | 24 #include "chrome/browser/chromeos/gdata/gdata_documents_service.h" |
24 #include "chrome/browser/chromeos/gdata/gdata_download_observer.h" | 25 #include "chrome/browser/chromeos/gdata/gdata_download_observer.h" |
25 #include "chrome/browser/chromeos/gdata/gdata_protocol_handler.h" | 26 #include "chrome/browser/chromeos/gdata/gdata_protocol_handler.h" |
26 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" | 27 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" |
27 #include "chrome/browser/chromeos/gdata/gdata_util.h" | 28 #include "chrome/browser/chromeos/gdata/gdata_util.h" |
28 #include "chrome/browser/prefs/pref_service.h" | 29 #include "chrome/browser/prefs/pref_service.h" |
29 #include "chrome/browser/profiles/profile.h" | 30 #include "chrome/browser/profiles/profile.h" |
| 31 #include "chrome/common/chrome_switches.h" |
30 #include "chrome/common/chrome_notification_types.h" | 32 #include "chrome/common/chrome_notification_types.h" |
31 #include "chrome/common/pref_names.h" | 33 #include "chrome/common/pref_names.h" |
32 #include "content/public/browser/browser_thread.h" | 34 #include "content/public/browser/browser_thread.h" |
33 #include "content/public/browser/notification_details.h" | 35 #include "content/public/browser/notification_details.h" |
34 #include "net/base/mime_util.h" | 36 #include "net/base/mime_util.h" |
35 | 37 |
36 using content::BrowserThread; | 38 using content::BrowserThread; |
37 | 39 |
38 namespace gdata { | 40 namespace gdata { |
39 namespace { | 41 namespace { |
40 | 42 |
41 const char kMimeTypeJson[] = "application/json"; | 43 const char kMimeTypeJson[] = "application/json"; |
42 const char kMimeTypeOctetStream[] = "application/octet-stream"; | 44 const char kMimeTypeOctetStream[] = "application/octet-stream"; |
43 | 45 |
44 const FilePath::CharType kAccountMetadataFile[] = | 46 const FilePath::CharType kAccountMetadataFile[] = |
45 FILE_PATH_LITERAL("account_metadata.json"); | 47 FILE_PATH_LITERAL("account_metadata.json"); |
46 const FilePath::CharType kFilesystemProtoFile[] = | 48 const FilePath::CharType kFilesystemProtoFile[] = |
47 FILE_PATH_LITERAL("file_system.pb"); | 49 FILE_PATH_LITERAL("file_system.pb"); |
| 50 const FilePath::CharType kResourceMetadataDBFile[] = |
| 51 FILE_PATH_LITERAL("resource_metadata.db"); |
48 | 52 |
49 const char kEmptyFilePath[] = "/dev/null"; | 53 const char kEmptyFilePath[] = "/dev/null"; |
50 | 54 |
51 // GData update check interval (in seconds). | 55 // GData update check interval (in seconds). |
52 #ifndef NDEBUG | 56 #ifndef NDEBUG |
53 const int kGDataUpdateCheckIntervalInSec = 5; | 57 const int kGDataUpdateCheckIntervalInSec = 5; |
54 #else | 58 #else |
55 const int kGDataUpdateCheckIntervalInSec = 60; | 59 const int kGDataUpdateCheckIntervalInSec = 60; |
56 #endif | 60 #endif |
57 | 61 |
(...skipping 13 matching lines...) Expand all Loading... |
71 {-1, 1}, // Any size, dump if older than 1 minute. | 75 {-1, 1}, // Any size, dump if older than 1 minute. |
72 #else | 76 #else |
73 {0.5, 0}, // Less than 0.5MB, dump immediately. | 77 {0.5, 0}, // Less than 0.5MB, dump immediately. |
74 {1.0, 15}, // Less than 1.0MB, dump after 15 minutes. | 78 {1.0, 15}, // Less than 1.0MB, dump after 15 minutes. |
75 {2.0, 30}, | 79 {2.0, 30}, |
76 {4.0, 60}, | 80 {4.0, 60}, |
77 {-1, 120}, // Any size, dump if older than 120 minutes. | 81 {-1, 120}, // Any size, dump if older than 120 minutes. |
78 #endif | 82 #endif |
79 }; | 83 }; |
80 | 84 |
81 // Defines set of parameters sent to callback OnProtoLoaded(). | |
82 struct LoadRootFeedParams { | |
83 LoadRootFeedParams( | |
84 FilePath search_file_path, | |
85 bool should_load_from_server, | |
86 const FindEntryCallback& callback) | |
87 : search_file_path(search_file_path), | |
88 should_load_from_server(should_load_from_server), | |
89 load_error(GDATA_FILE_OK), | |
90 callback(callback) { | |
91 } | |
92 ~LoadRootFeedParams() { | |
93 } | |
94 | |
95 FilePath search_file_path; | |
96 bool should_load_from_server; | |
97 std::string proto; | |
98 GDataFileError load_error; | |
99 base::Time last_modified; | |
100 const FindEntryCallback callback; | |
101 }; | |
102 | |
103 // Returns true if file system is due to be serialized on disk based on it | 85 // Returns true if file system is due to be serialized on disk based on it |
104 // |serialized_size| and |last_serialized| timestamp. | 86 // |serialized_size| and |last_serialized| timestamp. |
105 bool ShouldSerializeFileSystemNow(size_t serialized_size, | 87 bool ShouldSerializeFileSystemNow(size_t serialized_size, |
106 const base::Time& last_serialized) { | 88 const base::Time& last_serialized) { |
107 const double size_in_mb = serialized_size / 1048576.0; | 89 const double size_in_mb = serialized_size / 1048576.0; |
108 const int last_proto_dump_in_min = | 90 const int last_proto_dump_in_min = |
109 (base::Time::Now() - last_serialized).InMinutes(); | 91 (base::Time::Now() - last_serialized).InMinutes(); |
110 for (size_t i = 0; i < arraysize(kSerializeTimetable); i++) { | 92 for (size_t i = 0; i < arraysize(kSerializeTimetable); i++) { |
111 if ((size_in_mb < kSerializeTimetable[i].size || | 93 if ((size_in_mb < kSerializeTimetable[i].size || |
112 kSerializeTimetable[i].size == -1) && | 94 kSerializeTimetable[i].size == -1) && |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 LOG(WARNING) << "GData metadata file can't be stored at " | 248 LOG(WARNING) << "GData metadata file can't be stored at " |
267 << file_path.value(); | 249 << file_path.value(); |
268 if (!file_util::Delete(file_path, true)) { | 250 if (!file_util::Delete(file_path, true)) { |
269 LOG(WARNING) << "GData metadata file can't be deleted at " | 251 LOG(WARNING) << "GData metadata file can't be deleted at " |
270 << file_path.value(); | 252 << file_path.value(); |
271 return; | 253 return; |
272 } | 254 } |
273 } | 255 } |
274 } | 256 } |
275 | 257 |
| 258 bool UseLevelDB() { |
| 259 return CommandLine::ForCurrentProcess()->HasSwitch( |
| 260 switches::kUseLevelDBForGData); |
| 261 } |
| 262 |
276 // Gets the file size of |local_file|. | 263 // Gets the file size of |local_file|. |
277 void GetLocalFileSizeOnBlockingPool(const FilePath& local_file, | 264 void GetLocalFileSizeOnBlockingPool(const FilePath& local_file, |
278 GDataFileError* error, | 265 GDataFileError* error, |
279 int64* file_size) { | 266 int64* file_size) { |
280 DCHECK(error); | 267 DCHECK(error); |
281 DCHECK(file_size); | 268 DCHECK(file_size); |
282 | 269 |
283 *file_size = 0; | 270 *file_size = 0; |
284 *error = file_util::GetFileSize(local_file, file_size) ? | 271 *error = file_util::GetFileSize(local_file, file_size) ? |
285 GDATA_FILE_OK : | 272 GDATA_FILE_OK : |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
987 directory_service_->FindEntryByPathAndRunSync(search_file_path, callback); | 974 directory_service_->FindEntryByPathAndRunSync(search_file_path, callback); |
988 } | 975 } |
989 | 976 |
990 void GDataWapiFeedLoader::ReloadFromServerIfNeeded( | 977 void GDataWapiFeedLoader::ReloadFromServerIfNeeded( |
991 ContentOrigin initial_origin, | 978 ContentOrigin initial_origin, |
992 int local_changestamp, | 979 int local_changestamp, |
993 const FilePath& search_file_path, | 980 const FilePath& search_file_path, |
994 const FindEntryCallback& callback) { | 981 const FindEntryCallback& callback) { |
995 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 982 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
996 | 983 |
| 984 DVLOG(1) << "ReloadFeedFromServerIfNeeded local_changestamp=" |
| 985 << local_changestamp << ", initial_origin=" << initial_origin; |
| 986 |
997 // First fetch the latest changestamp to see if there were any new changes | 987 // First fetch the latest changestamp to see if there were any new changes |
998 // there at all. | 988 // there at all. |
999 documents_service_->GetAccountMetadata( | 989 documents_service_->GetAccountMetadata( |
1000 base::Bind(&GDataWapiFeedLoader::OnGetAccountMetadata, | 990 base::Bind(&GDataWapiFeedLoader::OnGetAccountMetadata, |
1001 weak_ptr_factory_.GetWeakPtr(), | 991 weak_ptr_factory_.GetWeakPtr(), |
1002 initial_origin, | 992 initial_origin, |
1003 local_changestamp, | 993 local_changestamp, |
1004 search_file_path, | 994 search_file_path, |
1005 callback)); | 995 callback)); |
1006 } | 996 } |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1150 params->root_feed_changestamp); | 1140 params->root_feed_changestamp); |
1151 | 1141 |
1152 if (error != GDATA_FILE_OK) { | 1142 if (error != GDATA_FILE_OK) { |
1153 if (!params->callback.is_null()) | 1143 if (!params->callback.is_null()) |
1154 params->callback.Run(error, NULL); | 1144 params->callback.Run(error, NULL); |
1155 | 1145 |
1156 return; | 1146 return; |
1157 } | 1147 } |
1158 | 1148 |
1159 // Save file system metadata to disk. | 1149 // Save file system metadata to disk. |
1160 SaveFileSystemAsProto(); | 1150 SaveFileSystem(); |
1161 | 1151 |
1162 // If we had someone to report this too, then this retrieval was done in a | 1152 // If we had someone to report this too, then this retrieval was done in a |
1163 // context of search... so continue search. | 1153 // context of search... so continue search. |
1164 if (!params->callback.is_null()) { | 1154 if (!params->callback.is_null()) { |
1165 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, | 1155 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, |
1166 params->callback); | 1156 params->callback); |
1167 } | 1157 } |
1168 | 1158 |
1169 FOR_EACH_OBSERVER(Observer, observers_, OnFeedFromServerLoaded()); | 1159 FOR_EACH_OBSERVER(Observer, observers_, OnFeedFromServerLoaded()); |
1170 } | 1160 } |
(...skipping 1803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2974 } | 2964 } |
2975 } | 2965 } |
2976 } | 2966 } |
2977 | 2967 |
2978 void GDataWapiFeedLoader::LoadFromCache( | 2968 void GDataWapiFeedLoader::LoadFromCache( |
2979 bool should_load_from_server, | 2969 bool should_load_from_server, |
2980 const FilePath& search_file_path, | 2970 const FilePath& search_file_path, |
2981 const FindEntryCallback& callback) { | 2971 const FindEntryCallback& callback) { |
2982 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2972 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2983 | 2973 |
2984 const FilePath path = | |
2985 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( | |
2986 kFilesystemProtoFile); | |
2987 LoadRootFeedParams* params = new LoadRootFeedParams(search_file_path, | 2974 LoadRootFeedParams* params = new LoadRootFeedParams(search_file_path, |
2988 should_load_from_server, | 2975 should_load_from_server, |
2989 callback); | 2976 callback); |
2990 BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE, | 2977 FilePath path = cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META); |
2991 base::Bind(&LoadProtoOnBlockingPool, path, params), | 2978 if (UseLevelDB()) { |
2992 base::Bind(&GDataWapiFeedLoader::OnProtoLoaded, | 2979 path = path.Append(kResourceMetadataDBFile); |
2993 weak_ptr_factory_.GetWeakPtr(), | 2980 directory_service_->InitFromDB(path, blocking_task_runner_, |
2994 base::Owned(params))); | 2981 base::Bind( |
| 2982 &GDataWapiFeedLoader::ContinueWithInitializedDirectoryService, |
| 2983 weak_ptr_factory_.GetWeakPtr(), |
| 2984 base::Owned(params))); |
| 2985 } else { |
| 2986 path = path.Append(kFilesystemProtoFile); |
| 2987 BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE, |
| 2988 base::Bind(&LoadProtoOnBlockingPool, path, params), |
| 2989 base::Bind(&GDataWapiFeedLoader::OnProtoLoaded, |
| 2990 weak_ptr_factory_.GetWeakPtr(), |
| 2991 base::Owned(params))); |
| 2992 } |
2995 } | 2993 } |
2996 | 2994 |
2997 void GDataFileSystem::OnDirectoryChanged(const FilePath& directory_path) { | 2995 void GDataFileSystem::OnDirectoryChanged(const FilePath& directory_path) { |
2998 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2996 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
2999 | 2997 |
3000 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2998 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, |
3001 OnDirectoryChanged(directory_path)); | 2999 OnDirectoryChanged(directory_path)); |
3002 } | 3000 } |
3003 | 3001 |
3004 void GDataFileSystem::OnDocumentFeedFetched(int num_accumulated_entries) { | 3002 void GDataFileSystem::OnDocumentFeedFetched(int num_accumulated_entries) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3036 root_feed_changestamp); | 3034 root_feed_changestamp); |
3037 } | 3035 } |
3038 | 3036 |
3039 void GDataWapiFeedLoader::OnProtoLoaded(LoadRootFeedParams* params) { | 3037 void GDataWapiFeedLoader::OnProtoLoaded(LoadRootFeedParams* params) { |
3040 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3038 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3041 | 3039 |
3042 // If we have already received updates from the server, bail out. | 3040 // If we have already received updates from the server, bail out. |
3043 if (directory_service_->origin() == FROM_SERVER) | 3041 if (directory_service_->origin() == FROM_SERVER) |
3044 return; | 3042 return; |
3045 | 3043 |
3046 int local_changestamp = 0; | |
3047 // Update directory structure only if everything is OK and we haven't yet | 3044 // Update directory structure only if everything is OK and we haven't yet |
3048 // received the feed from the server yet. | 3045 // received the feed from the server yet. |
3049 if (params->load_error == GDATA_FILE_OK) { | 3046 if (params->load_error == GDATA_FILE_OK) { |
3050 DVLOG(1) << "ParseFromString"; | 3047 DVLOG(1) << "ParseFromString"; |
3051 if (directory_service_->ParseFromString(params->proto)) { | 3048 if (directory_service_->ParseFromString(params->proto)) { |
3052 directory_service_->set_last_serialized(params->last_modified); | 3049 directory_service_->set_last_serialized(params->last_modified); |
3053 directory_service_->set_serialized_size(params->proto.size()); | 3050 directory_service_->set_serialized_size(params->proto.size()); |
3054 local_changestamp = directory_service_->largest_changestamp(); | |
3055 } else { | 3051 } else { |
3056 params->load_error = GDATA_FILE_ERROR_FAILED; | 3052 params->load_error = GDATA_FILE_ERROR_FAILED; |
3057 LOG(WARNING) << "Parse of cached proto file failed"; | 3053 LOG(WARNING) << "Parse of cached proto file failed"; |
3058 } | 3054 } |
3059 } | 3055 } |
3060 | 3056 |
| 3057 ContinueWithInitializedDirectoryService(params, params->load_error); |
| 3058 } |
| 3059 |
| 3060 void GDataWapiFeedLoader::ContinueWithInitializedDirectoryService( |
| 3061 LoadRootFeedParams* params, |
| 3062 GDataFileError error) { |
| 3063 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 3064 |
| 3065 DVLOG(1) << "Time elapsed to load directory service from disk=" |
| 3066 << (base::Time::Now() - params->load_start_time).InMilliseconds() |
| 3067 << " milliseconds"; |
| 3068 |
3061 FindEntryCallback callback = params->callback; | 3069 FindEntryCallback callback = params->callback; |
3062 // If we got feed content from cache, try search over it. | 3070 // If we got feed content from cache, try search over it. |
3063 if (params->load_error == GDATA_FILE_OK && !callback.is_null()) { | 3071 if (error == GDATA_FILE_OK && !callback.is_null()) { |
3064 // Continue file content search operation if the delegate hasn't terminated | 3072 // Continue file content search operation if the delegate hasn't terminated |
3065 // this search branch already. | 3073 // this search branch already. |
3066 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, | 3074 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, |
3067 callback); | 3075 callback); |
3068 callback.Reset(); | 3076 callback.Reset(); |
3069 } | 3077 } |
3070 | 3078 |
3071 if (!params->should_load_from_server) | 3079 if (!params->should_load_from_server) |
3072 return; | 3080 return; |
3073 | 3081 |
3074 // Decide the |initial_origin| to pass to ReloadFromServerIfNeeded(). | 3082 // Decide the |initial_origin| to pass to ReloadFromServerIfNeeded(). |
3075 // This is used to restore directory content origin to its initial value when | 3083 // This is used to restore directory content origin to its initial value when |
3076 // we fail to retrieve the feed from server. | 3084 // we fail to retrieve the feed from server. |
3077 // By default, if directory content is not yet initialized, restore content | 3085 // By default, if directory content is not yet initialized, restore content |
3078 // origin to UNINITIALIZED in case of failure. | 3086 // origin to UNINITIALIZED in case of failure. |
3079 ContentOrigin initial_origin = UNINITIALIZED; | 3087 ContentOrigin initial_origin = UNINITIALIZED; |
3080 if (directory_service_->origin() != INITIALIZING) { | 3088 if (directory_service_->origin() != INITIALIZING) { |
3081 // If directory content is already initialized, restore content origin | 3089 // If directory content is already initialized, restore content origin |
3082 // to FROM_CACHE in case of failure. | 3090 // to FROM_CACHE in case of failure. |
3083 initial_origin = FROM_CACHE; | 3091 initial_origin = FROM_CACHE; |
3084 directory_service_->set_origin(REFRESHING); | 3092 directory_service_->set_origin(REFRESHING); |
3085 } | 3093 } |
3086 | 3094 |
3087 // Kick of the retrieval of the feed from server. If we have previously | 3095 // Kick of the retrieval of the feed from server. If we have previously |
3088 // |reported| to the original callback, then we just need to refresh the | 3096 // |reported| to the original callback, then we just need to refresh the |
3089 // content without continuing search upon operation completion. | 3097 // content without continuing search upon operation completion. |
3090 ReloadFromServerIfNeeded(initial_origin, | 3098 ReloadFromServerIfNeeded(initial_origin, |
3091 local_changestamp, | 3099 directory_service_->largest_changestamp(), |
3092 params->search_file_path, | 3100 params->search_file_path, |
3093 callback); | 3101 callback); |
3094 } | 3102 } |
3095 | 3103 |
3096 void GDataWapiFeedLoader::SaveFileSystemAsProto() { | 3104 void GDataWapiFeedLoader::SaveFileSystem() { |
3097 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3098 | 3106 |
3099 DVLOG(1) << "SaveFileSystemAsProto"; | |
3100 | |
3101 if (!ShouldSerializeFileSystemNow(directory_service_->serialized_size(), | 3107 if (!ShouldSerializeFileSystemNow(directory_service_->serialized_size(), |
3102 directory_service_->last_serialized())) { | 3108 directory_service_->last_serialized())) { |
3103 return; | 3109 return; |
3104 } | 3110 } |
3105 | 3111 |
3106 const FilePath path = | 3112 if (UseLevelDB()) { |
3107 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( | 3113 directory_service_->SaveToDB(); |
3108 kFilesystemProtoFile); | 3114 } else { |
3109 scoped_ptr<std::string> serialized_proto(new std::string()); | 3115 const FilePath path = |
3110 directory_service_->SerializeToString(serialized_proto.get()); | 3116 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( |
3111 directory_service_->set_last_serialized(base::Time::Now()); | 3117 kFilesystemProtoFile); |
3112 directory_service_->set_serialized_size(serialized_proto->size()); | 3118 scoped_ptr<std::string> serialized_proto(new std::string()); |
3113 PostBlockingPoolSequencedTask( | 3119 directory_service_->SerializeToString(serialized_proto.get()); |
3114 FROM_HERE, | 3120 directory_service_->set_last_serialized(base::Time::Now()); |
3115 blocking_task_runner_, | 3121 directory_service_->set_serialized_size(serialized_proto->size()); |
3116 base::Bind(&SaveProtoOnBlockingPool, path, | 3122 PostBlockingPoolSequencedTask( |
3117 base::Passed(serialized_proto.Pass()))); | 3123 FROM_HERE, |
| 3124 blocking_task_runner_, |
| 3125 base::Bind(&SaveProtoOnBlockingPool, path, |
| 3126 base::Passed(serialized_proto.Pass()))); |
| 3127 } |
3118 } | 3128 } |
3119 | 3129 |
3120 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, | 3130 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, |
3121 GDataFileError error, | 3131 GDataFileError error, |
3122 const FilePath& file_path) { | 3132 const FilePath& file_path) { |
3123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3124 if (!callback.is_null()) | 3134 if (!callback.is_null()) |
3125 callback.Run(error); | 3135 callback.Run(error); |
3126 } | 3136 } |
3127 | 3137 |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3502 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 3512 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, |
3503 OnFileSystemBeingUnmounted()); | 3513 OnFileSystemBeingUnmounted()); |
3504 } | 3514 } |
3505 | 3515 |
3506 void GDataFileSystem::RunAndNotifyInitialLoadFinished( | 3516 void GDataFileSystem::RunAndNotifyInitialLoadFinished( |
3507 const FindEntryCallback& callback, | 3517 const FindEntryCallback& callback, |
3508 GDataFileError error, | 3518 GDataFileError error, |
3509 GDataEntry* entry) { | 3519 GDataEntry* entry) { |
3510 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3520 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3511 | 3521 |
3512 DVLOG(1) << "Initial load finished"; | |
3513 if (!callback.is_null()) | 3522 if (!callback.is_null()) |
3514 callback.Run(error, entry); | 3523 callback.Run(error, entry); |
3515 | 3524 |
| 3525 DVLOG(1) << "RunAndNotifyInitialLoadFinished"; |
| 3526 |
3516 // Notify the observers that root directory has been initialized. | 3527 // Notify the observers that root directory has been initialized. |
3517 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 3528 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, |
3518 OnInitialLoadFinished()); | 3529 OnInitialLoadFinished()); |
3519 } | 3530 } |
3520 | 3531 |
3521 GDataFileError GDataFileSystem::AddNewDirectory( | 3532 GDataFileError GDataFileSystem::AddNewDirectory( |
3522 const FilePath& directory_path, base::Value* entry_value) { | 3533 const FilePath& directory_path, base::Value* entry_value) { |
3523 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3534 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
3524 | 3535 |
3525 if (!entry_value) | 3536 if (!entry_value) |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4168 } | 4179 } |
4169 | 4180 |
4170 PlatformFileInfoProto entry_file_info; | 4181 PlatformFileInfoProto entry_file_info; |
4171 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); | 4182 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); |
4172 *entry_proto->mutable_file_info() = entry_file_info; | 4183 *entry_proto->mutable_file_info() = entry_file_info; |
4173 if (!callback.is_null()) | 4184 if (!callback.is_null()) |
4174 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | 4185 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); |
4175 } | 4186 } |
4176 | 4187 |
4177 } // namespace gdata | 4188 } // namespace gdata |
OLD | NEW |