| 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/drive/fake_drive_service.h" | 5 #include "chrome/browser/drive/fake_drive_service.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/json/json_string_value_serializer.h" | 10 #include "base/json/json_string_value_serializer.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 UploadRangeResponse(error, | 113 UploadRangeResponse(error, |
| 114 start_position, | 114 start_position, |
| 115 end_position), | 115 end_position), |
| 116 base::Passed(&entry))); | 116 base::Passed(&entry))); |
| 117 } | 117 } |
| 118 | 118 |
| 119 void FileListCallbackAdapter(const FileListCallback& callback, | 119 void FileListCallbackAdapter(const FileListCallback& callback, |
| 120 GDataErrorCode error, | 120 GDataErrorCode error, |
| 121 scoped_ptr<ChangeList> change_list) { | 121 scoped_ptr<ChangeList> change_list) { |
| 122 scoped_ptr<FileList> file_list; | 122 scoped_ptr<FileList> file_list; |
| 123 if (change_list) { | 123 if (!change_list) { |
| 124 file_list.reset(new FileList); | 124 callback.Run(error, file_list.Pass()); |
| 125 file_list->set_next_link(change_list->next_link()); | 125 return; |
| 126 for (size_t i = 0; i < change_list->items().size(); ++i) { | 126 } |
| 127 const ChangeResource& entry = *change_list->items()[i]; | 127 |
| 128 if (entry.file()) | 128 file_list.reset(new FileList); |
| 129 file_list->mutable_items()->push_back(new FileResource(*entry.file())); | 129 file_list->set_next_link(change_list->next_link()); |
| 130 } | 130 for (size_t i = 0; i < change_list->items().size(); ++i) { |
| 131 const ChangeResource& entry = *change_list->items()[i]; |
| 132 if (entry.file()) |
| 133 file_list->mutable_items()->push_back(new FileResource(*entry.file())); |
| 131 } | 134 } |
| 132 callback.Run(error, file_list.Pass()); | 135 callback.Run(error, file_list.Pass()); |
| 133 } | 136 } |
| 134 | 137 |
| 135 bool UserHasWriteAccess(google_apis::drive::PermissionRole user_permission) { | 138 bool UserHasWriteAccess(google_apis::drive::PermissionRole user_permission) { |
| 136 switch (user_permission) { | 139 switch (user_permission) { |
| 137 case google_apis::drive::PERMISSION_ROLE_OWNER: | 140 case google_apis::drive::PERMISSION_ROLE_OWNER: |
| 138 case google_apis::drive::PERMISSION_ROLE_WRITER: | 141 case google_apis::drive::PERMISSION_ROLE_WRITER: |
| 139 return true; | 142 return true; |
| 140 case google_apis::drive::PERMISSION_ROLE_READER: | 143 case google_apis::drive::PERMISSION_ROLE_READER: |
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 609 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 607 DCHECK(!callback.is_null()); | 610 DCHECK(!callback.is_null()); |
| 608 | 611 |
| 609 if (offline_) { | 612 if (offline_) { |
| 610 base::MessageLoop::current()->PostTask( | 613 base::MessageLoop::current()->PostTask( |
| 611 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); | 614 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); |
| 612 return CancelCallback(); | 615 return CancelCallback(); |
| 613 } | 616 } |
| 614 | 617 |
| 615 EntryInfo* entry = FindEntryByResourceId(resource_id); | 618 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 616 if (entry) { | 619 if (!entry) { |
| 617 ChangeResource* change = &entry->change_resource; | |
| 618 const FileResource* file = change->file(); | |
| 619 if (change->is_deleted()) { | |
| 620 base::MessageLoop::current()->PostTask( | |
| 621 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | |
| 622 return CancelCallback(); | |
| 623 } | |
| 624 | |
| 625 if (!etag.empty() && etag != file->etag()) { | |
| 626 base::MessageLoop::current()->PostTask( | |
| 627 FROM_HERE, base::Bind(callback, HTTP_PRECONDITION)); | |
| 628 return CancelCallback(); | |
| 629 } | |
| 630 | |
| 631 if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) { | |
| 632 base::MessageLoop::current()->PostTask( | |
| 633 FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN)); | |
| 634 return CancelCallback(); | |
| 635 } | |
| 636 | |
| 637 change->set_deleted(true); | |
| 638 AddNewChangestamp(change); | |
| 639 change->set_file(scoped_ptr<FileResource>()); | |
| 640 base::MessageLoop::current()->PostTask( | 620 base::MessageLoop::current()->PostTask( |
| 641 FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT)); | 621 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 642 return CancelCallback(); | 622 return CancelCallback(); |
| 643 } | 623 } |
| 644 | 624 |
| 625 ChangeResource* change = &entry->change_resource; |
| 626 const FileResource* file = change->file(); |
| 627 if (change->is_deleted()) { |
| 628 base::MessageLoop::current()->PostTask( |
| 629 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 630 return CancelCallback(); |
| 631 } |
| 632 |
| 633 if (!etag.empty() && etag != file->etag()) { |
| 634 base::MessageLoop::current()->PostTask( |
| 635 FROM_HERE, base::Bind(callback, HTTP_PRECONDITION)); |
| 636 return CancelCallback(); |
| 637 } |
| 638 |
| 639 if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) { |
| 640 base::MessageLoop::current()->PostTask( |
| 641 FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN)); |
| 642 return CancelCallback(); |
| 643 } |
| 644 |
| 645 change->set_deleted(true); |
| 646 AddNewChangestamp(change); |
| 647 change->set_file(scoped_ptr<FileResource>()); |
| 645 base::MessageLoop::current()->PostTask( | 648 base::MessageLoop::current()->PostTask( |
| 646 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | 649 FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT)); |
| 647 return CancelCallback(); | 650 return CancelCallback(); |
| 648 } | 651 } |
| 649 | 652 |
| 650 CancelCallback FakeDriveService::TrashResource( | 653 CancelCallback FakeDriveService::TrashResource( |
| 651 const std::string& resource_id, | 654 const std::string& resource_id, |
| 652 const EntryActionCallback& callback) { | 655 const EntryActionCallback& callback) { |
| 653 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 656 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 654 DCHECK(!callback.is_null()); | 657 DCHECK(!callback.is_null()); |
| 655 | 658 |
| 656 if (offline_) { | 659 if (offline_) { |
| 657 base::MessageLoop::current()->PostTask( | 660 base::MessageLoop::current()->PostTask( |
| 658 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); | 661 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); |
| 659 return CancelCallback(); | 662 return CancelCallback(); |
| 660 } | 663 } |
| 661 | 664 |
| 662 EntryInfo* entry = FindEntryByResourceId(resource_id); | 665 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 663 if (entry) { | 666 if (!entry) { |
| 664 ChangeResource* change = &entry->change_resource; | |
| 665 FileResource* file = change->mutable_file(); | |
| 666 GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; | |
| 667 if (change->is_deleted() || file->labels().is_trashed()) { | |
| 668 error = HTTP_NOT_FOUND; | |
| 669 } else if (entry->user_permission != | |
| 670 google_apis::drive::PERMISSION_ROLE_OWNER) { | |
| 671 error = HTTP_FORBIDDEN; | |
| 672 } else { | |
| 673 file->mutable_labels()->set_trashed(true); | |
| 674 AddNewChangestamp(change); | |
| 675 error = HTTP_SUCCESS; | |
| 676 } | |
| 677 base::MessageLoop::current()->PostTask( | 667 base::MessageLoop::current()->PostTask( |
| 678 FROM_HERE, base::Bind(callback, error)); | 668 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 679 return CancelCallback(); | 669 return CancelCallback(); |
| 680 } | 670 } |
| 681 | 671 |
| 672 ChangeResource* change = &entry->change_resource; |
| 673 FileResource* file = change->mutable_file(); |
| 674 if (change->is_deleted() || file->labels().is_trashed()) { |
| 675 base::MessageLoop::current()->PostTask( |
| 676 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 677 return CancelCallback(); |
| 678 } |
| 679 |
| 680 if (entry->user_permission != google_apis::drive::PERMISSION_ROLE_OWNER) { |
| 681 base::MessageLoop::current()->PostTask( |
| 682 FROM_HERE, base::Bind(callback, HTTP_FORBIDDEN)); |
| 683 return CancelCallback(); |
| 684 } |
| 685 |
| 686 file->mutable_labels()->set_trashed(true); |
| 687 AddNewChangestamp(change); |
| 682 base::MessageLoop::current()->PostTask( | 688 base::MessageLoop::current()->PostTask( |
| 683 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | 689 FROM_HERE, base::Bind(callback, HTTP_SUCCESS)); |
| 684 return CancelCallback(); | 690 return CancelCallback(); |
| 685 } | 691 } |
| 686 | 692 |
| 687 CancelCallback FakeDriveService::DownloadFile( | 693 CancelCallback FakeDriveService::DownloadFile( |
| 688 const base::FilePath& local_cache_path, | 694 const base::FilePath& local_cache_path, |
| 689 const std::string& resource_id, | 695 const std::string& resource_id, |
| 690 const DownloadActionCallback& download_action_callback, | 696 const DownloadActionCallback& download_action_callback, |
| 691 const GetContentCallback& get_content_callback, | 697 const GetContentCallback& get_content_callback, |
| 692 const ProgressCallback& progress_callback) { | 698 const ProgressCallback& progress_callback) { |
| 693 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 699 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 721 const int64 size = std::min(kBlockSize, file_size - i); | 727 const int64 size = std::min(kBlockSize, file_size - i); |
| 722 scoped_ptr<std::string> content_for_callback( | 728 scoped_ptr<std::string> content_for_callback( |
| 723 new std::string(content_data.substr(i, size))); | 729 new std::string(content_data.substr(i, size))); |
| 724 base::MessageLoopProxy::current()->PostTask( | 730 base::MessageLoopProxy::current()->PostTask( |
| 725 FROM_HERE, | 731 FROM_HERE, |
| 726 base::Bind(get_content_callback, HTTP_SUCCESS, | 732 base::Bind(get_content_callback, HTTP_SUCCESS, |
| 727 base::Passed(&content_for_callback))); | 733 base::Passed(&content_for_callback))); |
| 728 } | 734 } |
| 729 } | 735 } |
| 730 | 736 |
| 731 if (test_util::WriteStringToFile(local_cache_path, content_data)) { | 737 if (!test_util::WriteStringToFile(local_cache_path, content_data)) { |
| 732 if (!progress_callback.is_null()) { | 738 // Failed to write the content. |
| 733 // See also the comment in ResumeUpload(). For testing that clients | |
| 734 // can handle the case progress_callback is called multiple times, | |
| 735 // here we invoke the callback twice. | |
| 736 base::MessageLoopProxy::current()->PostTask( | |
| 737 FROM_HERE, | |
| 738 base::Bind(progress_callback, file_size / 2, file_size)); | |
| 739 base::MessageLoopProxy::current()->PostTask( | |
| 740 FROM_HERE, | |
| 741 base::Bind(progress_callback, file_size, file_size)); | |
| 742 } | |
| 743 base::MessageLoopProxy::current()->PostTask( | 739 base::MessageLoopProxy::current()->PostTask( |
| 744 FROM_HERE, | 740 FROM_HERE, |
| 745 base::Bind(download_action_callback, | 741 base::Bind(download_action_callback, |
| 746 HTTP_SUCCESS, | 742 GDATA_FILE_ERROR, base::FilePath())); |
| 747 local_cache_path)); | |
| 748 return CancelCallback(); | 743 return CancelCallback(); |
| 749 } | 744 } |
| 750 | 745 |
| 751 // Failed to write the content. | 746 if (!progress_callback.is_null()) { |
| 747 // See also the comment in ResumeUpload(). For testing that clients |
| 748 // can handle the case progress_callback is called multiple times, |
| 749 // here we invoke the callback twice. |
| 750 base::MessageLoopProxy::current()->PostTask( |
| 751 FROM_HERE, |
| 752 base::Bind(progress_callback, file_size / 2, file_size)); |
| 753 base::MessageLoopProxy::current()->PostTask( |
| 754 FROM_HERE, |
| 755 base::Bind(progress_callback, file_size, file_size)); |
| 756 } |
| 752 base::MessageLoopProxy::current()->PostTask( | 757 base::MessageLoopProxy::current()->PostTask( |
| 753 FROM_HERE, | 758 FROM_HERE, |
| 754 base::Bind(download_action_callback, GDATA_FILE_ERROR, base::FilePath())); | 759 base::Bind(download_action_callback, |
| 760 HTTP_SUCCESS, |
| 761 local_cache_path)); |
| 755 return CancelCallback(); | 762 return CancelCallback(); |
| 756 } | 763 } |
| 757 | 764 |
| 758 CancelCallback FakeDriveService::CopyResource( | 765 CancelCallback FakeDriveService::CopyResource( |
| 759 const std::string& resource_id, | 766 const std::string& resource_id, |
| 760 const std::string& in_parent_resource_id, | 767 const std::string& in_parent_resource_id, |
| 761 const std::string& new_title, | 768 const std::string& new_title, |
| 762 const base::Time& last_modified, | 769 const base::Time& last_modified, |
| 763 const FileResourceCallback& callback) { | 770 const FileResourceCallback& callback) { |
| 764 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 771 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 765 DCHECK(!callback.is_null()); | 772 DCHECK(!callback.is_null()); |
| 766 | 773 |
| 767 if (offline_) { | 774 if (offline_) { |
| 768 base::MessageLoop::current()->PostTask( | 775 base::MessageLoop::current()->PostTask( |
| 769 FROM_HERE, | 776 FROM_HERE, |
| 770 base::Bind(callback, | 777 base::Bind(callback, |
| 771 GDATA_NO_CONNECTION, | 778 GDATA_NO_CONNECTION, |
| 772 base::Passed(scoped_ptr<FileResource>()))); | 779 base::Passed(scoped_ptr<FileResource>()))); |
| 773 return CancelCallback(); | 780 return CancelCallback(); |
| 774 } | 781 } |
| 775 | 782 |
| 776 const std::string& parent_resource_id = in_parent_resource_id.empty() ? | 783 const std::string& parent_resource_id = in_parent_resource_id.empty() ? |
| 777 GetRootResourceId() : in_parent_resource_id; | 784 GetRootResourceId() : in_parent_resource_id; |
| 778 | 785 |
| 779 EntryInfo* entry = FindEntryByResourceId(resource_id); | 786 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 780 if (entry) { | 787 if (!entry) { |
| 781 // Make a copy and set the new resource ID and the new title. | |
| 782 scoped_ptr<EntryInfo> copied_entry(new EntryInfo); | |
| 783 copied_entry->content_data = entry->content_data; | |
| 784 copied_entry->share_url = entry->share_url; | |
| 785 copied_entry->change_resource.set_file( | |
| 786 make_scoped_ptr(new FileResource(*entry->change_resource.file()))); | |
| 787 | |
| 788 ChangeResource* new_change = &copied_entry->change_resource; | |
| 789 FileResource* new_file = new_change->mutable_file(); | |
| 790 const std::string new_resource_id = GetNewResourceId(); | |
| 791 new_change->set_file_id(new_resource_id); | |
| 792 new_file->set_file_id(new_resource_id); | |
| 793 new_file->set_title(new_title); | |
| 794 | |
| 795 ParentReference parent; | |
| 796 parent.set_file_id(parent_resource_id); | |
| 797 parent.set_parent_link(GetFakeLinkUrl(parent_resource_id)); | |
| 798 std::vector<ParentReference> parents; | |
| 799 parents.push_back(parent); | |
| 800 *new_file->mutable_parents() = parents; | |
| 801 | |
| 802 if (!last_modified.is_null()) | |
| 803 new_file->set_modified_date(last_modified); | |
| 804 | |
| 805 AddNewChangestamp(new_change); | |
| 806 UpdateETag(new_file); | |
| 807 | |
| 808 // Add the new entry to the map. | |
| 809 entries_[new_resource_id] = copied_entry.release(); | |
| 810 | |
| 811 base::MessageLoop::current()->PostTask( | 788 base::MessageLoop::current()->PostTask( |
| 812 FROM_HERE, | 789 FROM_HERE, |
| 813 base::Bind(callback, | 790 base::Bind(callback, HTTP_NOT_FOUND, |
| 814 HTTP_SUCCESS, | 791 base::Passed(scoped_ptr<FileResource>()))); |
| 815 base::Passed(make_scoped_ptr(new FileResource(*new_file))))); | |
| 816 return CancelCallback(); | 792 return CancelCallback(); |
| 817 } | 793 } |
| 818 | 794 |
| 795 // Make a copy and set the new resource ID and the new title. |
| 796 scoped_ptr<EntryInfo> copied_entry(new EntryInfo); |
| 797 copied_entry->content_data = entry->content_data; |
| 798 copied_entry->share_url = entry->share_url; |
| 799 copied_entry->change_resource.set_file( |
| 800 make_scoped_ptr(new FileResource(*entry->change_resource.file()))); |
| 801 |
| 802 ChangeResource* new_change = &copied_entry->change_resource; |
| 803 FileResource* new_file = new_change->mutable_file(); |
| 804 const std::string new_resource_id = GetNewResourceId(); |
| 805 new_change->set_file_id(new_resource_id); |
| 806 new_file->set_file_id(new_resource_id); |
| 807 new_file->set_title(new_title); |
| 808 |
| 809 ParentReference parent; |
| 810 parent.set_file_id(parent_resource_id); |
| 811 parent.set_parent_link(GetFakeLinkUrl(parent_resource_id)); |
| 812 std::vector<ParentReference> parents; |
| 813 parents.push_back(parent); |
| 814 *new_file->mutable_parents() = parents; |
| 815 |
| 816 if (!last_modified.is_null()) |
| 817 new_file->set_modified_date(last_modified); |
| 818 |
| 819 AddNewChangestamp(new_change); |
| 820 UpdateETag(new_file); |
| 821 |
| 822 // Add the new entry to the map. |
| 823 entries_[new_resource_id] = copied_entry.release(); |
| 824 |
| 819 base::MessageLoop::current()->PostTask( | 825 base::MessageLoop::current()->PostTask( |
| 820 FROM_HERE, | 826 FROM_HERE, |
| 821 base::Bind(callback, HTTP_NOT_FOUND, | 827 base::Bind(callback, |
| 822 base::Passed(scoped_ptr<FileResource>()))); | 828 HTTP_SUCCESS, |
| 829 base::Passed(make_scoped_ptr(new FileResource(*new_file))))); |
| 823 return CancelCallback(); | 830 return CancelCallback(); |
| 824 } | 831 } |
| 825 | 832 |
| 826 CancelCallback FakeDriveService::UpdateResource( | 833 CancelCallback FakeDriveService::UpdateResource( |
| 827 const std::string& resource_id, | 834 const std::string& resource_id, |
| 828 const std::string& parent_resource_id, | 835 const std::string& parent_resource_id, |
| 829 const std::string& new_title, | 836 const std::string& new_title, |
| 830 const base::Time& last_modified, | 837 const base::Time& last_modified, |
| 831 const base::Time& last_viewed_by_me, | 838 const base::Time& last_viewed_by_me, |
| 832 const google_apis::FileResourceCallback& callback) { | 839 const google_apis::FileResourceCallback& callback) { |
| 833 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 840 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 834 DCHECK(!callback.is_null()); | 841 DCHECK(!callback.is_null()); |
| 835 | 842 |
| 836 if (offline_) { | 843 if (offline_) { |
| 837 base::MessageLoop::current()->PostTask( | 844 base::MessageLoop::current()->PostTask( |
| 838 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION, | 845 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION, |
| 839 base::Passed(scoped_ptr<FileResource>()))); | 846 base::Passed(scoped_ptr<FileResource>()))); |
| 840 return CancelCallback(); | 847 return CancelCallback(); |
| 841 } | 848 } |
| 842 | 849 |
| 843 EntryInfo* entry = FindEntryByResourceId(resource_id); | 850 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 844 if (entry) { | 851 if (!entry) { |
| 845 if (!UserHasWriteAccess(entry->user_permission)) { | |
| 846 base::MessageLoop::current()->PostTask( | |
| 847 FROM_HERE, | |
| 848 base::Bind(callback, HTTP_FORBIDDEN, | |
| 849 base::Passed(scoped_ptr<FileResource>()))); | |
| 850 return CancelCallback(); | |
| 851 } | |
| 852 | |
| 853 ChangeResource* change = &entry->change_resource; | |
| 854 FileResource* file = change->mutable_file(); | |
| 855 | |
| 856 if (!new_title.empty()) | |
| 857 file->set_title(new_title); | |
| 858 | |
| 859 // Set parent if necessary. | |
| 860 if (!parent_resource_id.empty()) { | |
| 861 ParentReference parent; | |
| 862 parent.set_file_id(parent_resource_id); | |
| 863 parent.set_parent_link(GetFakeLinkUrl(parent_resource_id)); | |
| 864 | |
| 865 std::vector<ParentReference> parents; | |
| 866 parents.push_back(parent); | |
| 867 *file->mutable_parents() = parents; | |
| 868 } | |
| 869 | |
| 870 if (!last_modified.is_null()) | |
| 871 file->set_modified_date(last_modified); | |
| 872 | |
| 873 if (!last_viewed_by_me.is_null()) | |
| 874 file->set_last_viewed_by_me_date(last_viewed_by_me); | |
| 875 | |
| 876 AddNewChangestamp(change); | |
| 877 UpdateETag(file); | |
| 878 | |
| 879 base::MessageLoop::current()->PostTask( | 852 base::MessageLoop::current()->PostTask( |
| 880 FROM_HERE, | 853 FROM_HERE, |
| 881 base::Bind(callback, HTTP_SUCCESS, | 854 base::Bind(callback, HTTP_NOT_FOUND, |
| 882 base::Passed(make_scoped_ptr(new FileResource(*file))))); | 855 base::Passed(scoped_ptr<FileResource>()))); |
| 883 return CancelCallback(); | 856 return CancelCallback(); |
| 884 } | 857 } |
| 885 | 858 |
| 859 if (!UserHasWriteAccess(entry->user_permission)) { |
| 860 base::MessageLoop::current()->PostTask( |
| 861 FROM_HERE, |
| 862 base::Bind(callback, HTTP_FORBIDDEN, |
| 863 base::Passed(scoped_ptr<FileResource>()))); |
| 864 return CancelCallback(); |
| 865 } |
| 866 |
| 867 ChangeResource* change = &entry->change_resource; |
| 868 FileResource* file = change->mutable_file(); |
| 869 |
| 870 if (!new_title.empty()) |
| 871 file->set_title(new_title); |
| 872 |
| 873 // Set parent if necessary. |
| 874 if (!parent_resource_id.empty()) { |
| 875 ParentReference parent; |
| 876 parent.set_file_id(parent_resource_id); |
| 877 parent.set_parent_link(GetFakeLinkUrl(parent_resource_id)); |
| 878 |
| 879 std::vector<ParentReference> parents; |
| 880 parents.push_back(parent); |
| 881 *file->mutable_parents() = parents; |
| 882 } |
| 883 |
| 884 if (!last_modified.is_null()) |
| 885 file->set_modified_date(last_modified); |
| 886 |
| 887 if (!last_viewed_by_me.is_null()) |
| 888 file->set_last_viewed_by_me_date(last_viewed_by_me); |
| 889 |
| 890 AddNewChangestamp(change); |
| 891 UpdateETag(file); |
| 892 |
| 886 base::MessageLoop::current()->PostTask( | 893 base::MessageLoop::current()->PostTask( |
| 887 FROM_HERE, | 894 FROM_HERE, |
| 888 base::Bind(callback, HTTP_NOT_FOUND, | 895 base::Bind(callback, HTTP_SUCCESS, |
| 889 base::Passed(scoped_ptr<FileResource>()))); | 896 base::Passed(make_scoped_ptr(new FileResource(*file))))); |
| 890 return CancelCallback(); | 897 return CancelCallback(); |
| 891 } | 898 } |
| 892 | 899 |
| 893 CancelCallback FakeDriveService::AddResourceToDirectory( | 900 CancelCallback FakeDriveService::AddResourceToDirectory( |
| 894 const std::string& parent_resource_id, | 901 const std::string& parent_resource_id, |
| 895 const std::string& resource_id, | 902 const std::string& resource_id, |
| 896 const EntryActionCallback& callback) { | 903 const EntryActionCallback& callback) { |
| 897 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 904 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 898 DCHECK(!callback.is_null()); | 905 DCHECK(!callback.is_null()); |
| 899 | 906 |
| 900 if (offline_) { | 907 if (offline_) { |
| 901 base::MessageLoop::current()->PostTask( | 908 base::MessageLoop::current()->PostTask( |
| 902 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); | 909 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); |
| 903 return CancelCallback(); | 910 return CancelCallback(); |
| 904 } | 911 } |
| 905 | 912 |
| 906 EntryInfo* entry = FindEntryByResourceId(resource_id); | 913 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 907 if (entry) { | 914 if (!entry) { |
| 908 ChangeResource* change = &entry->change_resource; | |
| 909 // On the real Drive server, resources do not necessary shape a tree | |
| 910 // structure. That is, each resource can have multiple parent. | |
| 911 // We mimic the behavior here; AddResourceToDirectoy just adds | |
| 912 // one more parent, not overwriting old ones. | |
| 913 ParentReference parent; | |
| 914 parent.set_file_id(parent_resource_id); | |
| 915 parent.set_parent_link(GetFakeLinkUrl(parent_resource_id)); | |
| 916 change->mutable_file()->mutable_parents()->push_back(parent); | |
| 917 | |
| 918 AddNewChangestamp(change); | |
| 919 base::MessageLoop::current()->PostTask( | 915 base::MessageLoop::current()->PostTask( |
| 920 FROM_HERE, base::Bind(callback, HTTP_SUCCESS)); | 916 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 921 return CancelCallback(); | 917 return CancelCallback(); |
| 922 } | 918 } |
| 923 | 919 |
| 920 ChangeResource* change = &entry->change_resource; |
| 921 // On the real Drive server, resources do not necessary shape a tree |
| 922 // structure. That is, each resource can have multiple parent. |
| 923 // We mimic the behavior here; AddResourceToDirectoy just adds |
| 924 // one more parent, not overwriting old ones. |
| 925 ParentReference parent; |
| 926 parent.set_file_id(parent_resource_id); |
| 927 parent.set_parent_link(GetFakeLinkUrl(parent_resource_id)); |
| 928 change->mutable_file()->mutable_parents()->push_back(parent); |
| 929 |
| 930 AddNewChangestamp(change); |
| 924 base::MessageLoop::current()->PostTask( | 931 base::MessageLoop::current()->PostTask( |
| 925 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | 932 FROM_HERE, base::Bind(callback, HTTP_SUCCESS)); |
| 926 return CancelCallback(); | 933 return CancelCallback(); |
| 927 } | 934 } |
| 928 | 935 |
| 929 CancelCallback FakeDriveService::RemoveResourceFromDirectory( | 936 CancelCallback FakeDriveService::RemoveResourceFromDirectory( |
| 930 const std::string& parent_resource_id, | 937 const std::string& parent_resource_id, |
| 931 const std::string& resource_id, | 938 const std::string& resource_id, |
| 932 const EntryActionCallback& callback) { | 939 const EntryActionCallback& callback) { |
| 933 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 940 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 934 DCHECK(!callback.is_null()); | 941 DCHECK(!callback.is_null()); |
| 935 | 942 |
| 936 if (offline_) { | 943 if (offline_) { |
| 937 base::MessageLoop::current()->PostTask( | 944 base::MessageLoop::current()->PostTask( |
| 938 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); | 945 FROM_HERE, base::Bind(callback, GDATA_NO_CONNECTION)); |
| 939 return CancelCallback(); | 946 return CancelCallback(); |
| 940 } | 947 } |
| 941 | 948 |
| 942 EntryInfo* entry = FindEntryByResourceId(resource_id); | 949 EntryInfo* entry = FindEntryByResourceId(resource_id); |
| 943 if (entry) { | 950 if (!entry) { |
| 944 ChangeResource* change = &entry->change_resource; | 951 base::MessageLoop::current()->PostTask( |
| 945 FileResource* file = change->mutable_file(); | 952 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 946 std::vector<ParentReference>* parents = file->mutable_parents(); | 953 return CancelCallback(); |
| 947 for (size_t i = 0; i < parents->size(); ++i) { | 954 } |
| 948 if ((*parents)[i].file_id() == parent_resource_id) { | 955 |
| 949 parents->erase(parents->begin() + i); | 956 ChangeResource* change = &entry->change_resource; |
| 950 AddNewChangestamp(change); | 957 FileResource* file = change->mutable_file(); |
| 951 base::MessageLoop::current()->PostTask( | 958 std::vector<ParentReference>* parents = file->mutable_parents(); |
| 952 FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT)); | 959 for (size_t i = 0; i < parents->size(); ++i) { |
| 953 return CancelCallback(); | 960 if ((*parents)[i].file_id() == parent_resource_id) { |
| 954 } | 961 parents->erase(parents->begin() + i); |
| 962 AddNewChangestamp(change); |
| 963 base::MessageLoop::current()->PostTask( |
| 964 FROM_HERE, base::Bind(callback, HTTP_NO_CONTENT)); |
| 965 return CancelCallback(); |
| 955 } | 966 } |
| 956 } | 967 } |
| 957 | 968 |
| 958 base::MessageLoop::current()->PostTask( | 969 base::MessageLoop::current()->PostTask( |
| 959 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); | 970 FROM_HERE, base::Bind(callback, HTTP_NOT_FOUND)); |
| 960 return CancelCallback(); | 971 return CancelCallback(); |
| 961 } | 972 } |
| 962 | 973 |
| 963 CancelCallback FakeDriveService::AddNewDirectory( | 974 CancelCallback FakeDriveService::AddNewDirectory( |
| 964 const std::string& parent_resource_id, | 975 const std::string& parent_resource_id, |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 app_id.c_str()))); | 1212 app_id.c_str()))); |
| 1202 return CancelCallback(); | 1213 return CancelCallback(); |
| 1203 } | 1214 } |
| 1204 | 1215 |
| 1205 CancelCallback FakeDriveService::UninstallApp( | 1216 CancelCallback FakeDriveService::UninstallApp( |
| 1206 const std::string& app_id, | 1217 const std::string& app_id, |
| 1207 const google_apis::EntryActionCallback& callback) { | 1218 const google_apis::EntryActionCallback& callback) { |
| 1208 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1219 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1209 DCHECK(!callback.is_null()); | 1220 DCHECK(!callback.is_null()); |
| 1210 | 1221 |
| 1222 if (offline_) { |
| 1223 base::MessageLoop::current()->PostTask( |
| 1224 FROM_HERE, |
| 1225 base::Bind(callback, google_apis::GDATA_NO_CONNECTION)); |
| 1226 return CancelCallback(); |
| 1227 } |
| 1228 |
| 1211 // Find app_id from app_info_value_ and delete. | 1229 // Find app_id from app_info_value_ and delete. |
| 1212 google_apis::GDataErrorCode error = google_apis::HTTP_NOT_FOUND; | 1230 base::ListValue* items = NULL; |
| 1213 if (offline_) { | 1231 if (!app_info_value_->GetList("items", &items)) { |
| 1214 error = google_apis::GDATA_NO_CONNECTION; | 1232 base::MessageLoop::current()->PostTask( |
| 1215 } else { | 1233 FROM_HERE, |
| 1216 base::ListValue* items = NULL; | 1234 base::Bind(callback, google_apis::HTTP_NOT_FOUND)); |
| 1217 if (app_info_value_->GetList("items", &items)) { | 1235 return CancelCallback(); |
| 1218 for (size_t i = 0; i < items->GetSize(); ++i) { | 1236 } |
| 1219 base::DictionaryValue* item = NULL; | 1237 |
| 1220 std::string id; | 1238 for (size_t i = 0; i < items->GetSize(); ++i) { |
| 1221 if (items->GetDictionary(i, &item) && item->GetString("id", &id) && | 1239 base::DictionaryValue* item = NULL; |
| 1222 id == app_id) { | 1240 std::string id; |
| 1223 if (items->Remove(i, NULL)) | 1241 if (items->GetDictionary(i, &item) && item->GetString("id", &id) && |
| 1224 error = google_apis::HTTP_NO_CONTENT; | 1242 id == app_id) { |
| 1225 break; | 1243 base::MessageLoop::current()->PostTask( |
| 1226 } | 1244 FROM_HERE, |
| 1227 } | 1245 base::Bind(callback, |
| 1246 items->Remove(i, NULL) ? google_apis::HTTP_NO_CONTENT |
| 1247 : google_apis::HTTP_NOT_FOUND)); |
| 1248 return CancelCallback(); |
| 1228 } | 1249 } |
| 1229 } | 1250 } |
| 1230 | 1251 |
| 1231 base::MessageLoop::current()->PostTask(FROM_HERE, | 1252 base::MessageLoop::current()->PostTask( |
| 1232 base::Bind(callback, error)); | 1253 FROM_HERE, |
| 1254 base::Bind(callback, google_apis::HTTP_NOT_FOUND)); |
| 1233 return CancelCallback(); | 1255 return CancelCallback(); |
| 1234 } | 1256 } |
| 1235 | 1257 |
| 1236 void FakeDriveService::AddNewFile(const std::string& content_type, | 1258 void FakeDriveService::AddNewFile(const std::string& content_type, |
| 1237 const std::string& content_data, | 1259 const std::string& content_data, |
| 1238 const std::string& parent_resource_id, | 1260 const std::string& parent_resource_id, |
| 1239 const std::string& title, | 1261 const std::string& title, |
| 1240 bool shared_with_me, | 1262 bool shared_with_me, |
| 1241 const FileResourceCallback& callback) { | 1263 const FileResourceCallback& callback) { |
| 1242 AddNewFileWithResourceId("", content_type, content_data, parent_resource_id, | 1264 AddNewFileWithResourceId("", content_type, content_data, parent_resource_id, |
| (...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1613 google_apis::drive::PermissionRole role, | 1635 google_apis::drive::PermissionRole role, |
| 1614 const google_apis::EntryActionCallback& callback) { | 1636 const google_apis::EntryActionCallback& callback) { |
| 1615 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1637 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1616 DCHECK(!callback.is_null()); | 1638 DCHECK(!callback.is_null()); |
| 1617 | 1639 |
| 1618 NOTREACHED(); | 1640 NOTREACHED(); |
| 1619 return CancelCallback(); | 1641 return CancelCallback(); |
| 1620 } | 1642 } |
| 1621 | 1643 |
| 1622 } // namespace drive | 1644 } // namespace drive |
| OLD | NEW |