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 const size_t kOpenWithPrefixSize = arraysize(kOpenWithPrefix) - 1; |
| 130 |
127 struct EntryKindMap { | 131 struct EntryKindMap { |
128 DocumentEntry::EntryKind kind; | 132 DocumentEntry::EntryKind kind; |
129 const char* entry; | 133 const char* entry; |
130 const char* extension; | 134 const char* extension; |
131 }; | 135 }; |
132 | 136 |
133 const EntryKindMap kEntryKindMap[] = { | 137 const EntryKindMap kEntryKindMap[] = { |
134 { DocumentEntry::ITEM, "item", NULL}, | 138 { DocumentEntry::ITEM, "item", NULL}, |
135 { DocumentEntry::DOCUMENT, "document", ".gdoc"}, | 139 { DocumentEntry::DOCUMENT, "document", ".gdoc"}, |
136 { DocumentEntry::SPREADSHEET, "spreadsheet", ".gsheet"}, | 140 { 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())); | 273 } while (depth == xml_reader->Depth() && (skip_read || xml_reader->Next())); |
270 return author; | 274 return author; |
271 } | 275 } |
272 | 276 |
273 //////////////////////////////////////////////////////////////////////////////// | 277 //////////////////////////////////////////////////////////////////////////////// |
274 // Link implementation | 278 // Link implementation |
275 | 279 |
276 Link::Link() : type_(Link::UNKNOWN) { | 280 Link::Link() : type_(Link::UNKNOWN) { |
277 } | 281 } |
278 | 282 |
| 283 // static |
| 284 bool Link::GetAppID(const base::StringPiece& rel, std::string* app_id) { |
| 285 DCHECK(app_id); |
| 286 // Fast return path if the link clearly isn't an OPEN_WITH link. |
| 287 if (rel.size() < kOpenWithPrefixSize) { |
| 288 app_id->clear(); |
| 289 return true; |
| 290 } |
| 291 |
| 292 const std::string kOpenWithPrefixStr(kOpenWithPrefix); |
| 293 if (StartsWithASCII(rel.as_string(), kOpenWithPrefixStr, false)) { |
| 294 *app_id = rel.as_string().substr(kOpenWithPrefixStr.size()); |
| 295 return true; |
| 296 } |
| 297 |
| 298 app_id->clear(); |
| 299 return true; |
| 300 } |
| 301 |
279 // static. | 302 // static. |
280 bool Link::GetLinkType(const base::StringPiece& rel, Link::LinkType* result) { | 303 bool Link::GetLinkType(const base::StringPiece& rel, Link::LinkType* type) { |
| 304 DCHECK(type); |
281 for (size_t i = 0; i < arraysize(kLinkTypeMap); i++) { | 305 for (size_t i = 0; i < arraysize(kLinkTypeMap); i++) { |
282 if (rel == kLinkTypeMap[i].rel) { | 306 if (rel == kLinkTypeMap[i].rel) { |
283 *result = kLinkTypeMap[i].type; | 307 *type = kLinkTypeMap[i].type; |
284 return true; | 308 return true; |
285 } | 309 } |
286 } | 310 } |
| 311 |
| 312 // OPEN_WITH links have extra information at the end of the rel that is unique |
| 313 // for each one, so we can't just check the usual map. This check is slightly |
| 314 // redundant to provide a quick skip if it's obviously not an OPEN_WITH url. |
| 315 if (rel.size() >= kOpenWithPrefixSize && |
| 316 StartsWithASCII(rel.as_string(), kOpenWithPrefix, false)) { |
| 317 *type = OPEN_WITH; |
| 318 return true; |
| 319 } |
| 320 |
287 // Let unknown link types through, just report it; if the link type is needed | 321 // Let unknown link types through, just report it; if the link type is needed |
288 // in the future, add it into LinkType and kLinkTypeMap. | 322 // in the future, add it into LinkType and kLinkTypeMap. |
289 DVLOG(1) << "Ignoring unknown link type for rel " << rel; | 323 DVLOG(1) << "Ignoring unknown link type for rel " << rel; |
290 *result = UNKNOWN; | 324 *type = UNKNOWN; |
291 return true; | 325 return true; |
292 } | 326 } |
293 | 327 |
294 // static | 328 // static |
295 void Link::RegisterJSONConverter(base::JSONValueConverter<Link>* converter) { | 329 void Link::RegisterJSONConverter(base::JSONValueConverter<Link>* converter) { |
296 converter->RegisterCustomField<Link::LinkType>( | 330 converter->RegisterCustomField<Link::LinkType>(kRelField, |
297 kRelField, &Link::type_, &Link::GetLinkType); | 331 &Link::type_, |
| 332 &Link::GetLinkType); |
| 333 // We have to register kRelField twice because we extract two different pieces |
| 334 // of data from the same rel field. |
| 335 converter->RegisterCustomField<std::string>(kRelField, |
| 336 &Link::app_id_, |
| 337 &Link::GetAppID); |
298 converter->RegisterCustomField(kHrefField, &Link::href_, &GetGURLFromString); | 338 converter->RegisterCustomField(kHrefField, &Link::href_, &GetGURLFromString); |
299 converter->RegisterStringField(kTitleField, &Link::title_); | 339 converter->RegisterStringField(kTitleField, &Link::title_); |
300 converter->RegisterStringField(kTypeField, &Link::mime_type_); | 340 converter->RegisterStringField(kTypeField, &Link::mime_type_); |
301 } | 341 } |
302 | 342 |
303 // static. | 343 // static. |
304 Link* Link::CreateFromXml(XmlReader* xml_reader) { | 344 Link* Link::CreateFromXml(XmlReader* xml_reader) { |
305 if (xml_reader->NodeName() != kLinkNode) | 345 if (xml_reader->NodeName() != kLinkNode) |
306 return NULL; | 346 return NULL; |
307 | 347 |
308 Link* link = new Link(); | 348 Link* link = new Link(); |
309 xml_reader->NodeAttribute(kTypeAttr, &link->mime_type_); | 349 xml_reader->NodeAttribute(kTypeAttr, &link->mime_type_); |
310 | 350 |
311 std::string href; | 351 std::string href; |
312 if (xml_reader->NodeAttribute(kHrefAttr, &href)) | 352 if (xml_reader->NodeAttribute(kHrefAttr, &href)) |
313 link->href_ = GURL(href); | 353 link->href_ = GURL(href); |
314 | 354 |
315 std::string rel; | 355 std::string rel; |
316 if (xml_reader->NodeAttribute(kRelAttr, &rel)) | 356 if (xml_reader->NodeAttribute(kRelAttr, &rel)) { |
317 GetLinkType(rel, &link->type_); | 357 GetLinkType(rel, &link->type_); |
| 358 if (link->type_ == OPEN_WITH) |
| 359 GetAppID(rel, &link->app_id_); |
| 360 } |
318 | 361 |
319 return link; | 362 return link; |
320 } | 363 } |
321 | 364 |
322 //////////////////////////////////////////////////////////////////////////////// | 365 //////////////////////////////////////////////////////////////////////////////// |
323 // FeedLink implementation | 366 // FeedLink implementation |
324 | 367 |
325 FeedLink::FeedLink() : type_(FeedLink::UNKNOWN) { | 368 FeedLink::FeedLink() : type_(FeedLink::UNKNOWN) { |
326 } | 369 } |
327 | 370 |
(...skipping 578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 bool AccountMetadataFeed::Parse(const base::Value& value) { | 949 bool AccountMetadataFeed::Parse(const base::Value& value) { |
907 base::JSONValueConverter<AccountMetadataFeed> converter; | 950 base::JSONValueConverter<AccountMetadataFeed> converter; |
908 if (!converter.Convert(value, this)) { | 951 if (!converter.Convert(value, this)) { |
909 LOG(ERROR) << "Unable to parse: Invalid account metadata feed!"; | 952 LOG(ERROR) << "Unable to parse: Invalid account metadata feed!"; |
910 return false; | 953 return false; |
911 } | 954 } |
912 return true; | 955 return true; |
913 } | 956 } |
914 | 957 |
915 } // namespace gdata | 958 } // namespace gdata |
OLD | NEW |