Chromium Code Reviews| 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/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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |