Index: chromeos/dbus/shill_client_helper.cc |
diff --git a/chromeos/dbus/shill_client_helper.cc b/chromeos/dbus/shill_client_helper.cc |
index c9271809a87735326f6fe8250bd88d186f4e6cbd..6418015fe8e626aa4eacce57581376ddcdef0a5e 100644 |
--- a/chromeos/dbus/shill_client_helper.cc |
+++ b/chromeos/dbus/shill_client_helper.cc |
@@ -7,6 +7,7 @@ |
#include "base/bind.h" |
#include "base/callback_helpers.h" |
#include "base/values.h" |
+#include "chromeos/device_event_log.h" |
#include "dbus/message.h" |
#include "dbus/object_proxy.h" |
#include "dbus/values_util.h" |
@@ -211,8 +212,8 @@ ShillClientHelper::ShillClientHelper(dbus::ObjectProxy* proxy) |
} |
ShillClientHelper::~ShillClientHelper() { |
- LOG_IF(ERROR, observer_list_.might_have_observers()) |
- << "ShillClientHelper destroyed with active observers"; |
+ if (observer_list_.might_have_observers()) |
+ NET_LOG(ERROR) << "ShillClientHelper destroyed with active observers"; |
} |
void ShillClientHelper::SetReleasedCallback(ReleasedCallback callback) { |
@@ -394,34 +395,55 @@ void ShillClientHelper::CallListValueMethodWithErrorCallback( |
error_callback)); |
} |
-// static |
-void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
- const base::Value& value) { |
+namespace { |
+ |
+enum DictionaryType { DICTIONARY_TYPE_VARIANT, DICTIONARY_TYPE_STRING }; |
+ |
+// Appends an a{ss} dictionary to |writer|. |dictionary| must only contain |
+// strings. |
+void AppendStringDictionary(const base::DictionaryValue& dictionary, |
+ dbus::MessageWriter* writer) { |
+ dbus::MessageWriter variant_writer(NULL); |
+ writer->OpenVariant("a{ss}", &variant_writer); |
+ dbus::MessageWriter array_writer(NULL); |
+ variant_writer.OpenArray("{ss}", &array_writer); |
+ for (base::DictionaryValue::Iterator it(dictionary); !it.IsAtEnd(); |
+ it.Advance()) { |
+ dbus::MessageWriter entry_writer(NULL); |
+ array_writer.OpenDictEntry(&entry_writer); |
+ entry_writer.AppendString(it.key()); |
+ const base::Value& value = it.value(); |
+ std::string value_string; |
+ if (!value.GetAsString(&value_string)) |
+ NET_LOG(ERROR) << "Dictionary value not a string: " << it.key(); |
+ entry_writer.AppendString(value_string); |
+ array_writer.CloseContainer(&entry_writer); |
+ } |
+ variant_writer.CloseContainer(&array_writer); |
+ writer->CloseContainer(&variant_writer); |
+} |
+ |
+// Implements AppendValueDataAsVariant. If |dictionary_type| is |
+// DICTIONARY_TYPE_VARIANT and |value| is a Dictionary then it will be written |
+// as type 'a{ss}'. Otherwise dictionaries are written as type a{sv}. (This is |
+// to support Cellular.APN which expects a string -> string dictionary). |
+void AppendValueDataAsVariantInternal(dbus::MessageWriter* writer, |
+ const base::Value& value, |
+ DictionaryType dictionary_type) { |
// Support basic types and string-to-string dictionary. |
switch (value.GetType()) { |
case base::Value::TYPE_DICTIONARY: { |
const base::DictionaryValue* dictionary = NULL; |
value.GetAsDictionary(&dictionary); |
- dbus::MessageWriter variant_writer(NULL); |
- writer->OpenVariant("a{ss}", &variant_writer); |
- dbus::MessageWriter array_writer(NULL); |
- variant_writer.OpenArray("{ss}", &array_writer); |
- for (base::DictionaryValue::Iterator it(*dictionary); |
- !it.IsAtEnd(); |
- it.Advance()) { |
- dbus::MessageWriter entry_writer(NULL); |
- array_writer.OpenDictEntry(&entry_writer); |
- entry_writer.AppendString(it.key()); |
- const base::Value& value = it.value(); |
- std::string value_string; |
- DLOG_IF(ERROR, value.GetType() != base::Value::TYPE_STRING) |
- << "Unexpected type " << value.GetType(); |
- value.GetAsString(&value_string); |
- entry_writer.AppendString(value_string); |
- array_writer.CloseContainer(&entry_writer); |
+ if (dictionary_type == DICTIONARY_TYPE_STRING) { |
+ AppendStringDictionary(*dictionary, writer); |
+ } else { |
+ dbus::MessageWriter variant_writer(NULL); |
+ writer->OpenVariant("a{sv}", &variant_writer); |
+ ShillClientHelper::AppendServicePropertiesDictionary(&variant_writer, |
+ *dictionary); |
+ writer->CloseContainer(&variant_writer); |
} |
- variant_writer.CloseContainer(&array_writer); |
- writer->CloseContainer(&variant_writer); |
break; |
} |
case base::Value::TYPE_LIST: { |
@@ -434,10 +456,9 @@ void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
for (base::ListValue::const_iterator it = list->begin(); |
it != list->end(); ++it) { |
const base::Value& value = **it; |
- LOG_IF(ERROR, value.GetType() != base::Value::TYPE_STRING) |
- << "Unexpected type " << value.GetType(); |
std::string value_string; |
- value.GetAsString(&value_string); |
+ if (!value.GetAsString(&value_string)) |
+ NET_LOG(ERROR) << "List value not a string: " << value; |
array_writer.AppendString(value_string); |
} |
variant_writer.CloseContainer(&array_writer); |
@@ -451,9 +472,16 @@ void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
dbus::AppendBasicTypeValueDataAsVariant(writer, value); |
break; |
default: |
- DLOG(ERROR) << "Unexpected type " << value.GetType(); |
+ NET_LOG(ERROR) << "Unexpected value type: " << value.GetType(); |
} |
+} |
+ |
+} // namespace |
+// static |
+void ShillClientHelper::AppendValueDataAsVariant(dbus::MessageWriter* writer, |
+ const base::Value& value) { |
+ AppendValueDataAsVariantInternal(writer, value, DICTIONARY_TYPE_VARIANT); |
} |
// static |
@@ -462,13 +490,19 @@ void ShillClientHelper::AppendServicePropertiesDictionary( |
const base::DictionaryValue& dictionary) { |
dbus::MessageWriter array_writer(NULL); |
writer->OpenArray("{sv}", &array_writer); |
- for (base::DictionaryValue::Iterator it(dictionary); |
- !it.IsAtEnd(); |
+ for (base::DictionaryValue::Iterator it(dictionary); !it.IsAtEnd(); |
it.Advance()) { |
dbus::MessageWriter entry_writer(NULL); |
array_writer.OpenDictEntry(&entry_writer); |
entry_writer.AppendString(it.key()); |
- ShillClientHelper::AppendValueDataAsVariant(&entry_writer, it.value()); |
+ // Shill expects Cellular.APN to be a string dictionary, a{ss}. All other |
+ // properties use a varient dictionary, a{sv}. TODO(stevenjb): Remove this |
+ // hack if/when we change Shill to accept a{sv} for Cellular.APN. |
+ DictionaryType dictionary_type = (it.key() == shill::kCellularApnProperty) |
+ ? DICTIONARY_TYPE_STRING |
+ : DICTIONARY_TYPE_VARIANT; |
+ AppendValueDataAsVariantInternal(&entry_writer, it.value(), |
+ dictionary_type); |
array_writer.CloseContainer(&entry_writer); |
} |
writer->CloseContainer(&array_writer); |
@@ -487,8 +521,8 @@ void ShillClientHelper::Release() { |
void ShillClientHelper::OnSignalConnected(const std::string& interface, |
const std::string& signal, |
bool success) { |
- LOG_IF(ERROR, !success) << "Connect to " << interface << " " << signal |
- << " failed."; |
+ if (!success) |
+ NET_LOG(ERROR) << "Connect to " << interface << " " << signal << " failed."; |
} |
void ShillClientHelper::OnPropertyChanged(dbus::Signal* signal) { |