[go: up one dir, main page]

[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