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

Side by Side Diff: chrome/browser/drive/drive_api_util.cc

Issue 384543004: Get rid of DriveEntryKind. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase and drop an unit test for glink file. Created 6 years, 5 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/drive/drive_api_util.h" 5 #include "chrome/browser/drive/drive_api_util.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/files/file.h" 9 #include "base/files/file.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/md5.h" 11 #include "base/md5.h"
12 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
13 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
15 #include "base/strings/utf_string_conversions.h" 15 #include "base/strings/utf_string_conversions.h"
16 #include "base/values.h" 16 #include "base/values.h"
17 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
18 #include "google_apis/drive/drive_api_parser.h" 18 #include "google_apis/drive/drive_api_parser.h"
19 #include "google_apis/drive/gdata_wapi_parser.h" 19 #include "google_apis/drive/gdata_wapi_parser.h"
20 #include "net/base/escape.h" 20 #include "net/base/escape.h"
21 #include "third_party/re2/re2/re2.h" 21 #include "third_party/re2/re2/re2.h"
22 #include "url/gurl.h" 22 #include "url/gurl.h"
23 23
24 namespace drive { 24 namespace drive {
25 namespace util { 25 namespace util {
26 namespace { 26 namespace {
27 27
28 std::string GetMimeTypeFromEntryKind(google_apis::DriveEntryKind kind) {
29 switch (kind) {
30 case google_apis::ENTRY_KIND_DOCUMENT:
31 return kGoogleDocumentMimeType;
32 case google_apis::ENTRY_KIND_SPREADSHEET:
33 return kGoogleSpreadsheetMimeType;
34 case google_apis::ENTRY_KIND_PRESENTATION:
35 return kGooglePresentationMimeType;
36 case google_apis::ENTRY_KIND_DRAWING:
37 return kGoogleDrawingMimeType;
38 case google_apis::ENTRY_KIND_TABLE:
39 return kGoogleTableMimeType;
40 case google_apis::ENTRY_KIND_FORM:
41 return kGoogleFormMimeType;
42 default:
43 return std::string();
44 }
45 }
46
47 // Returns the argument string. 28 // Returns the argument string.
48 std::string Identity(const std::string& resource_id) { return resource_id; } 29 std::string Identity(const std::string& resource_id) { return resource_id; }
49 30
31 struct HostedDocumentKind {
32 const char* mime_type;
33 const char* extension;
34 };
35
36 const HostedDocumentKind kHostedDocumentKinds[] = {
37 {kGoogleDocumentMimeType, ".gdoc"},
38 {kGoogleSpreadsheetMimeType, ".gsheet"},
39 {kGooglePresentationMimeType, ".gslides"},
40 {kGoogleDrawingMimeType, ".gdraw"},
41 {kGoogleTableMimeType, ".gtable"},
42 {kGoogleFormMimeType, ".gform"}
43 };
44
50 } // namespace 45 } // namespace
51 46
52 47
53 std::string EscapeQueryStringValue(const std::string& str) { 48 std::string EscapeQueryStringValue(const std::string& str) {
54 std::string result; 49 std::string result;
55 result.reserve(str.size()); 50 result.reserve(str.size());
56 for (size_t i = 0; i < str.size(); ++i) { 51 for (size_t i = 0; i < str.size(); ++i) {
57 if (str[i] == '\\' || str[i] == '\'') { 52 if (str[i] == '\\' || str[i] == '\'') {
58 result.push_back('\\'); 53 result.push_back('\\');
59 } 54 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 if (!entry) { 161 if (!entry) {
167 callback.Run(google_apis::GDATA_PARSE_ERROR, GURL()); 162 callback.Run(google_apis::GDATA_PARSE_ERROR, GURL());
168 return; 163 return;
169 } 164 }
170 165
171 const google_apis::Link* share_link = 166 const google_apis::Link* share_link =
172 entry->GetLinkByType(google_apis::Link::LINK_SHARE); 167 entry->GetLinkByType(google_apis::Link::LINK_SHARE);
173 callback.Run(error, share_link ? share_link->href() : GURL()); 168 callback.Run(error, share_link ? share_link->href() : GURL());
174 } 169 }
175 170
176 scoped_ptr<google_apis::FileResource> ConvertResourceEntryToFileResource(
177 const google_apis::ResourceEntry& entry) {
178 scoped_ptr<google_apis::FileResource> file(new google_apis::FileResource);
179
180 file->set_file_id(entry.resource_id());
181 file->set_title(entry.title());
182 file->set_created_date(entry.published_time());
183
184 if (std::find(entry.labels().begin(), entry.labels().end(),
185 "shared-with-me") != entry.labels().end()) {
186 // Set current time to mark the file is shared_with_me, since ResourceEntry
187 // doesn't have |shared_with_me_date| equivalent.
188 file->set_shared_with_me_date(base::Time::Now());
189 }
190
191 file->set_shared(std::find(entry.labels().begin(), entry.labels().end(),
192 "shared") != entry.labels().end());
193
194 if (entry.is_folder()) {
195 file->set_mime_type(kDriveFolderMimeType);
196 } else {
197 std::string mime_type = GetMimeTypeFromEntryKind(entry.kind());
198 if (mime_type.empty())
199 mime_type = entry.content_mime_type();
200 file->set_mime_type(mime_type);
201 }
202
203 file->set_md5_checksum(entry.file_md5());
204 file->set_file_size(entry.file_size());
205
206 file->mutable_labels()->set_trashed(entry.deleted());
207 file->set_etag(entry.etag());
208
209 google_apis::ImageMediaMetadata* image_media_metadata =
210 file->mutable_image_media_metadata();
211 image_media_metadata->set_width(entry.image_width());
212 image_media_metadata->set_height(entry.image_height());
213 image_media_metadata->set_rotation(entry.image_rotation());
214
215 std::vector<google_apis::ParentReference>* parents = file->mutable_parents();
216 for (size_t i = 0; i < entry.links().size(); ++i) {
217 using google_apis::Link;
218 const Link& link = *entry.links()[i];
219 switch (link.type()) {
220 case Link::LINK_PARENT: {
221 google_apis::ParentReference parent;
222 parent.set_parent_link(link.href());
223
224 std::string file_id =
225 drive::util::ExtractResourceIdFromUrl(link.href());
226 parent.set_file_id(file_id);
227 parents->push_back(parent);
228 break;
229 }
230 case Link::LINK_ALTERNATE:
231 file->set_alternate_link(link.href());
232 break;
233 default:
234 break;
235 }
236 }
237
238 file->set_modified_date(entry.updated_time());
239 file->set_last_viewed_by_me_date(entry.last_viewed_time());
240
241 return file.Pass();
242 }
243
244 google_apis::DriveEntryKind GetKind(
245 const google_apis::FileResource& file_resource) {
246 if (file_resource.IsDirectory())
247 return google_apis::ENTRY_KIND_FOLDER;
248
249 const std::string& mime_type = file_resource.mime_type();
250 if (mime_type == kGoogleDocumentMimeType)
251 return google_apis::ENTRY_KIND_DOCUMENT;
252 if (mime_type == kGoogleSpreadsheetMimeType)
253 return google_apis::ENTRY_KIND_SPREADSHEET;
254 if (mime_type == kGooglePresentationMimeType)
255 return google_apis::ENTRY_KIND_PRESENTATION;
256 if (mime_type == kGoogleDrawingMimeType)
257 return google_apis::ENTRY_KIND_DRAWING;
258 if (mime_type == kGoogleTableMimeType)
259 return google_apis::ENTRY_KIND_TABLE;
260 if (mime_type == kGoogleFormMimeType)
261 return google_apis::ENTRY_KIND_FORM;
262 if (mime_type == "application/pdf")
263 return google_apis::ENTRY_KIND_PDF;
264 return google_apis::ENTRY_KIND_FILE;
265 }
266
267 scoped_ptr<google_apis::ResourceEntry> 171 scoped_ptr<google_apis::ResourceEntry>
268 ConvertFileResourceToResourceEntry( 172 ConvertFileResourceToResourceEntry(
269 const google_apis::FileResource& file_resource) { 173 const google_apis::FileResource& file_resource) {
270 scoped_ptr<google_apis::ResourceEntry> entry(new google_apis::ResourceEntry); 174 scoped_ptr<google_apis::ResourceEntry> entry(new google_apis::ResourceEntry);
271 175
272 // ResourceEntry 176 // ResourceEntry
273 entry->set_resource_id(file_resource.file_id()); 177 entry->set_resource_id(file_resource.file_id());
274 entry->set_id(file_resource.file_id()); 178 entry->set_id(file_resource.file_id());
275 entry->set_kind(GetKind(file_resource)); 179 if (file_resource.IsDirectory())
180 entry->set_kind(google_apis::ResourceEntry::ENTRY_KIND_FOLDER);
181 else if (IsHostedDocument(file_resource.mime_type()))
182 entry->set_kind(google_apis::ResourceEntry::ENTRY_KIND_UNKNOWN);
183 else
184 entry->set_kind(google_apis::ResourceEntry::ENTRY_KIND_FILE);
276 entry->set_title(file_resource.title()); 185 entry->set_title(file_resource.title());
277 entry->set_published_time(file_resource.created_date()); 186 entry->set_published_time(file_resource.created_date());
278 187
279 std::vector<std::string> labels; 188 std::vector<std::string> labels;
280 if (!file_resource.shared_with_me_date().is_null()) 189 if (!file_resource.shared_with_me_date().is_null())
281 labels.push_back("shared-with-me"); 190 labels.push_back("shared-with-me");
282 if (file_resource.shared()) 191 if (file_resource.shared())
283 labels.push_back("shared"); 192 labels.push_back("shared");
284 entry->set_labels(labels); 193 entry->set_labels(labels);
285 194
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 base::MD5Update(&context, base::StringPiece(buffer.get(), result)); 337 base::MD5Update(&context, base::StringPiece(buffer.get(), result));
429 } 338 }
430 339
431 base::MD5Digest digest; 340 base::MD5Digest digest;
432 base::MD5Final(&digest, &context); 341 base::MD5Final(&digest, &context);
433 return MD5DigestToBase16(digest); 342 return MD5DigestToBase16(digest);
434 } 343 }
435 344
436 const char kWapiRootDirectoryResourceId[] = "folder:root"; 345 const char kWapiRootDirectoryResourceId[] = "folder:root";
437 346
347 std::string GetHostedDocumentExtension(const std::string& mime_type) {
348 for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
349 if (mime_type == kHostedDocumentKinds[i].mime_type)
350 return kHostedDocumentKinds[i].extension;
351 }
352 return std::string();
353 }
354
355 std::string GetHostedDocumentMimeType(const std::string& extension) {
356 for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
357 if (extension == kHostedDocumentKinds[i].extension)
358 return kHostedDocumentKinds[i].mime_type;
359 }
360 return std::string();
361 }
362
363 bool IsHostedDocument(const std::string& mime_type) {
364 for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
365 if (mime_type == kHostedDocumentKinds[i].mime_type)
366 return true;
367 }
368 return false;
369 }
370
371 bool IsHostedDocumentByExtension(const std::string& extension) {
372 for (size_t i = 0; i < arraysize(kHostedDocumentKinds); ++i) {
373 if (extension == kHostedDocumentKinds[i].extension)
374 return true;
375 }
376 return false;
377 }
378
379 bool IsHostedDocumentByFileExtension(const base::FilePath& file_path) {
hashimoto 2014/07/14 08:23:26 Could you remove one of IsHostedDocumentByExtensio
fukino 2014/07/14 09:10:53 Done. IsHostedDocumentByExtension survived.
380 #if defined(OS_WIN)
hashimoto 2014/07/14 08:23:26 You can get rid of this #if with: extension = bas
fukino 2014/07/14 09:10:53 Done. I didn't know, thanks!
381 std::string extension = base::WideToUTF8(file_path.Extension());
382 #else
383 std::string extension = file_path.Extension();
384 #endif
385 return IsHostedDocumentByExtension(extension);
386 }
387
438 } // namespace util 388 } // namespace util
439 } // namespace drive 389 } // namespace drive
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698