Index: device/nfc/nfc_ndef_record.cc |
diff --git a/device/nfc/nfc_ndef_record.cc b/device/nfc/nfc_ndef_record.cc |
deleted file mode 100644 |
index 0914cea66cc09c1dc385aaeabe990bc7a91dd6bc..0000000000000000000000000000000000000000 |
--- a/device/nfc/nfc_ndef_record.cc |
+++ /dev/null |
@@ -1,263 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "device/nfc/nfc_ndef_record.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <map> |
- |
-#include "base/logging.h" |
-#include "url/gurl.h" |
- |
-using base::DictionaryValue; |
-using base::ListValue; |
- |
-namespace device { |
- |
-namespace { |
- |
-typedef std::map<std::string, base::Value::Type> FieldValueMap; |
- |
-bool ValidateURI(const DictionaryValue* data) { |
- std::string uri; |
- if (!data->GetString(NfcNdefRecord::kFieldURI, &uri)) { |
- VLOG(1) << "No URI entry in data."; |
- return false; |
- } |
- DCHECK(!uri.empty()); |
- |
- // Use GURL to check validity. |
- GURL url(uri); |
- if (!url.is_valid()) { |
- LOG(ERROR) << "Invalid URI given: " << uri; |
- return false; |
- } |
- return true; |
-} |
- |
-bool CheckFieldsAreValid( |
- const FieldValueMap& required_fields, |
- const FieldValueMap& optional_fields, |
- const DictionaryValue* data) { |
- size_t required_count = 0; |
- for (DictionaryValue::Iterator iter(*data); |
- !iter.IsAtEnd(); iter.Advance()) { |
- FieldValueMap::const_iterator field_iter = |
- required_fields.find(iter.key()); |
- if (field_iter == required_fields.end()) { |
- // Field wasn't one of the required fields. Check if optional. |
- field_iter = optional_fields.find(iter.key()); |
- |
- if (field_iter == optional_fields.end()) { |
- // If the field isn't one of the optional fields either, then it's |
- // invalid. |
- VLOG(1) << "Tried to populate record with invalid field: " |
- << iter.key(); |
- return false; |
- } |
- } else { |
- required_count++; |
- } |
- // The field is invalid, if the type of its value is incorrect. |
- if (field_iter->second != iter.value().GetType()) { |
- VLOG(1) << "Provided value for field \"" << iter.key() << "\" has type " |
- << iter.value().GetType() << ", expected: " |
- << field_iter->second; |
- return false; |
- } |
- // Make sure that the value is non-empty, if the value is a string. |
- std::string string_value; |
- if (iter.value().GetAsString(&string_value) && string_value.empty()) { |
- VLOG(1) << "Empty value given for field of type string: " << iter.key(); |
- return false; |
- } |
- } |
- // Check for required fields. |
- if (required_count != required_fields.size()) { |
- VLOG(1) << "Provided data did not contain all required fields for " |
- << "requested NDEF type."; |
- return false; |
- } |
- return true; |
-} |
- |
-// Verifies that the contents of |data| conform to the fields of NDEF type |
-// "Text". |
-bool HandleTypeText(const DictionaryValue* data) { |
- VLOG(1) << "Populating record with type \"Text\"."; |
- FieldValueMap required_fields; |
- required_fields[NfcNdefRecord::kFieldText] = base::Value::TYPE_STRING; |
- required_fields[NfcNdefRecord::kFieldEncoding] = base::Value::TYPE_STRING; |
- required_fields[NfcNdefRecord::kFieldLanguageCode] = base::Value::TYPE_STRING; |
- FieldValueMap optional_fields; |
- if (!CheckFieldsAreValid(required_fields, optional_fields, data)) { |
- VLOG(1) << "Failed to populate record."; |
- return false; |
- } |
- |
- // Verify that the "Encoding" property has valid values. |
- std::string encoding; |
- if (!data->GetString(NfcNdefRecord::kFieldEncoding, &encoding)) { |
- if (encoding != NfcNdefRecord::kEncodingUtf8 || |
- encoding != NfcNdefRecord::kEncodingUtf16) { |
- VLOG(1) << "Invalid \"Encoding\" value:" << encoding; |
- return false; |
- } |
- } |
- return true; |
-} |
- |
-// Verifies that the contents of |data| conform to the fields of NDEF type |
-// "SmartPoster". |
-bool HandleTypeSmartPoster(const DictionaryValue* data) { |
- VLOG(1) << "Populating record with type \"SmartPoster\"."; |
- FieldValueMap required_fields; |
- required_fields[NfcNdefRecord::kFieldURI] = base::Value::TYPE_STRING; |
- FieldValueMap optional_fields; |
- optional_fields[NfcNdefRecord::kFieldAction] = base::Value::TYPE_STRING; |
- optional_fields[NfcNdefRecord::kFieldMimeType] = base::Value::TYPE_STRING; |
- // base::Value restricts the number types to BOOL, INTEGER, and DOUBLE only. |
- // uint32_t will automatically get converted to a double. "target size" is |
- // really a uint32_t but we define it as a double for this reason. |
- // (See dbus/values_util.h). |
- optional_fields[NfcNdefRecord::kFieldTargetSize] = base::Value::TYPE_DOUBLE; |
- optional_fields[NfcNdefRecord::kFieldTitles] = base::Value::TYPE_LIST; |
- if (!CheckFieldsAreValid(required_fields, optional_fields, data)) { |
- VLOG(1) << "Failed to populate record."; |
- return false; |
- } |
- // Verify that the "titles" field was formatted correctly, if it exists. |
- const ListValue* titles = NULL; |
- if (data->GetList(NfcNdefRecord::kFieldTitles, &titles)) { |
- if (titles->empty()) { |
- VLOG(1) << "\"titles\" field of SmartPoster is empty."; |
- return false; |
- } |
- for (ListValue::const_iterator iter = titles->begin(); |
- iter != titles->end(); ++iter) { |
- const DictionaryValue* title_data = NULL; |
- if (!(*iter)->GetAsDictionary(&title_data)) { |
- VLOG(1) << "\"title\" entry for SmartPoster contains an invalid value " |
- << "type"; |
- return false; |
- } |
- if (!HandleTypeText(title_data)) { |
- VLOG(1) << "Badly formatted \"title\" entry for SmartPoster."; |
- return false; |
- } |
- } |
- } |
- return ValidateURI(data); |
-} |
- |
-// Verifies that the contents of |data| conform to the fields of NDEF type |
-// "URI". |
-bool HandleTypeUri(const DictionaryValue* data) { |
- VLOG(1) << "Populating record with type \"URI\"."; |
- FieldValueMap required_fields; |
- required_fields[NfcNdefRecord::kFieldURI] = base::Value::TYPE_STRING; |
- FieldValueMap optional_fields; |
- optional_fields[NfcNdefRecord::kFieldMimeType] = base::Value::TYPE_STRING; |
- optional_fields[NfcNdefRecord::kFieldTargetSize] = base::Value::TYPE_DOUBLE; |
- |
- // Allow passing TargetSize as an integer, but convert it to a double. |
- if (!CheckFieldsAreValid(required_fields, optional_fields, data)) { |
- VLOG(1) << "Failed to populate record."; |
- return false; |
- } |
- return ValidateURI(data); |
-} |
- |
-} // namespace |
- |
-// static |
-const char NfcNdefRecord::kFieldEncoding[] = "encoding"; |
-// static |
-const char NfcNdefRecord::kFieldLanguageCode[] = "languageCode"; |
-// static |
-const char NfcNdefRecord::kFieldText[] = "text"; |
-// static |
-const char NfcNdefRecord::kFieldURI[] = "uri"; |
-// static |
-const char NfcNdefRecord::kFieldMimeType[] = "mimeType"; |
-// static |
-const char NfcNdefRecord::kFieldTargetSize[] = "targetSize"; |
-// static |
-const char NfcNdefRecord::kFieldTitles[] = "titles"; |
-// static |
-const char NfcNdefRecord::kFieldAction[] = "action"; |
-// static |
-const char NfcNdefRecord::kEncodingUtf8[] = "UTF-8"; |
-// static |
-const char NfcNdefRecord::kEncodingUtf16[] = "UTF-16"; |
-// static |
-const char NfcNdefRecord::kSmartPosterActionDo[] = "do"; |
-// static |
-const char NfcNdefRecord::kSmartPosterActionSave[] = "save"; |
-// static |
-const char NfcNdefRecord::kSmartPosterActionOpen[] = "open"; |
- |
-NfcNdefRecord::NfcNdefRecord() : type_(kTypeUnknown) { |
-} |
- |
-NfcNdefRecord::~NfcNdefRecord() { |
-} |
- |
-bool NfcNdefRecord::IsPopulated() const { |
- return type_ != kTypeUnknown; |
-} |
- |
-bool NfcNdefRecord::Populate(Type type, const DictionaryValue* data) { |
- if (IsPopulated()) |
- return false; |
- |
- DCHECK(data_.empty()); |
- |
- // At this time, only "Text", "URI", and "SmartPoster" are supported. |
- bool result = false; |
- switch (type) { |
- case kTypeText: |
- result = HandleTypeText(data); |
- break; |
- case kTypeSmartPoster: |
- result = HandleTypeSmartPoster(data); |
- break; |
- case kTypeURI: |
- result = HandleTypeUri(data); |
- break; |
- default: |
- VLOG(1) << "Unsupported NDEF type: " << type; |
- break; |
- } |
- if (!result) |
- return false; |
- type_ = type; |
- data_.MergeDictionary(data); |
- return true; |
-} |
- |
-NfcNdefMessage::NfcNdefMessage() { |
-} |
- |
-NfcNdefMessage::~NfcNdefMessage() { |
-} |
- |
-void NfcNdefMessage::AddRecord(NfcNdefRecord* record) { |
- records_.push_back(record); |
-} |
- |
-bool NfcNdefMessage::RemoveRecord(NfcNdefRecord* record) { |
- for (RecordList::iterator iter = records_.begin(); |
- iter != records_.end(); ++iter) { |
- if (*iter == record) { |
- records_.erase(iter); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-} // namespace device |