| 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/drive_api_service.h" | 5 #include "chrome/browser/drive/drive_api_service.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 using google_apis::ResourceEntry; | 51 using google_apis::ResourceEntry; |
| 52 using google_apis::ResourceList; | 52 using google_apis::ResourceList; |
| 53 using google_apis::UploadRangeCallback; | 53 using google_apis::UploadRangeCallback; |
| 54 using google_apis::UploadRangeResponse; | 54 using google_apis::UploadRangeResponse; |
| 55 using google_apis::drive::AboutGetRequest; | 55 using google_apis::drive::AboutGetRequest; |
| 56 using google_apis::drive::AppsListRequest; | 56 using google_apis::drive::AppsListRequest; |
| 57 using google_apis::drive::ChangesListRequest; | 57 using google_apis::drive::ChangesListRequest; |
| 58 using google_apis::drive::ChangesListNextPageRequest; | 58 using google_apis::drive::ChangesListNextPageRequest; |
| 59 using google_apis::drive::ChildrenDeleteRequest; | 59 using google_apis::drive::ChildrenDeleteRequest; |
| 60 using google_apis::drive::ChildrenInsertRequest; | 60 using google_apis::drive::ChildrenInsertRequest; |
| 61 using google_apis::drive::ContinueGetFileListRequest; | |
| 62 using google_apis::drive::DownloadFileRequest; | 61 using google_apis::drive::DownloadFileRequest; |
| 63 using google_apis::drive::FilesCopyRequest; | 62 using google_apis::drive::FilesCopyRequest; |
| 64 using google_apis::drive::FilesGetRequest; | 63 using google_apis::drive::FilesGetRequest; |
| 65 using google_apis::drive::FilesInsertRequest; | 64 using google_apis::drive::FilesInsertRequest; |
| 66 using google_apis::drive::FilesPatchRequest; | 65 using google_apis::drive::FilesPatchRequest; |
| 67 using google_apis::drive::FilesListRequest; | 66 using google_apis::drive::FilesListRequest; |
| 68 using google_apis::drive::FilesListNextPageRequest; | 67 using google_apis::drive::FilesListNextPageRequest; |
| 69 using google_apis::drive::FilesTrashRequest; | 68 using google_apis::drive::FilesTrashRequest; |
| 70 using google_apis::drive::GetUploadStatusRequest; | 69 using google_apis::drive::GetUploadStatusRequest; |
| 71 using google_apis::drive::InitiateUploadExistingFileRequest; | 70 using google_apis::drive::InitiateUploadExistingFileRequest; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 84 // Mime type to create a directory. | 83 // Mime type to create a directory. |
| 85 const char kFolderMimeType[] = "application/vnd.google-apps.folder"; | 84 const char kFolderMimeType[] = "application/vnd.google-apps.folder"; |
| 86 | 85 |
| 87 // Expected max number of files resources in a http request. | 86 // Expected max number of files resources in a http request. |
| 88 // Be careful not to use something too small because it might overload the | 87 // Be careful not to use something too small because it might overload the |
| 89 // server. Be careful not to use something too large because it takes longer | 88 // server. Be careful not to use something too large because it takes longer |
| 90 // time to fetch the result without UI response. | 89 // time to fetch the result without UI response. |
| 91 const int kMaxNumFilesResourcePerRequest = 500; | 90 const int kMaxNumFilesResourcePerRequest = 500; |
| 92 const int kMaxNumFilesResourcePerRequestForSearch = 50; | 91 const int kMaxNumFilesResourcePerRequestForSearch = 50; |
| 93 | 92 |
| 94 scoped_ptr<ResourceList> ParseChangeListJsonToResourceList( | |
| 95 scoped_ptr<base::Value> value) { | |
| 96 scoped_ptr<ChangeList> change_list(ChangeList::CreateFrom(*value)); | |
| 97 if (!change_list) { | |
| 98 return scoped_ptr<ResourceList>(); | |
| 99 } | |
| 100 | |
| 101 return ResourceList::CreateFromChangeList(*change_list); | |
| 102 } | |
| 103 | |
| 104 scoped_ptr<ResourceList> ParseFileListJsonToResourceList( | |
| 105 scoped_ptr<base::Value> value) { | |
| 106 scoped_ptr<FileList> file_list(FileList::CreateFrom(*value)); | |
| 107 if (!file_list) { | |
| 108 return scoped_ptr<ResourceList>(); | |
| 109 } | |
| 110 | |
| 111 return ResourceList::CreateFromFileList(*file_list); | |
| 112 } | |
| 113 | |
| 114 // Parses JSON value representing either ChangeList or FileList into | |
| 115 // ResourceList. | |
| 116 scoped_ptr<ResourceList> ParseResourceListOnBlockingPool( | |
| 117 scoped_ptr<base::Value> value) { | |
| 118 DCHECK(value); | |
| 119 | |
| 120 // Dispatch the parsing based on kind field. | |
| 121 if (ChangeList::HasChangeListKind(*value)) { | |
| 122 return ParseChangeListJsonToResourceList(value.Pass()); | |
| 123 } | |
| 124 if (FileList::HasFileListKind(*value)) { | |
| 125 return ParseFileListJsonToResourceList(value.Pass()); | |
| 126 } | |
| 127 | |
| 128 // The value type is unknown, so give up to parse and return an error. | |
| 129 return scoped_ptr<ResourceList>(); | |
| 130 } | |
| 131 | |
| 132 // Callback invoked when the parsing of resource list is completed, | 93 // Callback invoked when the parsing of resource list is completed, |
| 133 // regardless whether it is succeeded or not. | 94 // regardless whether it is succeeded or not. |
| 134 void DidParseResourceListOnBlockingPool( | 95 void DidConvertToResourceListOnBlockingPool( |
| 135 const GetResourceListCallback& callback, | 96 const GetResourceListCallback& callback, |
| 136 scoped_ptr<ResourceList> resource_list) { | 97 scoped_ptr<ResourceList> resource_list) { |
| 137 GDataErrorCode error = resource_list ? HTTP_SUCCESS : GDATA_PARSE_ERROR; | 98 GDataErrorCode error = resource_list ? HTTP_SUCCESS : GDATA_PARSE_ERROR; |
| 138 callback.Run(error, resource_list.Pass()); | 99 callback.Run(error, resource_list.Pass()); |
| 139 } | 100 } |
| 140 | 101 |
| 141 // Sends a task to parse the JSON value into ResourceList on blocking pool, | |
| 142 // with a callback which is called when the task is done. | |
| 143 void ParseResourceListOnBlockingPoolAndRun( | |
| 144 scoped_refptr<base::TaskRunner> blocking_task_runner, | |
| 145 const GetResourceListCallback& callback, | |
| 146 GDataErrorCode error, | |
| 147 scoped_ptr<base::Value> value) { | |
| 148 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 149 DCHECK(!callback.is_null()); | |
| 150 | |
| 151 if (error != HTTP_SUCCESS) { | |
| 152 // An error occurs, so run callback immediately. | |
| 153 callback.Run(error, scoped_ptr<ResourceList>()); | |
| 154 return; | |
| 155 } | |
| 156 | |
| 157 base::PostTaskAndReplyWithResult( | |
| 158 blocking_task_runner.get(), | |
| 159 FROM_HERE, | |
| 160 base::Bind(&ParseResourceListOnBlockingPool, base::Passed(&value)), | |
| 161 base::Bind(&DidParseResourceListOnBlockingPool, callback)); | |
| 162 } | |
| 163 | |
| 164 // Converts the FileResource value to ResourceEntry and runs |callback| on the | 102 // Converts the FileResource value to ResourceEntry and runs |callback| on the |
| 165 // UI thread. | 103 // UI thread. |
| 166 void ConvertFileEntryToResourceEntryAndRun( | 104 void ConvertFileEntryToResourceEntryAndRun( |
| 167 const GetResourceEntryCallback& callback, | 105 const GetResourceEntryCallback& callback, |
| 168 GDataErrorCode error, | 106 GDataErrorCode error, |
| 169 scoped_ptr<FileResource> value) { | 107 scoped_ptr<FileResource> value) { |
| 170 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 108 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 171 DCHECK(!callback.is_null()); | 109 DCHECK(!callback.is_null()); |
| 172 | 110 |
| 173 if (!value) { | 111 if (!value) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 if (!value) { | 143 if (!value) { |
| 206 callback.Run(error, scoped_ptr<ResourceList>()); | 144 callback.Run(error, scoped_ptr<ResourceList>()); |
| 207 return; | 145 return; |
| 208 } | 146 } |
| 209 | 147 |
| 210 // Convert the value on blocking pool. | 148 // Convert the value on blocking pool. |
| 211 base::PostTaskAndReplyWithResult( | 149 base::PostTaskAndReplyWithResult( |
| 212 blocking_task_runner.get(), | 150 blocking_task_runner.get(), |
| 213 FROM_HERE, | 151 FROM_HERE, |
| 214 base::Bind(&ConvertFileListToResourceList, base::Passed(&value)), | 152 base::Bind(&ConvertFileListToResourceList, base::Passed(&value)), |
| 215 base::Bind(&DidParseResourceListOnBlockingPool, callback)); | 153 base::Bind(&DidConvertToResourceListOnBlockingPool, callback)); |
| 216 } | 154 } |
| 217 | 155 |
| 218 // Thin adapter of CreateFromChangeList. | 156 // Thin adapter of CreateFromChangeList. |
| 219 scoped_ptr<ResourceList> ConvertChangeListToResourceList( | 157 scoped_ptr<ResourceList> ConvertChangeListToResourceList( |
| 220 scoped_ptr<ChangeList> change_list) { | 158 scoped_ptr<ChangeList> change_list) { |
| 221 return ResourceList::CreateFromChangeList(*change_list); | 159 return ResourceList::CreateFromChangeList(*change_list); |
| 222 } | 160 } |
| 223 | 161 |
| 224 // Converts the FileList value to ResourceList on blocking pool and runs | 162 // Converts the FileList value to ResourceList on blocking pool and runs |
| 225 // |callback| on the UI thread. | 163 // |callback| on the UI thread. |
| 226 void ConvertChangeListToResourceListOnBlockingPoolAndRun( | 164 void ConvertChangeListToResourceListOnBlockingPoolAndRun( |
| 227 scoped_refptr<base::TaskRunner> blocking_task_runner, | 165 scoped_refptr<base::TaskRunner> blocking_task_runner, |
| 228 const GetResourceListCallback& callback, | 166 const GetResourceListCallback& callback, |
| 229 GDataErrorCode error, | 167 GDataErrorCode error, |
| 230 scoped_ptr<ChangeList> value) { | 168 scoped_ptr<ChangeList> value) { |
| 231 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 169 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 232 DCHECK(!callback.is_null()); | 170 DCHECK(!callback.is_null()); |
| 233 | 171 |
| 234 if (!value) { | 172 if (!value) { |
| 235 callback.Run(error, scoped_ptr<ResourceList>()); | 173 callback.Run(error, scoped_ptr<ResourceList>()); |
| 236 return; | 174 return; |
| 237 } | 175 } |
| 238 | 176 |
| 239 // Convert the value on blocking pool. | 177 // Convert the value on blocking pool. |
| 240 base::PostTaskAndReplyWithResult( | 178 base::PostTaskAndReplyWithResult( |
| 241 blocking_task_runner.get(), | 179 blocking_task_runner.get(), |
| 242 FROM_HERE, | 180 FROM_HERE, |
| 243 base::Bind(&ConvertChangeListToResourceList, base::Passed(&value)), | 181 base::Bind(&ConvertChangeListToResourceList, base::Passed(&value)), |
| 244 base::Bind(&DidParseResourceListOnBlockingPool, callback)); | 182 base::Bind(&DidConvertToResourceListOnBlockingPool, callback)); |
| 245 } | 183 } |
| 246 | 184 |
| 247 // Parses the FileResource value to ResourceEntry for upload range request, | 185 // Converts the FileResource value to ResourceEntry for upload range request, |
| 248 // and runs |callback| on the UI thread. | 186 // and runs |callback| on the UI thread. |
| 249 void ParseResourceEntryForUploadRangeAndRun( | 187 void ConvertFileResourceToResourceEntryForUploadRangeAndRun( |
| 250 const UploadRangeCallback& callback, | 188 const UploadRangeCallback& callback, |
| 251 const UploadRangeResponse& response, | 189 const UploadRangeResponse& response, |
| 252 scoped_ptr<FileResource> value) { | 190 scoped_ptr<FileResource> value) { |
| 253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 191 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 254 DCHECK(!callback.is_null()); | 192 DCHECK(!callback.is_null()); |
| 255 | 193 |
| 256 if (!value) { | 194 if (!value) { |
| 257 callback.Run(response, scoped_ptr<ResourceEntry>()); | 195 callback.Run(response, scoped_ptr<ResourceEntry>()); |
| 258 return; | 196 return; |
| 259 } | 197 } |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 781 | 719 |
| 782 return sender_->StartRequestWithRetry( | 720 return sender_->StartRequestWithRetry( |
| 783 new ResumeUploadRequest( | 721 new ResumeUploadRequest( |
| 784 sender_.get(), | 722 sender_.get(), |
| 785 upload_url, | 723 upload_url, |
| 786 start_position, | 724 start_position, |
| 787 end_position, | 725 end_position, |
| 788 content_length, | 726 content_length, |
| 789 content_type, | 727 content_type, |
| 790 local_file_path, | 728 local_file_path, |
| 791 base::Bind(&ParseResourceEntryForUploadRangeAndRun, callback), | 729 base::Bind(&ConvertFileResourceToResourceEntryForUploadRangeAndRun, |
| 730 callback), |
| 792 progress_callback)); | 731 progress_callback)); |
| 793 } | 732 } |
| 794 | 733 |
| 795 CancelCallback DriveAPIService::GetUploadStatus( | 734 CancelCallback DriveAPIService::GetUploadStatus( |
| 796 const GURL& upload_url, | 735 const GURL& upload_url, |
| 797 int64 content_length, | 736 int64 content_length, |
| 798 const UploadRangeCallback& callback) { | 737 const UploadRangeCallback& callback) { |
| 799 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 738 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 800 DCHECK(!callback.is_null()); | 739 DCHECK(!callback.is_null()); |
| 801 | 740 |
| 802 return sender_->StartRequestWithRetry(new GetUploadStatusRequest( | 741 return sender_->StartRequestWithRetry(new GetUploadStatusRequest( |
| 803 sender_.get(), | 742 sender_.get(), |
| 804 upload_url, | 743 upload_url, |
| 805 content_length, | 744 content_length, |
| 806 base::Bind(&ParseResourceEntryForUploadRangeAndRun, callback))); | 745 base::Bind(&ConvertFileResourceToResourceEntryForUploadRangeAndRun, |
| 746 callback))); |
| 807 } | 747 } |
| 808 | 748 |
| 809 CancelCallback DriveAPIService::AuthorizeApp( | 749 CancelCallback DriveAPIService::AuthorizeApp( |
| 810 const std::string& resource_id, | 750 const std::string& resource_id, |
| 811 const std::string& app_id, | 751 const std::string& app_id, |
| 812 const AuthorizeAppCallback& callback) { | 752 const AuthorizeAppCallback& callback) { |
| 813 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 753 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 814 DCHECK(!callback.is_null()); | 754 DCHECK(!callback.is_null()); |
| 815 | 755 |
| 816 FilesGetRequest* request = new FilesGetRequest( | 756 FilesGetRequest* request = new FilesGetRequest( |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 893 if (CanSendRequest()) { | 833 if (CanSendRequest()) { |
| 894 FOR_EACH_OBSERVER( | 834 FOR_EACH_OBSERVER( |
| 895 DriveServiceObserver, observers_, OnReadyToSendRequests()); | 835 DriveServiceObserver, observers_, OnReadyToSendRequests()); |
| 896 } else if (!HasRefreshToken()) { | 836 } else if (!HasRefreshToken()) { |
| 897 FOR_EACH_OBSERVER( | 837 FOR_EACH_OBSERVER( |
| 898 DriveServiceObserver, observers_, OnRefreshTokenInvalid()); | 838 DriveServiceObserver, observers_, OnRefreshTokenInvalid()); |
| 899 } | 839 } |
| 900 } | 840 } |
| 901 | 841 |
| 902 } // namespace drive | 842 } // namespace drive |
| OLD | NEW |