summaryrefslogtreecommitdiffstats
path: root/chromeos/dbus/shill_profile_client_stub.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromeos/dbus/shill_profile_client_stub.cc')
-rw-r--r--chromeos/dbus/shill_profile_client_stub.cc125
1 files changed, 111 insertions, 14 deletions
diff --git a/chromeos/dbus/shill_profile_client_stub.cc b/chromeos/dbus/shill_profile_client_stub.cc
index 9b427bb..e249cd5 100644
--- a/chromeos/dbus/shill_profile_client_stub.cc
+++ b/chromeos/dbus/shill_profile_client_stub.cc
@@ -5,10 +5,13 @@
#include "chromeos/dbus/shill_profile_client_stub.h"
#include "base/bind.h"
+#include "base/bind_helpers.h"
#include "base/message_loop.h"
#include "base/stl_util.h"
#include "base/values.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/shill_property_changed_observer.h"
+#include "chromeos/dbus/shill_service_client.h"
#include "dbus/bus.h"
#include "dbus/message.h"
#include "dbus/object_path.h"
@@ -17,7 +20,38 @@
namespace chromeos {
-ShillProfileClientStub::ShillProfileClientStub() : weak_ptr_factory_(this) {
+namespace {
+
+void PassEmptyDictionary(
+ const ShillProfileClient::DictionaryValueCallbackWithoutStatus& callback) {
+ base::DictionaryValue dictionary;
+ if (callback.is_null())
+ return;
+ callback.Run(dictionary);
+}
+
+void PassDictionary(
+ const ShillProfileClient::DictionaryValueCallbackWithoutStatus& callback,
+ const base::DictionaryValue* dictionary) {
+ if (callback.is_null())
+ return;
+ callback.Run(*dictionary);
+}
+
+base::DictionaryValue* GetOrCreateDictionary(const std::string& key,
+ base::DictionaryValue* dict) {
+ base::DictionaryValue* nested_dict = NULL;
+ dict->GetDictionaryWithoutPathExpansion(key, &nested_dict);
+ if (!nested_dict) {
+ nested_dict = new base::DictionaryValue;
+ dict->SetWithoutPathExpansion(key, nested_dict);
+ }
+ return nested_dict;
+}
+
+} // namespace
+
+ShillProfileClientStub::ShillProfileClientStub() {
}
ShillProfileClientStub::~ShillProfileClientStub() {
@@ -37,13 +71,21 @@ void ShillProfileClientStub::GetProperties(
const dbus::ObjectPath& profile_path,
const DictionaryValueCallbackWithoutStatus& callback,
const ErrorCallback& error_callback) {
- if (callback.is_null())
+ base::DictionaryValue* profile = GetProfile(profile_path, error_callback);
+ if (!profile)
return;
+
+ scoped_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
+ base::ListValue* entry_paths = new base::ListValue;
+ properties->SetWithoutPathExpansion(flimflam::kEntriesProperty, entry_paths);
+ for (base::DictionaryValue::Iterator it(*profile); !it.IsAtEnd();
+ it.Advance()) {
+ entry_paths->AppendString(it.key());
+ }
+
MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(&ShillProfileClientStub::PassEmptyDictionaryValue,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Bind(&PassDictionary, callback, base::Owned(properties.release())));
}
void ShillProfileClientStub::GetEntry(
@@ -51,28 +93,83 @@ void ShillProfileClientStub::GetEntry(
const std::string& entry_path,
const DictionaryValueCallbackWithoutStatus& callback,
const ErrorCallback& error_callback) {
- if (callback.is_null())
+ base::DictionaryValue* profile = GetProfile(profile_path, error_callback);
+ if (!profile)
+ return;
+
+ base::DictionaryValue* entry = NULL;
+ profile->GetDictionaryWithoutPathExpansion(entry_path, &entry);
+ if (!entry) {
+ error_callback.Run("Error.InvalidProfileEntry", "Invalid profile entry");
return;
+ }
+
MessageLoop::current()->PostTask(
FROM_HERE,
- base::Bind(&ShillProfileClientStub::PassEmptyDictionaryValue,
- weak_ptr_factory_.GetWeakPtr(),
- callback));
+ base::Bind(&PassDictionary, callback, base::Owned(entry->DeepCopy())));
}
void ShillProfileClientStub::DeleteEntry(const dbus::ObjectPath& profile_path,
const std::string& entry_path,
const base::Closure& callback,
const ErrorCallback& error_callback) {
- if (callback.is_null())
+ base::DictionaryValue* profile = GetProfile(profile_path, error_callback);
+ if (!profile)
return;
+
+ if (!profile->RemoveWithoutPathExpansion(entry_path, NULL)) {
+ error_callback.Run("Error.InvalidProfileEntry", "Invalid profile entry");
+ return;
+ }
+
MessageLoop::current()->PostTask(FROM_HERE, callback);
}
-void ShillProfileClientStub::PassEmptyDictionaryValue(
- const DictionaryValueCallbackWithoutStatus& callback) const {
- base::DictionaryValue dictionary;
- callback.Run(dictionary);
+ShillProfileClient::TestInterface* ShillProfileClientStub::GetTestInterface() {
+ return this;
+}
+
+void ShillProfileClientStub::AddProfile(const std::string& profile_path) {
+ profile_entries_.SetWithoutPathExpansion(profile_path,
+ new base::DictionaryValue);
+}
+
+void ShillProfileClientStub::AddEntry(const std::string& profile_path,
+ const std::string& entry_path,
+ const base::DictionaryValue& properties) {
+ base::DictionaryValue* profile = GetOrCreateDictionary(profile_path,
+ &profile_entries_);
+ profile->SetWithoutPathExpansion(entry_path,
+ properties.DeepCopy());
+}
+
+bool ShillProfileClientStub::AddService(const std::string& service_path) {
+ ShillServiceClient::TestInterface* service_test =
+ DBusThreadManager::Get()->GetShillServiceClient()->GetTestInterface();
+ const base::DictionaryValue* properties =
+ service_test->GetServiceProperties(service_path);
+ std::string profile_path;
+ if (!properties)
+ return false;
+
+ properties->GetStringWithoutPathExpansion(flimflam::kProfileProperty,
+ &profile_path);
+ if (profile_path.empty())
+ return false;
+
+ AddEntry(profile_path, service_path, *properties);
+ return true;
+}
+
+base::DictionaryValue* ShillProfileClientStub::GetProfile(
+ const dbus::ObjectPath& profile_path,
+ const ErrorCallback& error_callback) {
+ base::DictionaryValue* profile = NULL;
+ profile_entries_.GetDictionaryWithoutPathExpansion(profile_path.value(),
+ &profile);
+ if (!profile)
+ error_callback.Run("Error.InvalidProfile", "Invalid profile");
+ return profile;
}
} // namespace chromeos