buffet: Restructure buffet_client.cc
This makes it more obvious at a glance what magic strings correspond to
commands and moves the argument parsing into each method. It also stops
us from passing the Bus around by making it a class variable.
BUG=None
TEST=buffet_client TestMethod and UpdateState still work.
Change-Id: I36fad6ea69320aba5c98a21f85fa90b872dc7519
Reviewed-on: https://chromium-review.googlesource.com/198927
Tested-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Chris Sosa <sosa@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Christopher Wiley <wiley@chromium.org>
diff --git a/buffet/buffet_client.cc b/buffet/buffet_client.cc
index f351040..16bbbb2 100644
--- a/buffet/buffet_client.cc
+++ b/buffet/buffet_client.cc
@@ -4,15 +4,16 @@
#include <iostream>
#include <string>
+#include <sysexits.h>
#include <base/command_line.h>
#include <base/logging.h>
+#include <base/memory/ref_counted.h>
#include <base/memory/scoped_ptr.h>
#include <base/values.h>
#include <dbus/bus.h>
-#include <dbus/object_proxy.h>
#include <dbus/message.h>
-#include <sysexits.h>
+#include <dbus/object_proxy.h>
#include <dbus/values_util.h>
#include "buffet/dbus_constants.h"
@@ -23,158 +24,6 @@
namespace {
static const int default_timeout_ms = 1000;
-dbus::ObjectProxy* GetBuffetDBusProxy(dbus::Bus *bus,
- const std::string& object_path) {
- return bus->GetObjectProxy(
- buffet::dbus_constants::kServiceName,
- dbus::ObjectPath(object_path));
-}
-
-bool CallTestMethod(dbus::ObjectProxy* proxy) {
- dbus::MethodCall method_call(buffet::dbus_constants::kManagerInterface,
- buffet::dbus_constants::kManagerTestMethod);
- scoped_ptr<dbus::Response> response(
- proxy->CallMethodAndBlock(&method_call, default_timeout_ms));
- if (!response) {
- std::cout << "Failed to receive a response." << std::endl;
- return false;
- }
- std::cout << "Received a response." << std::endl;
- return true;
-}
-
-bool CallManagerCheckDeviceRegistered(dbus::ObjectProxy* proxy) {
- dbus::MethodCall method_call(
- buffet::dbus_constants::kManagerInterface,
- buffet::dbus_constants::kManagerCheckDeviceRegistered);
-
- scoped_ptr<dbus::Response> response(
- proxy->CallMethodAndBlock(&method_call, default_timeout_ms));
- if (!response) {
- std::cout << "Failed to receive a response." << std::endl;
- return false;
- }
-
- dbus::MessageReader reader(response.get());
- std::string device_id;
- if (!reader.PopString(&device_id)) {
- std::cout << "No device ID in response." << std::endl;
- return false;
- }
-
- std::cout << "Device ID: "
- << (device_id.empty() ? std::string("<unregistered>") : device_id)
- << std::endl;
- return true;
-}
-
-bool CallManagerGetDeviceInfo(dbus::ObjectProxy* proxy) {
- dbus::MethodCall method_call(
- buffet::dbus_constants::kManagerInterface,
- buffet::dbus_constants::kManagerGetDeviceInfo);
-
- scoped_ptr<dbus::Response> response(
- proxy->CallMethodAndBlock(&method_call, default_timeout_ms));
- if (!response) {
- std::cout << "Failed to receive a response." << std::endl;
- return false;
- }
-
- dbus::MessageReader reader(response.get());
- std::string device_info;
- if (!reader.PopString(&device_info)) {
- std::cout << "No device info in response." << std::endl;
- return false;
- }
-
- std::cout << "Device Info: "
- << (device_info.empty() ? std::string("<unregistered>") : device_info)
- << std::endl;
- return true;
-}
-
-bool CallManagerStartRegisterDevice(
- dbus::ObjectProxy* proxy,
- const std::map<std::string, std::shared_ptr<base::Value>>& params) {
- dbus::MethodCall method_call(
- buffet::dbus_constants::kManagerInterface,
- buffet::dbus_constants::kManagerStartRegisterDevice);
- dbus::MessageWriter writer(&method_call);
- dbus::MessageWriter dict_writer(nullptr);
- writer.OpenArray("{sv}", &dict_writer);
- for (auto&& pair : params) {
- dbus::MessageWriter dict_entry_writer(nullptr);
- dict_writer.OpenDictEntry(&dict_entry_writer);
- dict_entry_writer.AppendString(pair.first);
- dbus::AppendBasicTypeValueDataAsVariant(&dict_entry_writer,
- *pair.second.get());
- dict_writer.CloseContainer(&dict_entry_writer);
- }
- writer.CloseContainer(&dict_writer);
-
- static const int timeout_ms = 3000;
- scoped_ptr<dbus::Response> response(
- proxy->CallMethodAndBlock(&method_call, timeout_ms));
- if (!response) {
- std::cout << "Failed to receive a response." << std::endl;
- return false;
- }
-
- dbus::MessageReader reader(response.get());
- std::string info;
- if (!reader.PopString(&info)) {
- std::cout << "No valid response." << std::endl;
- return false;
- }
-
- std::cout << "Registration started: " << info << std::endl;
- return true;
-}
-
-bool CallManagerFinishRegisterDevice(dbus::ObjectProxy* proxy,
- const std::string& user_auth_code) {
- dbus::MethodCall method_call(
- buffet::dbus_constants::kManagerInterface,
- buffet::dbus_constants::kManagerFinishRegisterDevice);
- dbus::MessageWriter writer(&method_call);
- writer.AppendString(user_auth_code);
- static const int timeout_ms = 10000;
- scoped_ptr<dbus::Response> response(
- proxy->CallMethodAndBlock(&method_call, timeout_ms));
- if (!response) {
- std::cout << "Failed to receive a response." << std::endl;
- return false;
- }
-
- dbus::MessageReader reader(response.get());
- std::string device_id;
- if (!reader.PopString(&device_id)) {
- std::cout << "No device ID in response." << std::endl;
- return false;
- }
-
- std::cout << "Device ID is "
- << (device_id.empty() ? std::string("<unregistered>") : device_id)
- << std::endl;
- return true;
-}
-
-bool CallManagerUpdateState(dbus::ObjectProxy* proxy,
- const std::string& json_blob) {
- dbus::MethodCall method_call(
- buffet::dbus_constants::kManagerInterface,
- buffet::dbus_constants::kManagerUpdateStateMethod);
- dbus::MessageWriter writer(&method_call);
- writer.AppendString(json_blob);
- scoped_ptr<dbus::Response> response(
- proxy->CallMethodAndBlock(&method_call, default_timeout_ms));
- if (!response) {
- std::cout << "Failed to receive a response." << std::endl;
- return false;
- }
- return true;
-}
-
void usage() {
std::cerr << "Possible commands:" << std::endl;
std::cerr << " " << kManagerTestMethod << std::endl;
@@ -187,62 +36,97 @@
std::cerr << " " << kManagerUpdateStateMethod << std::endl;
}
-} // namespace
-
-int main(int argc, char** argv) {
- CommandLine::Init(argc, argv);
- CommandLine* cl = CommandLine::ForCurrentProcess();
-
- dbus::Bus::Options options;
- options.bus_type = dbus::Bus::SYSTEM;
- scoped_refptr<dbus::Bus> bus(new dbus::Bus(options));
-
- CommandLine::StringVector args = cl->GetArgs();
- if (args.empty()) {
- usage();
- return EX_USAGE;
+class BuffetHelperProxy {
+ public:
+ int Init() {
+ dbus::Bus::Options options;
+ options.bus_type = dbus::Bus::SYSTEM;
+ bus_ = new dbus::Bus(options);
+ manager_proxy_ = bus_->GetObjectProxy(
+ kServiceName,
+ dbus::ObjectPath(kManagerServicePath));
+ return EX_OK;
}
- // Pop the command off of the args list.
- std::string command = args.front();
- args.erase(args.begin());
- bool success = false;
- if (command.compare(kManagerTestMethod) == 0) {
- auto proxy = GetBuffetDBusProxy(
- bus, buffet::dbus_constants::kManagerServicePath);
- success = CallTestMethod(proxy);
- } else if (command.compare(kManagerCheckDeviceRegistered) == 0 ||
- command.compare("cr") == 0) {
+ int CallTestMethod(const CommandLine::StringVector& args) {
+ dbus::MethodCall method_call(kManagerInterface, kManagerTestMethod);
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+ std::cout << "Received a response." << std::endl;
+ return EX_OK;
+ }
+
+ int CallManagerCheckDeviceRegistered(const CommandLine::StringVector& args) {
if (!args.empty()) {
std::cerr << "Invalid number of arguments for "
- << "Manager." << kManagerCheckDeviceRegistered << std::endl;
+ << "Manager." << kManagerCheckDeviceRegistered << std::endl;
usage();
return EX_USAGE;
}
- auto proxy = GetBuffetDBusProxy(
- bus, buffet::dbus_constants::kManagerServicePath);
- success = CallManagerCheckDeviceRegistered(proxy);
- } else if (command.compare(kManagerGetDeviceInfo) == 0 ||
- command.compare("di") == 0) {
+ dbus::MethodCall method_call(
+ kManagerInterface, kManagerCheckDeviceRegistered);
+
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+
+ dbus::MessageReader reader(response.get());
+ std::string device_id;
+ if (!reader.PopString(&device_id)) {
+ std::cout << "No device ID in response." << std::endl;
+ return EX_SOFTWARE;
+ }
+
+ std::cout << "Device ID: "
+ << (device_id.empty() ? std::string("<unregistered>") : device_id)
+ << std::endl;
+ return EX_OK;
+ }
+
+ int CallManagerGetDeviceInfo(const CommandLine::StringVector& args) {
if (!args.empty()) {
std::cerr << "Invalid number of arguments for "
- << "Manager." << kManagerGetDeviceInfo << std::endl;
+ << "Manager." << kManagerGetDeviceInfo << std::endl;
usage();
return EX_USAGE;
}
- auto proxy = GetBuffetDBusProxy(
- bus, buffet::dbus_constants::kManagerServicePath);
- success = CallManagerGetDeviceInfo(proxy);
- } else if (command.compare(kManagerStartRegisterDevice) == 0 ||
- command.compare("sr") == 0) {
+ dbus::MethodCall method_call(
+ kManagerInterface, kManagerGetDeviceInfo);
+
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+
+ dbus::MessageReader reader(response.get());
+ std::string device_info;
+ if (!reader.PopString(&device_info)) {
+ std::cout << "No device info in response." << std::endl;
+ return EX_SOFTWARE;
+ }
+
+ std::cout << "Device Info: "
+ << (device_info.empty() ? std::string("<unregistered>") : device_info)
+ << std::endl;
+ return EX_OK;
+ }
+
+ int CallManagerStartRegisterDevice(const CommandLine::StringVector& args) {
if (args.size() > 1) {
std::cerr << "Invalid number of arguments for "
<< "Manager." << kManagerStartRegisterDevice << std::endl;
usage();
return EX_USAGE;
}
- auto proxy = GetBuffetDBusProxy(
- bus, buffet::dbus_constants::kManagerServicePath);
std::map<std::string, std::shared_ptr<base::Value>> params;
if (!args.empty()) {
@@ -254,42 +138,147 @@
}
}
- success = CallManagerStartRegisterDevice(proxy, params);
- } else if (command.compare(kManagerFinishRegisterDevice) == 0 ||
- command.compare("fr") == 0) {
+ dbus::MethodCall method_call(
+ kManagerInterface, kManagerStartRegisterDevice);
+ dbus::MessageWriter writer(&method_call);
+ dbus::MessageWriter dict_writer(nullptr);
+ writer.OpenArray("{sv}", &dict_writer);
+ for (auto&& pair : params) {
+ dbus::MessageWriter dict_entry_writer(nullptr);
+ dict_writer.OpenDictEntry(&dict_entry_writer);
+ dict_entry_writer.AppendString(pair.first);
+ dbus::AppendBasicTypeValueDataAsVariant(&dict_entry_writer,
+ *pair.second.get());
+ dict_writer.CloseContainer(&dict_entry_writer);
+ }
+ writer.CloseContainer(&dict_writer);
+
+ static const int timeout_ms = 3000;
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+
+ dbus::MessageReader reader(response.get());
+ std::string info;
+ if (!reader.PopString(&info)) {
+ std::cout << "No valid response." << std::endl;
+ return EX_SOFTWARE;
+ }
+
+ std::cout << "Registration started: " << info << std::endl;
+ return EX_OK;
+ }
+
+ int CallManagerFinishRegisterDevice(const CommandLine::StringVector& args) {
if (args.size() > 1) {
std::cerr << "Invalid number of arguments for "
<< "Manager." << kManagerFinishRegisterDevice << std::endl;
usage();
return EX_USAGE;
}
- auto proxy = GetBuffetDBusProxy(
- bus, buffet::dbus_constants::kManagerServicePath);
- success = CallManagerFinishRegisterDevice(
- proxy, !args.empty() ? args.front() : std::string());
- } else if (command.compare(kManagerUpdateStateMethod) == 0 ||
- command.compare("us") == 0) {
+ dbus::MethodCall method_call(
+ kManagerInterface, kManagerFinishRegisterDevice);
+ dbus::MessageWriter writer(&method_call);
+ std::string user_auth_code;
+ if (!args.empty()) { user_auth_code = args.front(); }
+ writer.AppendString(user_auth_code);
+ static const int timeout_ms = 10000;
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+
+ dbus::MessageReader reader(response.get());
+ std::string device_id;
+ if (!reader.PopString(&device_id)) {
+ std::cout << "No device ID in response." << std::endl;
+ return EX_SOFTWARE;
+ }
+
+ std::cout << "Device ID is "
+ << (device_id.empty() ? std::string("<unregistered>") : device_id)
+ << std::endl;
+ return EX_OK;
+ }
+
+ int CallManagerUpdateState(const CommandLine::StringVector& args) {
if (args.size() != 1) {
std::cerr << "Invalid number of arguments for "
<< "Manager." << kManagerUpdateStateMethod << std::endl;
usage();
return EX_USAGE;
}
- auto proxy = GetBuffetDBusProxy(
- bus, buffet::dbus_constants::kManagerServicePath);
- success = CallManagerUpdateState(proxy, args.front());
- } else {
- std::cerr << "Unknown command: " << command << std::endl;
+ dbus::MethodCall method_call(
+ kManagerInterface, kManagerUpdateStateMethod);
+ dbus::MessageWriter writer(&method_call);
+ writer.AppendString(args.front());
+ scoped_ptr<dbus::Response> response(
+ manager_proxy_->CallMethodAndBlock(&method_call, default_timeout_ms));
+ if (!response) {
+ std::cout << "Failed to receive a response." << std::endl;
+ return EX_UNAVAILABLE;
+ }
+ return EX_OK;
+ }
+
+ private:
+ scoped_refptr<dbus::Bus> bus_;
+ dbus::ObjectProxy* manager_proxy_{nullptr};
+};
+
+} // namespace
+
+int main(int argc, char** argv) {
+ CommandLine::Init(argc, argv);
+ CommandLine* cl = CommandLine::ForCurrentProcess();
+ CommandLine::StringVector args = cl->GetArgs();
+ if (args.empty()) {
usage();
return EX_USAGE;
}
- if (success) {
- std::cout << "Done." << std::endl;
- return EX_OK;
+ // Pop the command off of the args list.
+ std::string command = args.front();
+ args.erase(args.begin());
+ int err = EX_USAGE;
+ BuffetHelperProxy helper;
+ err = helper.Init();
+ if (err) {
+ std::cerr << "Error initializing proxies." << std::endl;
+ return err;
}
- std::cerr << "Done, with errors." << std::endl;
- return 1;
-}
+ if (command.compare(kManagerTestMethod) == 0) {
+ err = helper.CallTestMethod(args);
+ } else if (command.compare(kManagerCheckDeviceRegistered) == 0 ||
+ command.compare("cr") == 0) {
+ err = helper.CallManagerCheckDeviceRegistered(args);
+ } else if (command.compare(kManagerGetDeviceInfo) == 0 ||
+ command.compare("di") == 0) {
+ err = helper.CallManagerGetDeviceInfo(args);
+ } else if (command.compare(kManagerStartRegisterDevice) == 0 ||
+ command.compare("sr") == 0) {
+ err = helper.CallManagerStartRegisterDevice(args);
+ } else if (command.compare(kManagerFinishRegisterDevice) == 0 ||
+ command.compare("fr") == 0) {
+ err = helper.CallManagerFinishRegisterDevice(args);
+ } else if (command.compare(kManagerUpdateStateMethod) == 0 ||
+ command.compare("us") == 0) {
+ err = helper.CallManagerUpdateState(args);
+ } else {
+ std::cerr << "Unknown command: " << command << std::endl;
+ usage();
+ }
+ if (err) {
+ std::cerr << "Done, with errors." << std::endl;
+ } else {
+ std::cout << "Done." << std::endl;
+ }
+ return err;
+}