Chromium Code Reviews| 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 10 matching lines...) Expand all Loading... | |
| 68 {-1, 1}, // Any size, dump if older than 1 minute. | 72 {-1, 1}, // Any size, dump if older than 1 minute. |
| 69 #else | 73 #else |
| 70 {0.5, 0}, // Less than 0.5MB, dump immediately. | 74 {0.5, 0}, // Less than 0.5MB, dump immediately. |
| 71 {1.0, 15}, // Less than 1.0MB, dump after 15 minutes. | 75 {1.0, 15}, // Less than 1.0MB, dump after 15 minutes. |
| 72 {2.0, 30}, | 76 {2.0, 30}, |
| 73 {4.0, 60}, | 77 {4.0, 60}, |
| 74 {-1, 120}, // Any size, dump if older than 120 minutes. | 78 {-1, 120}, // Any size, dump if older than 120 minutes. |
| 75 #endif | 79 #endif |
| 76 }; | 80 }; |
| 77 | 81 |
| 78 // Defines set of parameters sent to callback OnProtoLoaded(). | |
| 79 struct LoadRootFeedParams { | |
| 80 LoadRootFeedParams( | |
| 81 FilePath search_file_path, | |
| 82 bool should_load_from_server, | |
| 83 const FindEntryCallback& callback) | |
| 84 : search_file_path(search_file_path), | |
| 85 should_load_from_server(should_load_from_server), | |
| 86 load_error(GDATA_FILE_OK), | |
| 87 callback(callback) { | |
| 88 } | |
| 89 ~LoadRootFeedParams() { | |
| 90 } | |
| 91 | |
| 92 FilePath search_file_path; | |
| 93 bool should_load_from_server; | |
| 94 std::string proto; | |
| 95 GDataFileError load_error; | |
| 96 base::Time last_modified; | |
| 97 const FindEntryCallback callback; | |
| 98 }; | |
| 99 | |
| 100 // Returns true if file system is due to be serialized on disk based on it | 82 // Returns true if file system is due to be serialized on disk based on it |
| 101 // |serialized_size| and |last_serialized| timestamp. | 83 // |serialized_size| and |last_serialized| timestamp. |
| 102 bool ShouldSerializeFileSystemNow(size_t serialized_size, | 84 bool ShouldSerializeFileSystemNow(size_t serialized_size, |
| 103 const base::Time& last_serialized) { | 85 const base::Time& last_serialized) { |
| 104 const double size_in_mb = serialized_size / 1048576.0; | 86 const double size_in_mb = serialized_size / 1048576.0; |
| 105 const int last_proto_dump_in_min = | 87 const int last_proto_dump_in_min = |
| 106 (base::Time::Now() - last_serialized).InMinutes(); | 88 (base::Time::Now() - last_serialized).InMinutes(); |
| 107 for (size_t i = 0; i < arraysize(kSerializeTimetable); i++) { | 89 for (size_t i = 0; i < arraysize(kSerializeTimetable); i++) { |
| 108 if ((size_in_mb < kSerializeTimetable[i].size || | 90 if ((size_in_mb < kSerializeTimetable[i].size || |
| 109 kSerializeTimetable[i].size == -1) && | 91 kSerializeTimetable[i].size == -1) && |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 263 LOG(WARNING) << "GData metadata file can't be stored at " | 245 LOG(WARNING) << "GData metadata file can't be stored at " |
| 264 << file_path.value(); | 246 << file_path.value(); |
| 265 if (!file_util::Delete(file_path, true)) { | 247 if (!file_util::Delete(file_path, true)) { |
| 266 LOG(WARNING) << "GData metadata file can't be deleted at " | 248 LOG(WARNING) << "GData metadata file can't be deleted at " |
| 267 << file_path.value(); | 249 << file_path.value(); |
| 268 return; | 250 return; |
| 269 } | 251 } |
| 270 } | 252 } |
| 271 } | 253 } |
| 272 | 254 |
| 255 bool UseLevelDB() { | |
| 256 return CommandLine::ForCurrentProcess()->HasSwitch( | |
| 257 switches::kUseLevelDBForGData); | |
| 258 } | |
| 259 | |
| 273 // Gets the file size of |local_file|. | 260 // Gets the file size of |local_file|. |
| 274 void GetLocalFileSizeOnBlockingPool(const FilePath& local_file, | 261 void GetLocalFileSizeOnBlockingPool(const FilePath& local_file, |
| 275 GDataFileError* error, | 262 GDataFileError* error, |
| 276 int64* file_size) { | 263 int64* file_size) { |
| 277 DCHECK(error); | 264 DCHECK(error); |
| 278 DCHECK(file_size); | 265 DCHECK(file_size); |
| 279 | 266 |
| 280 *file_size = 0; | 267 *file_size = 0; |
| 281 *error = file_util::GetFileSize(local_file, file_size) ? | 268 *error = file_util::GetFileSize(local_file, file_size) ? |
| 282 GDATA_FILE_OK : | 269 GDATA_FILE_OK : |
| (...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 943 directory_service_->FindEntryByPathAndRunSync(search_file_path, callback); | 930 directory_service_->FindEntryByPathAndRunSync(search_file_path, callback); |
| 944 } | 931 } |
| 945 | 932 |
| 946 void GDataWapiFeedLoader::ReloadFromServerIfNeeded( | 933 void GDataWapiFeedLoader::ReloadFromServerIfNeeded( |
| 947 ContentOrigin initial_origin, | 934 ContentOrigin initial_origin, |
| 948 int local_changestamp, | 935 int local_changestamp, |
| 949 const FilePath& search_file_path, | 936 const FilePath& search_file_path, |
| 950 const FindEntryCallback& callback) { | 937 const FindEntryCallback& callback) { |
| 951 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 938 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 952 | 939 |
| 940 DVLOG(1) << "ReloadFeedFromServerIfNeeded local_changestamp=" | |
| 941 << local_changestamp << ", initial_origin=" << initial_origin; | |
| 942 | |
| 953 // First fetch the latest changestamp to see if there were any new changes | 943 // First fetch the latest changestamp to see if there were any new changes |
| 954 // there at all. | 944 // there at all. |
| 955 documents_service_->GetAccountMetadata( | 945 documents_service_->GetAccountMetadata( |
| 956 base::Bind(&GDataWapiFeedLoader::OnGetAccountMetadata, | 946 base::Bind(&GDataWapiFeedLoader::OnGetAccountMetadata, |
| 957 weak_ptr_factory_.GetWeakPtr(), | 947 weak_ptr_factory_.GetWeakPtr(), |
| 958 initial_origin, | 948 initial_origin, |
| 959 local_changestamp, | 949 local_changestamp, |
| 960 search_file_path, | 950 search_file_path, |
| 961 callback)); | 951 callback)); |
| 962 } | 952 } |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1105 params->root_feed_changestamp); | 1095 params->root_feed_changestamp); |
| 1106 | 1096 |
| 1107 if (error != GDATA_FILE_OK) { | 1097 if (error != GDATA_FILE_OK) { |
| 1108 if (!params->callback.is_null()) | 1098 if (!params->callback.is_null()) |
| 1109 params->callback.Run(error, NULL); | 1099 params->callback.Run(error, NULL); |
| 1110 | 1100 |
| 1111 return; | 1101 return; |
| 1112 } | 1102 } |
| 1113 | 1103 |
| 1114 // Save file system metadata to disk. | 1104 // Save file system metadata to disk. |
| 1115 SaveFileSystemAsProto(); | 1105 SaveFileSystem(); |
| 1116 | 1106 |
| 1117 // If we had someone to report this too, then this retrieval was done in a | 1107 // If we had someone to report this too, then this retrieval was done in a |
| 1118 // context of search... so continue search. | 1108 // context of search... so continue search. |
| 1119 if (!params->callback.is_null()) { | 1109 if (!params->callback.is_null()) { |
| 1120 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, | 1110 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, |
| 1121 params->callback); | 1111 params->callback); |
| 1122 } | 1112 } |
| 1123 | 1113 |
| 1124 FOR_EACH_OBSERVER(Observer, observers_, OnFeedFromServerLoaded()); | 1114 FOR_EACH_OBSERVER(Observer, observers_, OnFeedFromServerLoaded()); |
| 1125 } | 1115 } |
| (...skipping 1745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2871 if (!callback.is_null()) | 2861 if (!callback.is_null()) |
| 2872 callback.Run(params, error); | 2862 callback.Run(params, error); |
| 2873 } | 2863 } |
| 2874 | 2864 |
| 2875 void GDataWapiFeedLoader::LoadFromCache( | 2865 void GDataWapiFeedLoader::LoadFromCache( |
| 2876 bool should_load_from_server, | 2866 bool should_load_from_server, |
| 2877 const FilePath& search_file_path, | 2867 const FilePath& search_file_path, |
| 2878 const FindEntryCallback& callback) { | 2868 const FindEntryCallback& callback) { |
| 2879 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2869 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 2880 | 2870 |
| 2881 const FilePath path = | |
| 2882 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( | |
| 2883 kFilesystemProtoFile); | |
| 2884 LoadRootFeedParams* params = new LoadRootFeedParams(search_file_path, | 2871 LoadRootFeedParams* params = new LoadRootFeedParams(search_file_path, |
| 2885 should_load_from_server, | 2872 should_load_from_server, |
| 2886 callback); | 2873 callback); |
| 2887 BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE, | 2874 FilePath path = cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META); |
| 2888 base::Bind(&LoadProtoOnBlockingPool, path, params), | 2875 if (UseLevelDB()) { |
| 2889 base::Bind(&GDataWapiFeedLoader::OnProtoLoaded, | 2876 path = path.Append(kResourceMetadataDBFile); |
| 2890 weak_ptr_factory_.GetWeakPtr(), | 2877 directory_service_->InitFromDB(path, blocking_task_runner_, params, |
| 2891 base::Owned(params))); | 2878 base::Bind( |
| 2879 &GDataWapiFeedLoader::ContinueWithInitializedDirectoryService, | |
| 2880 weak_ptr_factory_.GetWeakPtr(), | |
| 2881 base::Owned(params))); | |
| 2882 } else { | |
| 2883 path = path.Append(kFilesystemProtoFile); | |
| 2884 BrowserThread::GetBlockingPool()->PostTaskAndReply(FROM_HERE, | |
| 2885 base::Bind(&LoadProtoOnBlockingPool, path, params), | |
| 2886 base::Bind(&GDataWapiFeedLoader::OnProtoLoaded, | |
| 2887 weak_ptr_factory_.GetWeakPtr(), | |
| 2888 base::Owned(params))); | |
| 2889 } | |
| 2892 } | 2890 } |
| 2893 | 2891 |
| 2894 void GDataFileSystem::OnDirectoryChanged(const FilePath& directory_path) { | 2892 void GDataFileSystem::OnDirectoryChanged(const FilePath& directory_path) { |
| 2895 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2893 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 2896 | 2894 |
| 2897 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 2895 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, |
| 2898 OnDirectoryChanged(directory_path)); | 2896 OnDirectoryChanged(directory_path)); |
| 2899 } | 2897 } |
| 2900 | 2898 |
| 2901 void GDataFileSystem::OnDocumentFeedFetched(int num_accumulated_entries) { | 2899 void GDataFileSystem::OnDocumentFeedFetched(int num_accumulated_entries) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2933 root_feed_changestamp); | 2931 root_feed_changestamp); |
| 2934 } | 2932 } |
| 2935 | 2933 |
| 2936 void GDataWapiFeedLoader::OnProtoLoaded(LoadRootFeedParams* params) { | 2934 void GDataWapiFeedLoader::OnProtoLoaded(LoadRootFeedParams* params) { |
| 2937 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 2935 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 2938 | 2936 |
| 2939 // If we have already received updates from the server, bail out. | 2937 // If we have already received updates from the server, bail out. |
| 2940 if (directory_service_->origin() == FROM_SERVER) | 2938 if (directory_service_->origin() == FROM_SERVER) |
| 2941 return; | 2939 return; |
| 2942 | 2940 |
| 2943 int local_changestamp = 0; | |
| 2944 // Update directory structure only if everything is OK and we haven't yet | 2941 // Update directory structure only if everything is OK and we haven't yet |
| 2945 // received the feed from the server yet. | 2942 // received the feed from the server yet. |
| 2946 if (params->load_error == GDATA_FILE_OK) { | 2943 if (params->load_error == GDATA_FILE_OK) { |
| 2947 DVLOG(1) << "ParseFromString"; | 2944 DVLOG(1) << "ParseFromString"; |
| 2948 if (directory_service_->ParseFromString(params->proto)) { | 2945 if (directory_service_->ParseFromString(params->proto)) { |
| 2949 directory_service_->set_last_serialized(params->last_modified); | 2946 directory_service_->set_last_serialized(params->last_modified); |
| 2950 directory_service_->set_serialized_size(params->proto.size()); | 2947 directory_service_->set_serialized_size(params->proto.size()); |
| 2951 local_changestamp = directory_service_->largest_changestamp(); | |
| 2952 } else { | 2948 } else { |
| 2953 params->load_error = GDATA_FILE_ERROR_FAILED; | 2949 params->load_error = GDATA_FILE_ERROR_FAILED; |
| 2954 LOG(WARNING) << "Parse of cached proto file failed"; | 2950 LOG(WARNING) << "Parse of cached proto file failed"; |
| 2955 } | 2951 } |
| 2956 } | 2952 } |
| 2957 | 2953 |
| 2954 ContinueWithInitializedDirectoryService(params); | |
| 2955 } | |
| 2956 | |
| 2957 void GDataWapiFeedLoader::ContinueWithInitializedDirectoryService( | |
| 2958 LoadRootFeedParams* params) { | |
| 2959 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 2960 | |
| 2961 DVLOG(1) << "Time elapsed to load directory service from disk=" | |
| 2962 << (base::Time::Now() - params->load_start_time_).InMilliseconds() | |
| 2963 << " milliseconds"; | |
| 2964 | |
| 2958 FindEntryCallback callback = params->callback; | 2965 FindEntryCallback callback = params->callback; |
| 2959 // If we got feed content from cache, try search over it. | 2966 // If we got feed content from cache, try search over it. |
| 2960 if (params->load_error == GDATA_FILE_OK && !callback.is_null()) { | 2967 if (params->load_error == GDATA_FILE_OK && !callback.is_null()) { |
| 2961 // Continue file content search operation if the delegate hasn't terminated | 2968 // Continue file content search operation if the delegate hasn't terminated |
| 2962 // this search branch already. | 2969 // this search branch already. |
| 2963 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, | 2970 directory_service_->FindEntryByPathAndRunSync(params->search_file_path, |
| 2964 callback); | 2971 callback); |
| 2965 callback.Reset(); | 2972 callback.Reset(); |
| 2966 } | 2973 } |
| 2967 | 2974 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2978 // If directory content is already initialized, restore content origin | 2985 // If directory content is already initialized, restore content origin |
| 2979 // to FROM_CACHE in case of failure. | 2986 // to FROM_CACHE in case of failure. |
| 2980 initial_origin = FROM_CACHE; | 2987 initial_origin = FROM_CACHE; |
| 2981 directory_service_->set_origin(REFRESHING); | 2988 directory_service_->set_origin(REFRESHING); |
| 2982 } | 2989 } |
| 2983 | 2990 |
| 2984 // Kick of the retrieval of the feed from server. If we have previously | 2991 // Kick of the retrieval of the feed from server. If we have previously |
| 2985 // |reported| to the original callback, then we just need to refresh the | 2992 // |reported| to the original callback, then we just need to refresh the |
| 2986 // content without continuing search upon operation completion. | 2993 // content without continuing search upon operation completion. |
| 2987 ReloadFromServerIfNeeded(initial_origin, | 2994 ReloadFromServerIfNeeded(initial_origin, |
| 2988 local_changestamp, | 2995 directory_service_->largest_changestamp(), |
| 2989 params->search_file_path, | 2996 params->search_file_path, |
| 2990 callback); | 2997 callback); |
| 2991 } | 2998 } |
| 2992 | 2999 |
| 2993 void GDataWapiFeedLoader::SaveFileSystemAsProto() { | 3000 |
|
hashimoto
2012/08/03 05:17:07
nit: Remove this line.
| |
| 3001 void GDataWapiFeedLoader::SaveFileSystem() { | |
| 2994 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3002 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 2995 | 3003 |
| 2996 DVLOG(1) << "SaveFileSystemAsProto"; | |
| 2997 | |
| 2998 if (!ShouldSerializeFileSystemNow(directory_service_->serialized_size(), | 3004 if (!ShouldSerializeFileSystemNow(directory_service_->serialized_size(), |
| 2999 directory_service_->last_serialized())) { | 3005 directory_service_->last_serialized())) { |
| 3000 return; | 3006 return; |
| 3001 } | 3007 } |
| 3002 | 3008 |
| 3003 const FilePath path = | 3009 if (UseLevelDB()) { |
| 3004 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( | 3010 directory_service_->SaveToDB(); |
| 3005 kFilesystemProtoFile); | 3011 } else { |
| 3006 scoped_ptr<std::string> serialized_proto(new std::string()); | 3012 const FilePath path = |
| 3007 directory_service_->SerializeToString(serialized_proto.get()); | 3013 cache_->GetCacheDirectoryPath(GDataCache::CACHE_TYPE_META).Append( |
| 3008 directory_service_->set_last_serialized(base::Time::Now()); | 3014 kFilesystemProtoFile); |
| 3009 directory_service_->set_serialized_size(serialized_proto->size()); | 3015 scoped_ptr<std::string> serialized_proto(new std::string()); |
| 3010 PostBlockingPoolSequencedTask( | 3016 directory_service_->SerializeToString(serialized_proto.get()); |
| 3011 FROM_HERE, | 3017 directory_service_->set_last_serialized(base::Time::Now()); |
| 3012 blocking_task_runner_, | 3018 directory_service_->set_serialized_size(serialized_proto->size()); |
| 3013 base::Bind(&SaveProtoOnBlockingPool, path, | 3019 PostBlockingPoolSequencedTask( |
| 3014 base::Passed(serialized_proto.Pass()))); | 3020 FROM_HERE, |
| 3021 blocking_task_runner_, | |
| 3022 base::Bind(&SaveProtoOnBlockingPool, path, | |
| 3023 base::Passed(serialized_proto.Pass()))); | |
| 3024 } | |
| 3015 } | 3025 } |
| 3016 | 3026 |
| 3017 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, | 3027 void GDataFileSystem::OnFilePathUpdated(const FileOperationCallback& callback, |
| 3018 GDataFileError error, | 3028 GDataFileError error, |
| 3019 const FilePath& file_path) { | 3029 const FilePath& file_path) { |
| 3020 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3030 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 3021 if (!callback.is_null()) | 3031 if (!callback.is_null()) |
| 3022 callback.Run(error); | 3032 callback.Run(error); |
| 3023 } | 3033 } |
| 3024 | 3034 |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3381 LOG(ERROR) << "Entry for the existing file not found: " << resource_id; | 3391 LOG(ERROR) << "Entry for the existing file not found: " << resource_id; |
| 3382 } | 3392 } |
| 3383 } | 3393 } |
| 3384 | 3394 |
| 3385 void GDataFileSystem::RunAndNotifyInitialLoadFinished( | 3395 void GDataFileSystem::RunAndNotifyInitialLoadFinished( |
| 3386 const FindEntryCallback& callback, | 3396 const FindEntryCallback& callback, |
| 3387 GDataFileError error, | 3397 GDataFileError error, |
| 3388 GDataEntry* entry) { | 3398 GDataEntry* entry) { |
| 3389 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3399 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 3390 | 3400 |
| 3391 DVLOG(1) << "Initial load finished"; | |
| 3392 if (!callback.is_null()) | 3401 if (!callback.is_null()) |
| 3393 callback.Run(error, entry); | 3402 callback.Run(error, entry); |
| 3394 | 3403 |
| 3404 DVLOG(1) << "RunAndNotifyInitialLoadFinished"; | |
| 3405 | |
| 3395 // Notify the observers that root directory has been initialized. | 3406 // Notify the observers that root directory has been initialized. |
| 3396 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, | 3407 FOR_EACH_OBSERVER(GDataFileSystemInterface::Observer, observers_, |
| 3397 OnInitialLoadFinished()); | 3408 OnInitialLoadFinished()); |
| 3398 } | 3409 } |
| 3399 | 3410 |
| 3400 GDataFileError GDataFileSystem::AddNewDirectory( | 3411 GDataFileError GDataFileSystem::AddNewDirectory( |
| 3401 const FilePath& directory_path, base::Value* entry_value) { | 3412 const FilePath& directory_path, base::Value* entry_value) { |
| 3402 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 3413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 3403 | 3414 |
| 3404 if (!entry_value) | 3415 if (!entry_value) |
| (...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4051 } | 4062 } |
| 4052 | 4063 |
| 4053 PlatformFileInfoProto entry_file_info; | 4064 PlatformFileInfoProto entry_file_info; |
| 4054 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); | 4065 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); |
| 4055 *entry_proto->mutable_file_info() = entry_file_info; | 4066 *entry_proto->mutable_file_info() = entry_file_info; |
| 4056 if (!callback.is_null()) | 4067 if (!callback.is_null()) |
| 4057 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); | 4068 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); |
| 4058 } | 4069 } |
| 4059 | 4070 |
| 4060 } // namespace gdata | 4071 } // namespace gdata |
| OLD | NEW |