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

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

Issue 10546034: Adds parsing for the app_id field from an "open-with-" link (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 6 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_parser.h" 5 #include "chrome/browser/chromeos/gdata/gdata_parser.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/json/json_value_converter.h" 9 #include "base/json/json_value_converter.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 const char kHrefAttr[] = "href"; 117 const char kHrefAttr[] = "href";
118 const char kLabelAttr[] = "label"; 118 const char kLabelAttr[] = "label";
119 const char kNameAttr[] = "name"; 119 const char kNameAttr[] = "name";
120 const char kRelAttr[] = "rel"; 120 const char kRelAttr[] = "rel";
121 const char kSchemeAttr[] = "scheme"; 121 const char kSchemeAttr[] = "scheme";
122 const char kSrcAttr[] = "src"; 122 const char kSrcAttr[] = "src";
123 const char kTermAttr[] = "term"; 123 const char kTermAttr[] = "term";
124 const char kTypeAttr[] = "type"; 124 const char kTypeAttr[] = "type";
125 const char kValueAttr[] = "value"; 125 const char kValueAttr[] = "value";
126 126
127 // Link Prefixes
128 const char kOpenWithPrefix[] = "http://schemas.google.com/docs/2007#open-with-";
129
127 struct EntryKindMap { 130 struct EntryKindMap {
128 DocumentEntry::EntryKind kind; 131 DocumentEntry::EntryKind kind;
129 const char* entry; 132 const char* entry;
130 const char* extension; 133 const char* extension;
131 }; 134 };
132 135
133 const EntryKindMap kEntryKindMap[] = { 136 const EntryKindMap kEntryKindMap[] = {
134 { DocumentEntry::ITEM, "item", NULL}, 137 { DocumentEntry::ITEM, "item", NULL},
135 { DocumentEntry::DOCUMENT, "document", ".gdoc"}, 138 { DocumentEntry::DOCUMENT, "document", ".gdoc"},
136 { DocumentEntry::SPREADSHEET, "spreadsheet", ".gsheet"}, 139 { DocumentEntry::SPREADSHEET, "spreadsheet", ".gsheet"},
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 } while (depth == xml_reader->Depth() && (skip_read || xml_reader->Next())); 272 } while (depth == xml_reader->Depth() && (skip_read || xml_reader->Next()));
270 return author; 273 return author;
271 } 274 }
272 275
273 //////////////////////////////////////////////////////////////////////////////// 276 ////////////////////////////////////////////////////////////////////////////////
274 // Link implementation 277 // Link implementation
275 278
276 Link::Link() : type_(Link::UNKNOWN) { 279 Link::Link() : type_(Link::UNKNOWN) {
277 } 280 }
278 281
282 // static
283 bool Link::GetAppID(const base::StringPiece& rel, std::string* app_id) {
284 DCHECK(app_id);
285 // Fast return path if the link clearly isn't an OPEN_WITH link.
286 if (rel.size() < 46 || (rel[36] != 'o' && rel[36] != 'O')) {
zel 2012/06/06 23:32:07 make 46 constant as kMinAppRelSize and get rid of
Greg Spencer (Chromium) 2012/06/07 00:05:27 Done. I went with kOpenWithPrefixSize instead tho
287 app_id->clear();
288 return true;
289 }
290
291 const std::string kOpenWithPrefixStr(kOpenWithPrefix);
292 if (StartsWithASCII(rel.as_string(), kOpenWithPrefixStr, false)) {
293 *app_id = rel.as_string().substr(kOpenWithPrefixStr.size());
294 return true;
295 }
296
297 app_id->clear();
298 return true;
299 }
300
279 // static. 301 // static.
280 bool Link::GetLinkType(const base::StringPiece& rel, Link::LinkType* result) { 302 bool Link::GetLinkType(const base::StringPiece& rel, Link::LinkType* type) {
303 DCHECK(type);
281 for (size_t i = 0; i < arraysize(kLinkTypeMap); i++) { 304 for (size_t i = 0; i < arraysize(kLinkTypeMap); i++) {
282 if (rel == kLinkTypeMap[i].rel) { 305 if (rel == kLinkTypeMap[i].rel) {
283 *result = kLinkTypeMap[i].type; 306 *type = kLinkTypeMap[i].type;
284 return true; 307 return true;
285 } 308 }
286 } 309 }
310
311 // OPEN_WITH links have extra information at the end of the rel that is unique
312 // for each one, so we can't just check the usual map. This check is slightly
313 // redundant to provide a quick skip if it's obviously not an OPEN_WITH url.
314 if (rel.size() > 45 && (rel[36] == 'o' || rel[36] == 'O') &&
315 StartsWithASCII(rel.as_string(), kOpenWithPrefix, false)) {
316 *type = OPEN_WITH;
317 return true;
318 }
319
287 // Let unknown link types through, just report it; if the link type is needed 320 // Let unknown link types through, just report it; if the link type is needed
288 // in the future, add it into LinkType and kLinkTypeMap. 321 // in the future, add it into LinkType and kLinkTypeMap.
289 DVLOG(1) << "Ignoring unknown link type for rel " << rel; 322 DVLOG(1) << "Ignoring unknown link type for rel " << rel;
290 *result = UNKNOWN; 323 *type = UNKNOWN;
291 return true; 324 return true;
292 } 325 }
293 326
294 // static 327 // static
295 void Link::RegisterJSONConverter(base::JSONValueConverter<Link>* converter) { 328 void Link::RegisterJSONConverter(base::JSONValueConverter<Link>* converter) {
296 converter->RegisterCustomField<Link::LinkType>( 329 converter->RegisterCustomField<Link::LinkType>(kRelField,
297 kRelField, &Link::type_, &Link::GetLinkType); 330 &Link::type_,
331 &Link::GetLinkType);
332 // We have to register kRelField twice because we extract two different pieces
333 // of data from the same rel field.
334 converter->RegisterCustomField<std::string>(kRelField,
335 &Link::app_id_,
336 &Link::GetAppID);
298 converter->RegisterCustomField(kHrefField, &Link::href_, &GetGURLFromString); 337 converter->RegisterCustomField(kHrefField, &Link::href_, &GetGURLFromString);
299 converter->RegisterStringField(kTitleField, &Link::title_); 338 converter->RegisterStringField(kTitleField, &Link::title_);
300 converter->RegisterStringField(kTypeField, &Link::mime_type_); 339 converter->RegisterStringField(kTypeField, &Link::mime_type_);
301 } 340 }
302 341
303 // static. 342 // static.
304 Link* Link::CreateFromXml(XmlReader* xml_reader) { 343 Link* Link::CreateFromXml(XmlReader* xml_reader) {
305 if (xml_reader->NodeName() != kLinkNode) 344 if (xml_reader->NodeName() != kLinkNode)
306 return NULL; 345 return NULL;
307 346
308 Link* link = new Link(); 347 Link* link = new Link();
309 xml_reader->NodeAttribute(kTypeAttr, &link->mime_type_); 348 xml_reader->NodeAttribute(kTypeAttr, &link->mime_type_);
310 349
311 std::string href; 350 std::string href;
312 if (xml_reader->NodeAttribute(kHrefAttr, &href)) 351 if (xml_reader->NodeAttribute(kHrefAttr, &href))
313 link->href_ = GURL(href); 352 link->href_ = GURL(href);
314 353
315 std::string rel; 354 std::string rel;
316 if (xml_reader->NodeAttribute(kRelAttr, &rel)) 355 if (xml_reader->NodeAttribute(kRelAttr, &rel)) {
317 GetLinkType(rel, &link->type_); 356 GetLinkType(rel, &link->type_);
357 if (link->type_ == OPEN_WITH)
358 GetAppID(rel, &link->app_id_);
359 }
318 360
319 return link; 361 return link;
320 } 362 }
321 363
322 //////////////////////////////////////////////////////////////////////////////// 364 ////////////////////////////////////////////////////////////////////////////////
323 // FeedLink implementation 365 // FeedLink implementation
324 366
325 FeedLink::FeedLink() : type_(FeedLink::UNKNOWN) { 367 FeedLink::FeedLink() : type_(FeedLink::UNKNOWN) {
326 } 368 }
327 369
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 bool AccountMetadataFeed::Parse(const base::Value& value) { 948 bool AccountMetadataFeed::Parse(const base::Value& value) {
907 base::JSONValueConverter<AccountMetadataFeed> converter; 949 base::JSONValueConverter<AccountMetadataFeed> converter;
908 if (!converter.Convert(value, this)) { 950 if (!converter.Convert(value, this)) {
909 LOG(ERROR) << "Unable to parse: Invalid account metadata feed!"; 951 LOG(ERROR) << "Unable to parse: Invalid account metadata feed!";
910 return false; 952 return false;
911 } 953 }
912 return true; 954 return true;
913 } 955 }
914 956
915 } // namespace gdata 957 } // namespace gdata
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698