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 |