Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: chrome/browser/chromeos/gdata/gdata_file_system.cc

Issue 10828385: Rename DocumentsServiceInterface to DriveServiceInterface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase. Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/file_util.h" 11 #include "base/file_util.h"
12 #include "base/json/json_file_value_serializer.h" 12 #include "base/json/json_file_value_serializer.h"
13 #include "base/message_loop.h" 13 #include "base/message_loop.h"
14 #include "base/message_loop_proxy.h" 14 #include "base/message_loop_proxy.h"
15 #include "base/metrics/histogram.h" 15 #include "base/metrics/histogram.h"
16 #include "base/platform_file.h" 16 #include "base/platform_file.h"
17 #include "base/threading/sequenced_worker_pool.h" 17 #include "base/threading/sequenced_worker_pool.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "chrome/browser/chromeos/gdata/documents_service_interface.h"
20 #include "chrome/browser/chromeos/gdata/drive_api_parser.h" 19 #include "chrome/browser/chromeos/gdata/drive_api_parser.h"
20 #include "chrome/browser/chromeos/gdata/drive_service_interface.h"
21 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h" 21 #include "chrome/browser/chromeos/gdata/drive_webapps_registry.h"
22 #include "chrome/browser/chromeos/gdata/gdata.pb.h" 22 #include "chrome/browser/chromeos/gdata/gdata.pb.h"
23 #include "chrome/browser/chromeos/gdata/gdata_download_observer.h" 23 #include "chrome/browser/chromeos/gdata/gdata_download_observer.h"
24 #include "chrome/browser/chromeos/gdata/gdata_files.h" 24 #include "chrome/browser/chromeos/gdata/gdata_files.h"
25 #include "chrome/browser/chromeos/gdata/gdata_protocol_handler.h" 25 #include "chrome/browser/chromeos/gdata/gdata_protocol_handler.h"
26 #include "chrome/browser/chromeos/gdata/gdata_system_service.h" 26 #include "chrome/browser/chromeos/gdata/gdata_system_service.h"
27 #include "chrome/browser/chromeos/gdata/gdata_uploader.h" 27 #include "chrome/browser/chromeos/gdata/gdata_uploader.h"
28 #include "chrome/browser/chromeos/gdata/gdata_util.h" 28 #include "chrome/browser/chromeos/gdata/gdata_util.h"
29 #include "chrome/browser/chromeos/gdata/task_util.h" 29 #include "chrome/browser/chromeos/gdata/task_util.h"
30 #include "chrome/browser/prefs/pref_service.h" 30 #include "chrome/browser/prefs/pref_service.h"
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 std::string resource_id; 407 std::string resource_id;
408 std::string md5; 408 std::string md5;
409 }; 409 };
410 410
411 411
412 // GDataFileSystem class implementation. 412 // GDataFileSystem class implementation.
413 413
414 GDataFileSystem::GDataFileSystem( 414 GDataFileSystem::GDataFileSystem(
415 Profile* profile, 415 Profile* profile,
416 GDataCache* cache, 416 GDataCache* cache,
417 DocumentsServiceInterface* documents_service, 417 DriveServiceInterface* drive_service,
418 GDataUploaderInterface* uploader, 418 GDataUploaderInterface* uploader,
419 DriveWebAppsRegistryInterface* webapps_registry, 419 DriveWebAppsRegistryInterface* webapps_registry,
420 base::SequencedTaskRunner* blocking_task_runner) 420 base::SequencedTaskRunner* blocking_task_runner)
421 : profile_(profile), 421 : profile_(profile),
422 cache_(cache), 422 cache_(cache),
423 uploader_(uploader), 423 uploader_(uploader),
424 documents_service_(documents_service), 424 drive_service_(drive_service),
425 webapps_registry_(webapps_registry), 425 webapps_registry_(webapps_registry),
426 update_timer_(true /* retain_user_task */, true /* is_repeating */), 426 update_timer_(true /* retain_user_task */, true /* is_repeating */),
427 hide_hosted_docs_(false), 427 hide_hosted_docs_(false),
428 blocking_task_runner_(blocking_task_runner), 428 blocking_task_runner_(blocking_task_runner),
429 ui_weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 429 ui_weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
430 ui_weak_ptr_(ui_weak_ptr_factory_.GetWeakPtr()) { 430 ui_weak_ptr_(ui_weak_ptr_factory_.GetWeakPtr()) {
431 // Should be created from the file browser extension API on UI thread. 431 // Should be created from the file browser extension API on UI thread.
432 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 432 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
433 } 433 }
434 434
435 void GDataFileSystem::Initialize() { 435 void GDataFileSystem::Initialize() {
436 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 436 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
437 437
438 documents_service_->Initialize(profile_); 438 drive_service_->Initialize(profile_);
439 439
440 directory_service_.reset(new GDataDirectoryService); 440 directory_service_.reset(new GDataDirectoryService);
441 feed_loader_.reset(new GDataWapiFeedLoader(directory_service_.get(), 441 feed_loader_.reset(new GDataWapiFeedLoader(directory_service_.get(),
442 documents_service_, 442 drive_service_,
443 webapps_registry_, 443 webapps_registry_,
444 cache_, 444 cache_,
445 blocking_task_runner_)); 445 blocking_task_runner_));
446 feed_loader_->AddObserver(this); 446 feed_loader_->AddObserver(this);
447 447
448 PrefService* pref_service = profile_->GetPrefs(); 448 PrefService* pref_service = profile_->GetPrefs();
449 hide_hosted_docs_ = pref_service->GetBoolean(prefs::kDisableGDataHostedFiles); 449 hide_hosted_docs_ = pref_service->GetBoolean(prefs::kDisableGDataHostedFiles);
450 450
451 InitializePreferenceObserver(); 451 InitializePreferenceObserver();
452 } 452 }
(...skipping 21 matching lines...) Expand all
474 } 474 }
475 475
476 GDataFileSystem::~GDataFileSystem() { 476 GDataFileSystem::~GDataFileSystem() {
477 // This should be called from UI thread, from GDataSystemService shutdown. 477 // This should be called from UI thread, from GDataSystemService shutdown.
478 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 478 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
479 479
480 feed_loader_->RemoveObserver(this); 480 feed_loader_->RemoveObserver(this);
481 481
482 // Cancel all the in-flight operations. 482 // Cancel all the in-flight operations.
483 // This asynchronously cancels the URL fetch operations. 483 // This asynchronously cancels the URL fetch operations.
484 documents_service_->CancelAll(); 484 drive_service_->CancelAll();
485 } 485 }
486 486
487 void GDataFileSystem::AddObserver( 487 void GDataFileSystem::AddObserver(
488 GDataFileSystemInterface::Observer* observer) { 488 GDataFileSystemInterface::Observer* observer) {
489 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 489 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
490 observers_.AddObserver(observer); 490 observers_.AddObserver(observer);
491 } 491 }
492 492
493 void GDataFileSystem::RemoveObserver( 493 void GDataFileSystem::RemoveObserver(
494 GDataFileSystemInterface::Observer* observer) { 494 GDataFileSystemInterface::Observer* observer) {
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 } 940 }
941 941
942 void GDataFileSystem::CopyDocumentToDirectory( 942 void GDataFileSystem::CopyDocumentToDirectory(
943 const FilePath& dir_path, 943 const FilePath& dir_path,
944 const std::string& resource_id, 944 const std::string& resource_id,
945 const FilePath::StringType& new_name, 945 const FilePath::StringType& new_name,
946 const FileOperationCallback& callback) { 946 const FileOperationCallback& callback) {
947 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 947 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
948 DCHECK(!callback.is_null()); 948 DCHECK(!callback.is_null());
949 949
950 documents_service_->CopyDocument(resource_id, new_name, 950 drive_service_->CopyDocument(resource_id, new_name,
951 base::Bind(&GDataFileSystem::OnCopyDocumentCompleted, 951 base::Bind(&GDataFileSystem::OnCopyDocumentCompleted,
952 ui_weak_ptr_, 952 ui_weak_ptr_,
953 dir_path, 953 dir_path,
954 callback)); 954 callback));
955 } 955 }
956 956
957 void GDataFileSystem::Rename(const FilePath& file_path, 957 void GDataFileSystem::Rename(const FilePath& file_path,
958 const FilePath::StringType& new_name, 958 const FilePath::StringType& new_name,
959 const FileMoveCallback& callback) { 959 const FileMoveCallback& callback) {
960 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 960 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 FilePath::StringType file_name = new_name; 998 FilePath::StringType file_name = new_name;
999 if (entry_proto->has_file_specific_info() && 999 if (entry_proto->has_file_specific_info() &&
1000 entry_proto->file_specific_info().is_hosted_document()) { 1000 entry_proto->file_specific_info().is_hosted_document()) {
1001 FilePath new_file(file_name); 1001 FilePath new_file(file_name);
1002 if (new_file.Extension() == 1002 if (new_file.Extension() ==
1003 entry_proto->file_specific_info().document_extension()) { 1003 entry_proto->file_specific_info().document_extension()) {
1004 file_name = new_file.RemoveExtension().value(); 1004 file_name = new_file.RemoveExtension().value();
1005 } 1005 }
1006 } 1006 }
1007 1007
1008 documents_service_->RenameResource( 1008 drive_service_->RenameResource(
1009 GURL(entry_proto->edit_url()), 1009 GURL(entry_proto->edit_url()),
1010 file_name, 1010 file_name,
1011 base::Bind(&GDataFileSystem::RenameEntryLocally, 1011 base::Bind(&GDataFileSystem::RenameEntryLocally,
1012 ui_weak_ptr_, 1012 ui_weak_ptr_,
1013 file_path, 1013 file_path,
1014 file_name, 1014 file_name,
1015 callback)); 1015 callback));
1016 } 1016 }
1017 1017
1018 void GDataFileSystem::Move(const FilePath& src_file_path, 1018 void GDataFileSystem::Move(const FilePath& src_file_path,
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 scoped_ptr<GDataEntryProto> src_proto = result->first.proto.Pass(); 1146 scoped_ptr<GDataEntryProto> src_proto = result->first.proto.Pass();
1147 scoped_ptr<GDataEntryProto> dir_proto = result->second.proto.Pass(); 1147 scoped_ptr<GDataEntryProto> dir_proto = result->second.proto.Pass();
1148 1148
1149 if (!dir_proto->file_info().is_directory()) { 1149 if (!dir_proto->file_info().is_directory()) {
1150 callback.Run(GDATA_FILE_ERROR_NOT_A_DIRECTORY); 1150 callback.Run(GDATA_FILE_ERROR_NOT_A_DIRECTORY);
1151 return; 1151 return;
1152 } 1152 }
1153 1153
1154 const FilePath& file_path = result->first.path; 1154 const FilePath& file_path = result->first.path;
1155 const FilePath& dir_path = result->second.path; 1155 const FilePath& dir_path = result->second.path;
1156 documents_service_->AddResourceToDirectory( 1156 drive_service_->AddResourceToDirectory(
1157 GURL(dir_proto->content_url()), 1157 GURL(dir_proto->content_url()),
1158 GURL(src_proto->edit_url()), 1158 GURL(src_proto->edit_url()),
1159 base::Bind(&GDataFileSystem::OnMoveEntryFromRootDirectoryCompleted, 1159 base::Bind(&GDataFileSystem::OnMoveEntryFromRootDirectoryCompleted,
1160 ui_weak_ptr_, 1160 ui_weak_ptr_,
1161 callback, 1161 callback,
1162 file_path, 1162 file_path,
1163 dir_path)); 1163 dir_path));
1164 } 1164 }
1165 1165
1166 void GDataFileSystem::RemoveEntryFromNonRootDirectory( 1166 void GDataFileSystem::RemoveEntryFromNonRootDirectory(
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 } 1204 }
1205 1205
1206 scoped_ptr<GDataEntryProto> entry_proto = result->first.proto.Pass(); 1206 scoped_ptr<GDataEntryProto> entry_proto = result->first.proto.Pass();
1207 scoped_ptr<GDataEntryProto> dir_proto = result->second.proto.Pass(); 1207 scoped_ptr<GDataEntryProto> dir_proto = result->second.proto.Pass();
1208 1208
1209 if (!dir_proto->file_info().is_directory()) { 1209 if (!dir_proto->file_info().is_directory()) {
1210 callback.Run(GDATA_FILE_ERROR_NOT_A_DIRECTORY, file_path); 1210 callback.Run(GDATA_FILE_ERROR_NOT_A_DIRECTORY, file_path);
1211 return; 1211 return;
1212 } 1212 }
1213 1213
1214 documents_service_->RemoveResourceFromDirectory( 1214 drive_service_->RemoveResourceFromDirectory(
1215 GURL(dir_proto->content_url()), 1215 GURL(dir_proto->content_url()),
1216 GURL(entry_proto->edit_url()), 1216 GURL(entry_proto->edit_url()),
1217 entry_proto->resource_id(), 1217 entry_proto->resource_id(),
1218 base::Bind(&GDataFileSystem::MoveEntryToRootDirectoryLocally, 1218 base::Bind(&GDataFileSystem::MoveEntryToRootDirectoryLocally,
1219 ui_weak_ptr_, 1219 ui_weak_ptr_,
1220 callback, 1220 callback,
1221 file_path, 1221 file_path,
1222 dir_path)); 1222 dir_path));
1223 } 1223 }
1224 1224
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1261 1261
1262 if (error != GDATA_FILE_OK) { 1262 if (error != GDATA_FILE_OK) {
1263 if (!callback.is_null()) { 1263 if (!callback.is_null()) {
1264 base::MessageLoopProxy::current()->PostTask( 1264 base::MessageLoopProxy::current()->PostTask(
1265 FROM_HERE, base::Bind(callback, error)); 1265 FROM_HERE, base::Bind(callback, error));
1266 } 1266 }
1267 return; 1267 return;
1268 } 1268 }
1269 1269
1270 DCHECK(entry_proto.get()); 1270 DCHECK(entry_proto.get());
1271 documents_service_->DeleteDocument( 1271 drive_service_->DeleteDocument(
1272 GURL(entry_proto->edit_url()), 1272 GURL(entry_proto->edit_url()),
1273 base::Bind(&GDataFileSystem::OnRemovedDocument, 1273 base::Bind(&GDataFileSystem::OnRemovedDocument,
1274 ui_weak_ptr_, 1274 ui_weak_ptr_,
1275 callback, 1275 callback,
1276 file_path)); 1276 file_path));
1277 } 1277 }
1278 1278
1279 void GDataFileSystem::CreateDirectory( 1279 void GDataFileSystem::CreateDirectory(
1280 const FilePath& directory_path, 1280 const FilePath& directory_path,
1281 bool is_exclusive, 1281 bool is_exclusive,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1338 // Do we have a parent directory here as well? We can't then create target 1338 // Do we have a parent directory here as well? We can't then create target
1339 // directory if this is not a recursive operation. 1339 // directory if this is not a recursive operation.
1340 if (directory_path != first_missing_path && !is_recursive) { 1340 if (directory_path != first_missing_path && !is_recursive) {
1341 if (!callback.is_null()) { 1341 if (!callback.is_null()) {
1342 MessageLoop::current()->PostTask(FROM_HERE, 1342 MessageLoop::current()->PostTask(FROM_HERE,
1343 base::Bind(callback, GDATA_FILE_ERROR_NOT_FOUND)); 1343 base::Bind(callback, GDATA_FILE_ERROR_NOT_FOUND));
1344 } 1344 }
1345 return; 1345 return;
1346 } 1346 }
1347 1347
1348 documents_service_->CreateDirectory( 1348 drive_service_->CreateDirectory(
1349 last_parent_dir_url, 1349 last_parent_dir_url,
1350 first_missing_path.BaseName().value(), 1350 first_missing_path.BaseName().value(),
1351 base::Bind(&GDataFileSystem::OnCreateDirectoryCompleted, 1351 base::Bind(&GDataFileSystem::OnCreateDirectoryCompleted,
1352 ui_weak_ptr_, 1352 ui_weak_ptr_,
1353 CreateDirectoryParams( 1353 CreateDirectoryParams(
1354 first_missing_path, 1354 first_missing_path,
1355 directory_path, 1355 directory_path,
1356 is_exclusive, 1356 is_exclusive,
1357 is_recursive, 1357 is_recursive,
1358 callback))); 1358 callback)));
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 // instead. This logic is rather complicated but here's how this works: 1633 // instead. This logic is rather complicated but here's how this works:
1634 // 1634 //
1635 // Retrieve fresh file metadata from server. We will extract file size and 1635 // Retrieve fresh file metadata from server. We will extract file size and
1636 // content url from there (we want to make sure used content url is not 1636 // content url from there (we want to make sure used content url is not
1637 // stale). 1637 // stale).
1638 // 1638 //
1639 // Check if we have enough space, based on the expected file size. 1639 // Check if we have enough space, based on the expected file size.
1640 // - if we don't have enough space, try to free up the disk space 1640 // - if we don't have enough space, try to free up the disk space
1641 // - if we still don't have enough space, return "no space" error 1641 // - if we still don't have enough space, return "no space" error
1642 // - if we have enough space, start downloading the file from the server 1642 // - if we have enough space, start downloading the file from the server
1643 documents_service_->GetDocumentEntry( 1643 drive_service_->GetDocumentEntry(
1644 resource_id, 1644 resource_id,
1645 base::Bind(&GDataFileSystem::OnGetDocumentEntry, 1645 base::Bind(&GDataFileSystem::OnGetDocumentEntry,
1646 ui_weak_ptr_, 1646 ui_weak_ptr_,
1647 cache_file_path, 1647 cache_file_path,
1648 GetFileFromCacheParams(params.virtual_file_path, 1648 GetFileFromCacheParams(params.virtual_file_path,
1649 params.local_tmp_path, 1649 params.local_tmp_path,
1650 params.content_url, 1650 params.content_url,
1651 params.resource_id, 1651 params.resource_id,
1652 params.md5, 1652 params.md5,
1653 params.mime_type, 1653 params.mime_type,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 if (!params.get_file_callback.is_null()) { 1720 if (!params.get_file_callback.is_null()) {
1721 params.get_file_callback.Run(GDATA_FILE_ERROR_NO_SPACE, 1721 params.get_file_callback.Run(GDATA_FILE_ERROR_NO_SPACE,
1722 cache_file_path, 1722 cache_file_path,
1723 params.mime_type, 1723 params.mime_type,
1724 REGULAR_FILE); 1724 REGULAR_FILE);
1725 } 1725 }
1726 return; 1726 return;
1727 } 1727 }
1728 1728
1729 // We have enough disk space. Start downloading the file. 1729 // We have enough disk space. Start downloading the file.
1730 documents_service_->DownloadFile( 1730 drive_service_->DownloadFile(
1731 params.virtual_file_path, 1731 params.virtual_file_path,
1732 params.local_tmp_path, 1732 params.local_tmp_path,
1733 content_url, 1733 content_url,
1734 base::Bind(&GDataFileSystem::OnFileDownloaded, 1734 base::Bind(&GDataFileSystem::OnFileDownloaded,
1735 ui_weak_ptr_, 1735 ui_weak_ptr_,
1736 params), 1736 params),
1737 params.get_content_callback); 1737 params.get_content_callback);
1738 } 1738 }
1739 1739
1740 void GDataFileSystem::GetEntryInfoByPath(const FilePath& file_path, 1740 void GDataFileSystem::GetEntryInfoByPath(const FilePath& file_path,
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
2099 RunTaskOnUIThread(base::Bind(&GDataFileSystem::GetAvailableSpaceOnUIThread, 2099 RunTaskOnUIThread(base::Bind(&GDataFileSystem::GetAvailableSpaceOnUIThread,
2100 ui_weak_ptr_, 2100 ui_weak_ptr_,
2101 CreateRelayCallback(callback))); 2101 CreateRelayCallback(callback)));
2102 } 2102 }
2103 2103
2104 void GDataFileSystem::GetAvailableSpaceOnUIThread( 2104 void GDataFileSystem::GetAvailableSpaceOnUIThread(
2105 const GetAvailableSpaceCallback& callback) { 2105 const GetAvailableSpaceCallback& callback) {
2106 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2106 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2107 DCHECK(!callback.is_null()); 2107 DCHECK(!callback.is_null());
2108 2108
2109 documents_service_->GetAccountMetadata( 2109 drive_service_->GetAccountMetadata(
2110 gdata::util::IsDriveV2ApiEnabled() ? 2110 gdata::util::IsDriveV2ApiEnabled() ?
2111 base::Bind(&GDataFileSystem::OnGetAboutResource, 2111 base::Bind(&GDataFileSystem::OnGetAboutResource,
2112 ui_weak_ptr_, 2112 ui_weak_ptr_,
2113 callback) : 2113 callback) :
2114 base::Bind(&GDataFileSystem::OnGetAvailableSpace, 2114 base::Bind(&GDataFileSystem::OnGetAvailableSpace,
2115 ui_weak_ptr_, 2115 ui_weak_ptr_,
2116 callback)); 2116 callback));
2117 } 2117 }
2118 2118
2119 void GDataFileSystem::OnGetAvailableSpace( 2119 void GDataFileSystem::OnGetAvailableSpace(
(...skipping 1183 matching lines...) Expand 10 before | Expand all | Expand 10 after
3303 return; 3303 return;
3304 } 3304 }
3305 3305
3306 PlatformFileInfoProto entry_file_info; 3306 PlatformFileInfoProto entry_file_info;
3307 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info); 3307 GDataEntry::ConvertPlatformFileInfoToProto(*file_info, &entry_file_info);
3308 *entry_proto->mutable_file_info() = entry_file_info; 3308 *entry_proto->mutable_file_info() = entry_file_info;
3309 callback.Run(GDATA_FILE_OK, entry_proto.Pass()); 3309 callback.Run(GDATA_FILE_OK, entry_proto.Pass());
3310 } 3310 }
3311 3311
3312 } // namespace gdata 3312 } // namespace gdata
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698