[cros] Change Store/RetrievePolicy to use a GArray
It seems that sending protobufs as 'strings' works fine with the C
dbus-glib bindings, but not with the dbus-python bindings. The
signatures of these DBus methods has changed, so change libcros to
keep pace.
BUG=13249
TEST=manual, using login_drive
Change-Id: Id00a2c8c1c5537bf0afbc5a3eeafb38ef1f3ac06
Review URL: http://codereview.chromium.org/6772019
diff --git a/chromeos_cros_api.h b/chromeos_cros_api.h
index a44bd06..4cfc211 100644
--- a/chromeos_cros_api.h
+++ b/chromeos_cros_api.h
@@ -205,12 +205,13 @@
// 120: Added RequestVirtualNetwork to chromeos_network.
// 121: Added MonitorSMS and DisconnectSMSMonitor
// 122: Removed GetCurrentInputMethod.
+// 123: Change Store/RetrievePolicy to use byte arrays underneath the hood.
namespace chromeos { // NOLINT
enum CrosAPIVersion {
kCrosAPIMinVersion = 110,
- kCrosAPIVersion = 122
+ kCrosAPIVersion = 123
};
// Default path to pass to LoadCros: "/opt/google/chrome/chromeos/libcros.so"
diff --git a/chromeos_login.cc b/chromeos_login.cc
index 201eac9..a366b09 100644
--- a/chromeos_login.cc
+++ b/chromeos_login.cc
@@ -229,6 +229,8 @@
if (!ChromeOSLoginHelpers::RetrievePropertyHelper(name, &value, &sig))
return false;
*OUT_property = ChromeOSLoginHelpers::CreateProperty(name, value, sig);
+ g_array_free(sig, false);
+ g_free(value);
return true;
}
@@ -463,18 +465,22 @@
reinterpret_cast<CallbackData<RetrievePolicyCallback>*>(user_data);
DCHECK(cb_data);
glib::ScopedError error;
- gchar* policy_blob = NULL;
+ GArray* policy_blob = NULL;
if (!::dbus_g_proxy_end_call(gproxy,
call_id,
&Resetter(&error).lvalue(),
- G_TYPE_STRING, &policy_blob,
+ DBUS_TYPE_G_UCHAR_ARRAY, &policy_blob,
G_TYPE_INVALID)) {
LOG(ERROR) << login_manager::kSessionManagerRetrievePolicy
<< " failed: " << SCOPED_SAFE_MESSAGE(error);
}
- cb_data->callback(cb_data->object, policy_blob);
- if (policy_blob)
- g_free(policy_blob);
+ if (policy_blob) {
+ std::string policy(policy_blob->data, policy_blob->len);
+ cb_data->callback(cb_data->object, policy.c_str());
+ g_array_free(policy_blob, TRUE);
+ } else {
+ cb_data->callback(cb_data->object, NULL);
+ }
}
extern "C"
@@ -519,22 +525,27 @@
void ChromeOSStorePolicy(const char* prop,
StorePolicyCallback callback,
void* delegate) {
+ DCHECK(prop);
DCHECK(delegate);
CallbackData<StorePolicyCallback>* cb_data =
new CallbackData<StorePolicyCallback>(callback, delegate);
+ GArray* policy = g_array_new(FALSE, FALSE, 1);
+ policy->data = const_cast<gchar*>(prop); // This just gets copied below.
+ policy->len = strlen(prop);
DBusGProxyCall* call_id =
::dbus_g_proxy_begin_call(cb_data->proxy.gproxy(),
login_manager::kSessionManagerStorePolicy,
&StorePolicyNotify,
cb_data,
&DeleteCallbackData<StorePolicyCallback>,
- G_TYPE_STRING, prop,
+ DBUS_TYPE_G_UCHAR_ARRAY, policy,
G_TYPE_INVALID);
if (!call_id) {
LOG(ERROR) << "StorePolicy async call failed";
delete cb_data;
callback(delegate, false);
}
+ g_array_free(policy, FALSE);
}
} // namespace chromeos