Chromium Code Reviews| Index: chrome/browser/ui/webui/chromeos/nfc_debug_ui.cc |
| diff --git a/chrome/browser/ui/webui/chromeos/nfc_debug_ui.cc b/chrome/browser/ui/webui/chromeos/nfc_debug_ui.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..41499fe981b6252d79af3a2eae8cbe41db8f09b4 |
| --- /dev/null |
| +++ b/chrome/browser/ui/webui/chromeos/nfc_debug_ui.cc |
| @@ -0,0 +1,661 @@ |
| +// Copyright (c) 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 "chrome/browser/ui/webui/chromeos/nfc_debug_ui.h" |
| + |
| +#include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| +#include "base/values.h" |
| +#include "chrome/browser/profiles/profile.h" |
| +#include "chrome/common/url_constants.h" |
| +#include "content/public/browser/web_ui.h" |
| +#include "content/public/browser/web_ui_data_source.h" |
| +#include "content/public/browser/web_ui_message_handler.h" |
| +#include "device/nfc/nfc_adapter.h" |
| +#include "device/nfc/nfc_adapter_factory.h" |
| +#include "device/nfc/nfc_peer.h" |
| +#include "device/nfc/nfc_tag.h" |
| +#include "grit/browser_resources.h" |
| +#include "grit/generated_resources.h" |
| + |
| +using device::NfcAdapter; |
| +using device::NfcAdapterFactory; |
| +using device::NfcNdefMessage; |
| +using device::NfcNdefRecord; |
| +using device::NfcNdefTagTechnology; |
| +using device::NfcPeer; |
| +using device::NfcTag; |
| +using device::NfcTagTechnology; |
| + |
| +namespace chromeos { |
| + |
| +namespace { |
| + |
| +// Keys for various NFC properties that are used by JS. |
| +const char kAdapterPeersProperty[] = "peers"; |
| +const char kAdapterPollingProperty[] = "polling"; |
| +const char kAdapterPoweredProperty[] = "powered"; |
| +const char kAdapterPresentProperty[] = "present"; |
| +const char kAdapterTagsProperty[] = "tags"; |
| + |
| +const char kPeerIdentifierProperty[] = "identifier"; |
| +const char kPeerRecordsProperty[] = "records"; |
| + |
| +const char kTagIdentifierProperty[] = "identifier"; |
| +const char kTagTypeProperty[] = "type"; |
| +const char kTagReadOnlyProperty[] = "readOnly"; |
| +const char kTagRecordsProperty[] = "records"; |
| +const char kTagSupportedProtocolProperty[] = "supportedProtocol"; |
| +const char kTagSupportedTechnologiesProperty[] = "supportedTechnologies"; |
| +const char kRecordTypeProperty[] = "type"; |
| + |
| +// Tag types. |
| +const char kTagType1[] = "TYPE-1"; |
| +const char kTagType2[] = "TYPE-2"; |
| +const char kTagType3[] = "TYPE-3"; |
| +const char kTagType4[] = "TYPE-4"; |
| +const char kTagTypeUnknown[] = "UNKNOWN"; |
| + |
| +// NFC transfer protocols. |
| +const char kTagProtocolFelica[] = "FELICA"; |
| +const char kTagProtocolIsoDep[] = "ISO-DEP"; |
| +const char kTagProtocolJewel[] = "JEWEL"; |
| +const char kTagProtocolMifare[] = "MIFARE"; |
| +const char kTagProtocolNfcDep[] = "NFC-DEP"; |
| +const char kTagProtocolUnknown[] = "UNKNOWN"; |
| + |
| +// NFC tag technologies. |
| +const char kTagTechnologyNfcA[] = "NFC-A"; |
| +const char kTagTechnologyNfcB[] = "NFC-B"; |
| +const char kTagTechnologyNfcF[] = "NFC-F"; |
| +const char kTagTechnologyNfcV[] = "NFC-V"; |
| +const char kTagTechnologyIsoDep[] = "ISO-DEP"; |
| +const char kTagTechnologyNdef[] = "NDEF"; |
| + |
| +// NDEF types. |
| +const char kTypeHandoverCarrier[] = "HANDOVER_CARRIER"; |
| +const char kTypeHandoverRequest[] = "HANDOVER_REQUEST"; |
| +const char kTypeHandoverSelect[] = "HANDOVER_SELECT"; |
| +const char kTypeSmartPoster[] = "SMART_POSTER"; |
| +const char kTypeText[] = "TEXT"; |
| +const char kTypeURI[] = "URI"; |
| +const char kTypeUnknown[] = "UNKNOWN"; |
| + |
| +// JavaScript callback constants. |
| +const char kInitializeCallback[] = "initialize"; |
| +const char kSetAdapterPowerCallback[] = "setAdapterPower"; |
| +const char kSetAdapterPollingCallback[] = "setAdapterPolling"; |
| +const char kSubmitRecordFormCallback[] = "submitRecordForm"; |
| + |
| +// Constants for JavaScript functions that we can call. |
| +const char kOnNfcAdapterInfoChangedFunction[] = |
| + "nfc_debug.NfcDebugUI.onNfcAdapterInfoChanged"; |
| +const char kOnNfcAvailabilityDeterminedFunction[] = |
| + "nfc_debug.NfcDebugUI.onNfcAvailabilityDetermined"; |
| +const char kOnNfcPeerDeviceInfoChangedFunction[] = |
| + "nfc_debug.NfcDebugUI.onNfcPeerDeviceInfoChanged"; |
| +const char kOnNfcTagInfoChangedFunction[] = |
| + "nfc_debug.NfcDebugUI.onNfcTagInfoChanged"; |
| +const char kOnSetAdapterPollingFailedFunction[] = |
| + "nfc_debug.NfcDebugUI.onSetAdapterPollingFailed"; |
| +const char kOnSetAdapterPowerFailedFunction[] = |
| + "nfc_debug.NfcDebugUI.onSetAdapterPowerFailed"; |
| +const char kOnSubmitRecordFormFailedFunction[] = |
| + "nfc_debug.NfcDebugUI.onSubmitRecordFormFailed"; |
| + |
| +std::string RecordTypeToString(NfcNdefRecord::Type type) { |
| + switch (type) { |
| + case NfcNdefRecord::kTypeHandoverCarrier: |
| + return kTypeHandoverCarrier; |
| + case NfcNdefRecord::kTypeHandoverRequest: |
| + return kTypeHandoverRequest; |
| + case NfcNdefRecord::kTypeHandoverSelect: |
| + return kTypeHandoverSelect; |
| + case NfcNdefRecord::kTypeSmartPoster: |
| + return kTypeSmartPoster; |
| + case NfcNdefRecord::kTypeText: |
| + return kTypeText; |
| + case NfcNdefRecord::kTypeURI: |
| + return kTypeURI; |
| + default: |
|
stevenjb
2014/01/23 21:57:57
remove default so that compiler will catch additio
armansito
2014/01/24 20:50:33
Done.
|
| + return kTypeUnknown; |
| + } |
| +} |
| + |
| +NfcNdefRecord::Type RecordTypeStringValueToEnum(const std::string& type) { |
| + if (type == kTypeHandoverCarrier) |
| + return NfcNdefRecord::kTypeHandoverCarrier; |
| + if (type == kTypeHandoverRequest) |
| + return NfcNdefRecord::kTypeHandoverRequest; |
| + if (type == kTypeHandoverSelect) |
| + return NfcNdefRecord::kTypeHandoverSelect; |
| + if (type == kTypeSmartPoster) |
| + return NfcNdefRecord::kTypeSmartPoster; |
| + if (type == kTypeText) |
| + return NfcNdefRecord::kTypeText; |
| + if (type == kTypeURI) |
| + return NfcNdefRecord::kTypeURI; |
| + return NfcNdefRecord::kTypeUnknown; |
| +} |
| + |
| +std::string TagTypeToString(NfcTag::TagType type) { |
| + switch (type) { |
| + case NfcTag::kTagType1: |
| + return kTagType1; |
| + case NfcTag::kTagType2: |
| + return kTagType2; |
| + case NfcTag::kTagType3: |
| + return kTagType3; |
| + case NfcTag::kTagType4: |
| + return kTagType4; |
| + default: |
| + return kTagTypeUnknown; |
|
stevenjb
2014/01/23 21:57:57
Same here.
armansito
2014/01/24 20:50:33
Done.
|
| + } |
| +} |
| + |
| +std::string TagProtocolToString(NfcTag::Protocol protocol) { |
| + switch (protocol) { |
| + case NfcTag::kProtocolFelica: |
| + return kTagProtocolFelica; |
| + case NfcTag::kProtocolIsoDep: |
| + return kTagProtocolIsoDep; |
| + case NfcTag::kProtocolJewel: |
| + return kTagProtocolJewel; |
| + case NfcTag::kProtocolMifare: |
| + return kTagProtocolMifare; |
| + case NfcTag::kProtocolNfcDep: |
| + return kTagProtocolNfcDep; |
| + default: |
| + return kTagProtocolUnknown; |
|
stevenjb
2014/01/23 21:57:57
Same here.
armansito
2014/01/24 20:50:33
Done.
|
| + } |
| +} |
| + |
| +// content::WebUIMessageHandler implementation for this page. |
| +class NfcDebugMessageHandler : public content::WebUIMessageHandler, |
| + public NfcAdapter::Observer, |
| + public NfcNdefTagTechnology::Observer, |
| + public NfcPeer::Observer, |
| + public NfcTag::Observer { |
| + public: |
| + NfcDebugMessageHandler(); |
| + virtual ~NfcDebugMessageHandler(); |
| + |
| + // WebUIMessageHandler implementation. |
| + virtual void RegisterMessages() OVERRIDE; |
| + |
| + // NfcAdapter::Observer overrides. |
| + virtual void AdapterPresentChanged( |
| + NfcAdapter* adapter, bool present) OVERRIDE; |
|
stevenjb
2014/01/23 21:57:57
one line per arg unless entire declaration fits on
armansito
2014/01/24 20:50:33
Done.
|
| + virtual void AdapterPoweredChanged( |
| + NfcAdapter* adapter, bool powered) OVERRIDE; |
| + virtual void AdapterPollingChanged( |
| + NfcAdapter* adapter, bool polling) OVERRIDE; |
| + virtual void TagFound(NfcAdapter* adapter, NfcTag* tag) OVERRIDE; |
| + virtual void TagLost(NfcAdapter*adapter, NfcTag* tag) OVERRIDE; |
| + virtual void PeerFound(NfcAdapter* adaper, NfcPeer* peer) OVERRIDE; |
| + virtual void PeerLost(NfcAdapter* adapter, NfcPeer* peer) OVERRIDE; |
| + |
| + // NfcNdefTagTechnology::Observer override. |
| + virtual void RecordReceived( |
| + NfcTag* tag, const NfcNdefRecord* record) OVERRIDE; |
| + |
| + // NfcPeer::Observer override. |
| + virtual void RecordReceived( |
| + NfcPeer* peer, const NfcNdefRecord* record) OVERRIDE; |
| + |
| + // NfcTag::Observer override. |
| + virtual void TagReady(NfcTag* tag) OVERRIDE; |
| + |
| + private: |
| + // Called by the UI when the page loads. This method requests information |
| + // about NFC availability on the current platform and requests the underlying |
| + // Adapter object. The UI is notified once the information is available. |
| + void Initialize(const base::ListValue* args); |
| + |
| + // Called by the UI to toggle the adapter power. |args| will contain one |
| + // boolean that indicates whether the power should be set to ON or OFF. |
| + void SetAdapterPower(const base::ListValue* args); |
| + void OnSetAdapterPowerError(); |
| + |
| + // Called by the UI set the adapter's poll status. |args| will contain one |
| + // boolean that indicates whether polling should be started or stopped. |
| + void SetAdapterPolling(const base::ListValue* args); |
| + void OnSetAdapterPollingError(); |
| + |
| + // Called by the UI to push an NDEF record to a remote device or tag. |args| |
| + // will contain one dictionary that contains the record data. |
| + void SubmitRecordForm(const base::ListValue* args); |
| + void OnSubmitRecordFormFailed(const std::string& error_message); |
| + |
| + // Callback passed to NfcAdapterFactory::GetAdapter. |
| + void OnGetAdapter(scoped_refptr<NfcAdapter> adapter); |
| + |
| + // Stores the properties of the NFC adapter in |out|, mapping these to keys |
| + // that will be read by JS. |
| + void GetAdapterProperties(base::DictionaryValue* out); |
| + |
| + // Stores the properties of the NFC peer in |out|, mapping these to keys |
| + // that will be read by JS. |out| will not be modified, if no peer is known. |
| + void GetPeerProperties(base::DictionaryValue* out); |
| + |
| + // Stores the properties of the NFC tag in |out|, mapping these to keys |
| + // that will be read by JS. |out| will not be modified, if no tag is known. |
| + void GetTagProperties(base::DictionaryValue* out); |
| + |
| + // Returns the records in |message| by populating |out|, in which |
| + // they have been converted to a JS friendly format. |
| + void GetRecordList(const NfcNdefMessage& message, base::ListValue* out); |
| + |
| + // Updates the data displayed in the UI for the current adapter. |
| + void UpdateAdapterInfo(); |
| + |
| + // Updates the data displayed in the UI for the current peer. |
| + void UpdatePeerInfo(); |
| + |
| + // Updates the data displayed in the UI for the current tag. |
| + void UpdateTagInfo(); |
| + |
| + // The NfcAdapter object. |
| + scoped_refptr<NfcAdapter> nfc_adapter_; |
| + |
| + // The cached identifier of the most recent NFC peer device found. |
| + std::string peer_identifier_; |
| + |
| + // The cached identifier of the most recent NFC tag found. |
| + std::string tag_identifier_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(NfcDebugMessageHandler); |
| +}; |
| + |
| +NfcDebugMessageHandler::NfcDebugMessageHandler() { |
| +} |
| + |
| +NfcDebugMessageHandler::~NfcDebugMessageHandler() { |
| +} |
| + |
| +void NfcDebugMessageHandler::AdapterPresentChanged( |
| + NfcAdapter* adapter, bool present) { |
| + UpdateAdapterInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::AdapterPoweredChanged( |
| + NfcAdapter* adapter, bool powered) { |
| + UpdateAdapterInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::AdapterPollingChanged( |
| + NfcAdapter* adapter, bool polling) { |
| + UpdateAdapterInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::TagFound(NfcAdapter* adapter, NfcTag* tag) { |
| + VLOG(1) << "Found NFC tag: " << tag->GetIdentifier(); |
| + tag->AddObserver(this); |
| + tag_identifier_ = tag->GetIdentifier(); |
| + tag->GetNdefTagTechnology()->AddObserver(this); |
| + UpdateAdapterInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::TagLost(NfcAdapter*adapter, NfcTag* tag) { |
| + VLOG(1) << "Lost NFC tag: " << tag->GetIdentifier(); |
| + tag->RemoveObserver(this); |
| + tag->GetNdefTagTechnology()->RemoveObserver(this); |
| + tag_identifier_.clear(); |
| + UpdateAdapterInfo(); |
| + UpdateTagInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::PeerFound(NfcAdapter* adaper, NfcPeer* peer) { |
| + VLOG(1) << "Found NFC peer device: " << peer->GetIdentifier(); |
| + peer->AddObserver(this); |
| + peer_identifier_ = peer->GetIdentifier(); |
| + UpdateAdapterInfo(); |
| + UpdatePeerInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::PeerLost(NfcAdapter* adapter, NfcPeer* peer) { |
| + VLOG(1) << "Lost NFC peer device: " << peer->GetIdentifier(); |
| + peer->RemoveObserver(this); |
| + peer_identifier_.clear(); |
| + UpdateAdapterInfo(); |
| + UpdatePeerInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::RecordReceived( |
| + NfcTag* tag, const NfcNdefRecord* record) { |
|
stevenjb
2014/01/23 21:57:57
one line per arg, here and below
armansito
2014/01/24 20:50:33
Done.
|
| + if (tag->GetIdentifier() != tag_identifier_) { |
| + LOG(WARNING) << "Records received from unknown tag: " |
| + << tag->GetIdentifier(); |
| + return; |
| + } |
| + UpdateTagInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::RecordReceived( |
| + NfcPeer* peer, const NfcNdefRecord* record) { |
| + if (peer->GetIdentifier() != peer_identifier_) { |
| + LOG(WARNING) << "Records received from unknown peer: " |
| + << peer->GetIdentifier(); |
| + return; |
| + } |
| + UpdatePeerInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::TagReady(NfcTag* tag) { |
| + if (tag_identifier_ != tag->GetIdentifier()) { |
| + LOG(WARNING) << "Unknown tag became ready: " << tag->GetIdentifier(); |
| + return; |
| + } |
| + VLOG(1) << "Tag ready: " << tag->GetIdentifier(); |
| + UpdateTagInfo(); |
| +} |
| + |
| +void NfcDebugMessageHandler::RegisterMessages() { |
| + web_ui()->RegisterMessageCallback( |
| + kInitializeCallback, |
| + base::Bind(&NfcDebugMessageHandler::Initialize, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kSetAdapterPowerCallback, |
| + base::Bind(&NfcDebugMessageHandler::SetAdapterPower, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kSetAdapterPollingCallback, |
| + base::Bind(&NfcDebugMessageHandler::SetAdapterPolling, |
| + base::Unretained(this))); |
| + web_ui()->RegisterMessageCallback( |
| + kSubmitRecordFormCallback, |
| + base::Bind(&NfcDebugMessageHandler::SubmitRecordForm, |
| + base::Unretained(this))); |
| +} |
| + |
| +void NfcDebugMessageHandler::Initialize(const base::ListValue* args) { |
| + bool nfc_available = NfcAdapterFactory::IsNfcAvailable(); |
| + base::FundamentalValue available(nfc_available); |
| + web_ui()->CallJavascriptFunction(kOnNfcAvailabilityDeterminedFunction, |
| + available); |
| + if (!nfc_available) { |
| + LOG(WARNING) << "NFC is not available on current platform."; |
| + return; |
| + } |
| + NfcAdapterFactory::GetAdapter( |
| + base::Bind(&NfcDebugMessageHandler::OnGetAdapter, |
| + base::Unretained(this))); |
| +} |
| + |
| +void NfcDebugMessageHandler::SetAdapterPower(const base::ListValue* args) { |
| + DCHECK(1 == args->GetSize()); |
| + DCHECK(nfc_adapter_.get()); |
| + bool powered; |
| + args->GetBoolean(0, &powered); |
| + VLOG(1) << "Setting adapter power: " << powered; |
| + nfc_adapter_->SetPowered( |
| + powered, base::Bind(&base::DoNothing), |
| + base::Bind(&NfcDebugMessageHandler::OnSetAdapterPowerError, |
| + base::Unretained(this))); |
| +} |
| + |
| +void NfcDebugMessageHandler::OnSetAdapterPowerError() { |
| + LOG(ERROR) << "Failed to set NFC adapter power."; |
| + web_ui()->CallJavascriptFunction(kOnSetAdapterPowerFailedFunction); |
| +} |
| + |
| +void NfcDebugMessageHandler:: SetAdapterPolling(const base::ListValue* args) { |
| + DCHECK(1 == args->GetSize()); |
| + DCHECK(nfc_adapter_.get()); |
| + bool start; |
|
stevenjb
2014/01/23 21:57:57
Initialize start or check result of GetBoolean.
armansito
2014/01/24 20:50:33
Done.
|
| + args->GetBoolean(0, &start); |
| + if (start) { |
| + VLOG(1) << "Starting NFC poll loop."; |
| + nfc_adapter_->StartPolling( |
| + base::Bind(&base::DoNothing), |
| + base::Bind(&NfcDebugMessageHandler::OnSetAdapterPollingError, |
| + base::Unretained(this))); |
| + } else { |
| + VLOG(1) << "Stopping NFC poll loop."; |
| + nfc_adapter_->StopPolling( |
| + base::Bind(&base::DoNothing), |
| + base::Bind(&NfcDebugMessageHandler::OnSetAdapterPollingError, |
| + base::Unretained(this))); |
| + } |
| +} |
| + |
| +void NfcDebugMessageHandler::OnSetAdapterPollingError() { |
| + LOG(ERROR) << "Failed to start/stop polling."; |
| + web_ui()->CallJavascriptFunction(kOnSetAdapterPollingFailedFunction); |
| +} |
| + |
| +void NfcDebugMessageHandler::SubmitRecordForm(const base::ListValue* args) { |
| + DCHECK(1 == args->GetSize()); |
| + DCHECK(nfc_adapter_.get()); |
| + const base::DictionaryValue* record_data_const = NULL; |
| + if (!args->GetDictionary(0, &record_data_const)) { |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + if (peer_identifier_.empty() && tag_identifier_.empty()) { |
| + OnSubmitRecordFormFailed("No peer or tag present."); |
| + return; |
| + } |
| + |
| + std::string type; |
| + if (!record_data_const->GetString(kRecordTypeProperty, &type)) { |
| + OnSubmitRecordFormFailed("Record type not provided."); |
| + return; |
| + } |
| + |
| + base::DictionaryValue* record_data = record_data_const->DeepCopy(); |
| + record_data->Remove(kRecordTypeProperty, NULL); |
| + |
| + // Convert the "targetSize" field to a double, in case JS stored it as an |
| + // integer. |
| + int target_size; |
| + if (record_data->GetInteger(NfcNdefRecord::kFieldTargetSize, &target_size)) { |
| + record_data->SetDouble(NfcNdefRecord::kFieldTargetSize, |
| + static_cast<double>(target_size)); |
| + } |
| + |
| + NfcNdefRecord record; |
| + if (!record.Populate(RecordTypeStringValueToEnum(type), record_data)) { |
| + OnSubmitRecordFormFailed("Invalid record data provided. Missing required " |
| + "fields?"); |
| + return; |
| + } |
| + |
| + if (!peer_identifier_.empty()) { |
| + NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_); |
| + if (!peer) { |
| + OnSubmitRecordFormFailed("The current NFC adapter doesn't seem to know " |
| + "about peer: " + peer_identifier_); |
| + return; |
| + } |
| + NfcNdefMessage message; |
| + message.AddRecord(&record); |
| + peer->PushNdef(message, |
| + base::Bind(&base::DoNothing), |
| + base::Bind(&NfcDebugMessageHandler::OnSubmitRecordFormFailed, |
| + base::Unretained(this), |
| + "Failed to push NDEF record.")); |
| + return; |
| + } |
| + NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_); |
| + if (!tag) { |
| + OnSubmitRecordFormFailed("The current NFC tag doesn't seem to known about " |
| + "tag: " + tag_identifier_); |
| + return; |
| + } |
| + NfcNdefMessage message; |
| + message.AddRecord(&record); |
| + tag->GetNdefTagTechnology()->WriteNdef( |
| + message, |
| + base::Bind(&base::DoNothing), |
| + base::Bind(&NfcDebugMessageHandler::OnSubmitRecordFormFailed, |
| + base::Unretained(this), |
| + "Failed to write NDEF record.")); |
| +} |
| + |
| +void NfcDebugMessageHandler::OnSubmitRecordFormFailed( |
| + const std::string& error_message) { |
| + LOG(ERROR) << "SubmitRecordForm failed: " << error_message; |
| + web_ui()->CallJavascriptFunction(kOnSubmitRecordFormFailedFunction, |
| + base::StringValue(error_message)); |
| +} |
| + |
| +void NfcDebugMessageHandler::OnGetAdapter( |
| + scoped_refptr<NfcAdapter> adapter) { |
| + if (nfc_adapter_.get()) |
| + return; |
| + nfc_adapter_ = adapter; |
| + nfc_adapter_->AddObserver(this); |
| + UpdateAdapterInfo(); |
| + |
| + NfcAdapter::PeerList peers; |
| + nfc_adapter_->GetPeers(&peers); |
| + for (NfcAdapter::PeerList::const_iterator iter = peers.begin(); |
| + iter != peers.end(); ++iter) { |
| + PeerFound(nfc_adapter_.get(), *iter); |
| + } |
| +} |
| + |
| +void NfcDebugMessageHandler::GetAdapterProperties( |
| + base::DictionaryValue* out) { |
| + if (!nfc_adapter_.get()) { |
| + VLOG(1) << "NFC adapter hasn't been received yet."; |
| + return; |
| + } |
| + out->SetBoolean(kAdapterPresentProperty, nfc_adapter_->IsPresent()); |
| + out->SetBoolean(kAdapterPollingProperty, nfc_adapter_->IsPolling()); |
| + out->SetBoolean(kAdapterPoweredProperty, nfc_adapter_->IsPowered()); |
| + |
| + NfcAdapter::PeerList peers; |
| + nfc_adapter_->GetPeers(&peers); |
| + out->SetInteger(kAdapterPeersProperty, static_cast<int>(peers.size())); |
| + |
| + NfcAdapter::TagList tags; |
| + nfc_adapter_->GetTags(&tags); |
| + out->SetInteger(kAdapterTagsProperty, static_cast<int>(tags.size())); |
| +} |
| + |
| +void NfcDebugMessageHandler::GetPeerProperties(base::DictionaryValue* out) { |
| + if (peer_identifier_.empty()) { |
| + VLOG(1) << "No known peer exists."; |
| + return; |
| + } |
| + if (!nfc_adapter_.get()) { |
| + VLOG(1) << "NFC adapter hasn't been received yet."; |
| + return; |
| + } |
| + NfcPeer* peer = nfc_adapter_->GetPeer(peer_identifier_); |
| + if (!peer) { |
| + LOG(ERROR) << "The current NFC adapter doesn't seem to know about peer: " |
| + << peer_identifier_; |
| + return; |
| + } |
| + out->SetString(kPeerIdentifierProperty, peer_identifier_); |
| + |
| + base::ListValue* records = new base::ListValue(); |
| + GetRecordList(peer->GetNdefMessage(), records); |
| + out->Set(kPeerRecordsProperty, records); |
| +} |
| + |
| +void NfcDebugMessageHandler::GetTagProperties(base::DictionaryValue* out) { |
| + if (tag_identifier_.empty()) { |
| + VLOG(1) << "No known tag exists."; |
| + return; |
| + } |
| + if (!nfc_adapter_.get()) { |
| + VLOG(1) << "NFC adapter hasn't been received yet."; |
| + return; |
| + } |
| + NfcTag* tag = nfc_adapter_->GetTag(tag_identifier_); |
| + if (!tag) { |
| + LOG(ERROR) << "The current NFC adapter doesn't seem to know about tag: " |
| + << tag_identifier_; |
| + return; |
| + } |
| + out->SetString(kTagIdentifierProperty, tag_identifier_); |
| + out->SetString(kTagTypeProperty, TagTypeToString(tag->GetType())); |
| + out->SetBoolean(kTagReadOnlyProperty, tag->IsReadOnly()); |
| + out->SetString(kTagSupportedProtocolProperty, |
| + TagProtocolToString(tag->GetSupportedProtocol())); |
| + |
| + base::ListValue* technologies = new base::ListValue(); |
| + NfcTagTechnology::TechnologyTypeMask technology_mask = |
| + tag->GetSupportedTechnologies(); |
| + if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcA) |
| + technologies->AppendString(kTagTechnologyNfcA); |
| + if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcB) |
| + technologies->AppendString(kTagTechnologyNfcB); |
| + if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcF) |
| + technologies->AppendString(kTagTechnologyNfcF); |
| + if (technology_mask & NfcTagTechnology::kTechnologyTypeNfcV) |
| + technologies->AppendString(kTagTechnologyNfcV); |
| + if (technology_mask & NfcTagTechnology::kTechnologyTypeIsoDep) |
| + technologies->AppendString(kTagTechnologyIsoDep); |
| + if (technology_mask & NfcTagTechnology::kTechnologyTypeNdef) |
| + technologies->AppendString(kTagTechnologyNdef); |
| + out->Set(kTagSupportedTechnologiesProperty, technologies); |
| + |
| + base::ListValue* records = new base::ListValue(); |
| + GetRecordList(tag->GetNdefTagTechnology()->GetNdefMessage(), records); |
| + out->Set(kTagRecordsProperty, records); |
| +} |
| + |
| +void NfcDebugMessageHandler::GetRecordList(const NfcNdefMessage& message, |
| + base::ListValue* out) { |
| + for (NfcNdefMessage::RecordList::const_iterator iter = |
| + message.records().begin(); |
| + iter != message.records().end(); ++iter) { |
| + const NfcNdefRecord* record = (*iter); |
| + base::DictionaryValue* record_data = record->data().DeepCopy(); |
| + record_data->SetString(kRecordTypeProperty, |
| + RecordTypeToString(record->type())); |
| + out->Append(record_data); |
| + } |
| +} |
| + |
| +void NfcDebugMessageHandler::UpdateAdapterInfo() { |
| + base::DictionaryValue data; |
| + GetAdapterProperties(&data); |
| + web_ui()->CallJavascriptFunction(kOnNfcAdapterInfoChangedFunction, data); |
| +} |
| + |
| +void NfcDebugMessageHandler::UpdatePeerInfo() { |
| + base::DictionaryValue data; |
| + GetPeerProperties(&data); |
| + web_ui()->CallJavascriptFunction(kOnNfcPeerDeviceInfoChangedFunction, data); |
| +} |
| + |
| +void NfcDebugMessageHandler::UpdateTagInfo() { |
| + base::DictionaryValue data; |
| + GetTagProperties(&data); |
| + web_ui()->CallJavascriptFunction(kOnNfcTagInfoChangedFunction, data); |
| +} |
| + |
| +} // namespace |
| + |
| +NfcDebugUI::NfcDebugUI(content::WebUI* web_ui) |
| + : content::WebUIController(web_ui) { |
| + web_ui->AddMessageHandler(new NfcDebugMessageHandler()); |
| + |
| + content::WebUIDataSource* html_source = |
| + content::WebUIDataSource::Create(chrome::kChromeUINfcDebugHost); |
| + html_source->SetUseJsonJSFormatV2(); |
| + |
| + html_source->SetJsonPath("strings.js"); |
| + |
| + // Add required resources. |
| + html_source->AddResourcePath("nfc_debug.css", IDR_NFC_DEBUG_CSS); |
| + html_source->AddResourcePath("nfc_debug.js", IDR_NFC_DEBUG_JS); |
| + html_source->SetDefaultResource(IDR_NFC_DEBUG_HTML); |
| + |
| + Profile* profile = Profile::FromWebUI(web_ui); |
| + content::WebUIDataSource::Add(profile, html_source); |
| +} |
| + |
| +NfcDebugUI::~NfcDebugUI() { |
| +} |
| + |
| +} // namespace chromeos |