Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5136)

Unified Diff: chrome/browser/chromeos/bluetooth/bluetooth_service_record.cc

Issue 10007008: Add support for creating bluetooth RFCOMM sockets. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: reupload off of proper base Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/bluetooth/bluetooth_service_record.cc
diff --git a/chrome/browser/chromeos/bluetooth/bluetooth_service_record.cc b/chrome/browser/chromeos/bluetooth/bluetooth_service_record.cc
index 34c69483f6af03961720b09e9d64905f0d87e668..bad124633845b66684ed2039dbeebb5088ce0821 100644
--- a/chrome/browser/chromeos/bluetooth/bluetooth_service_record.cc
+++ b/chrome/browser/chromeos/bluetooth/bluetooth_service_record.cc
@@ -6,14 +6,21 @@
#include <string>
+#include "base/logging.h"
+#include "base/string_number_conversions.h"
#include "chrome/common/libxml_utils.h"
namespace {
static const char* kAttributeNode = "attribute";
static const char* kIdAttribute = "id";
+static const char* kProtocolDescriptorListId = "0x0004";
+static const char* kRfcommUuid = "0x0003";
static const char* kSdpNameId = "0x0100";
+static const char* kSequenceNode = "sequence";
static const char* kTextNode = "text";
+static const char* kUint8Node = "uint8";
+static const char* kUuidNode = "uuid";
static const char* kValueAttribute = "value";
bool advanceToTag(XmlReader* reader, const char* node_type) {
@@ -30,6 +37,7 @@ namespace chromeos {
bool BluetoothServiceRecord::Init(const std::string& xml_data) {
name_.clear();
+ supports_rfcomm_ = false;
keybuk 2012/04/19 01:05:40 Isn't this in the constructor now
bryeung 2012/04/19 19:42:43 Yep :-)
XmlReader reader;
if (!reader.Load(xml_data))
@@ -39,10 +47,14 @@ bool BluetoothServiceRecord::Init(const std::string& xml_data) {
std::string id;
if (reader.NodeAttribute(kIdAttribute, &id)) {
if (id == kSdpNameId) {
- if (advanceToTag(&reader, kTextNode)) {
- std::string value;
- if (reader.NodeAttribute(kValueAttribute, &value))
- name_ = value;
+ if (advanceToTag(&reader, kTextNode))
+ reader.NodeAttribute(kValueAttribute, &name_);
+ } else if (id == kProtocolDescriptorListId) {
+ if (advanceToTag(&reader, kSequenceNode)) {
+ std::string sequence_content;
+ if (reader.ReadElementContent(&sequence_content)) {
+ ExtractChannels(sequence_content);
+ }
keybuk 2012/04/19 01:05:40 may as well add L2CAP + L2CAP PSM while you're in
bryeung 2012/04/19 19:42:43 future CL?
}
}
}
@@ -53,4 +65,33 @@ bool BluetoothServiceRecord::Init(const std::string& xml_data) {
return true;
}
+void BluetoothServiceRecord::ExtractChannels(const std::string& xml_data) {
+ XmlReader reader;
+ if (!reader.Load(xml_data))
+ return;
+
+ do {
+ if (reader.NodeName() == kSequenceNode) {
+ if (advanceToTag(&reader, kUuidNode)) {
+ std::string type;
+ if (reader.NodeAttribute(kValueAttribute, &type) &&
+ type == kRfcommUuid) {
+ if (advanceToTag(&reader, kUint8Node)) {
+ std::string channel_string;
+ if (reader.NodeAttribute(kValueAttribute, &channel_string)) {
+ unsigned channel;
+ if (base::StringToUint(channel_string, &channel)) {
+ if ((channel & 0xFF) == channel) {
+ rfcomm_channel_ = static_cast<uint8_t>(channel);
+ supports_rfcomm_ = true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } while (advanceToTag(&reader, kSequenceNode));
+}
+
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698