X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fgdbusmethodinvocation.c;h=5bd850b095a4852a07558ebb8d30a6c4f342dafa;hb=51fac05d73f8363de821eb0d6940dedca13a8c0f;hp=ad19d9d09ee3355712f12068835e16b02c54ddd5;hpb=f754c4e85b666686a374aa31f7d05fff739e9cde;p=platform%2Fupstream%2Fglib.git diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c index ad19d9d..5bd850b 100644 --- a/gio/gdbusmethodinvocation.c +++ b/gio/gdbusmethodinvocation.c @@ -13,9 +13,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . * * Author: David Zeuthen */ @@ -274,9 +272,9 @@ g_dbus_method_invocation_get_connection (GDBusMethodInvocation *invocation) * descriptor passing, that cannot be properly expressed in the * #GVariant API. * - * See and for an example of how to use this - * low-level API to send and receive UNIX file descriptors. + * See this [server][gdbus-server] and [client][gdbus-unix-fd-client] + * for an example of how to use this low-level API to send and receive + * UNIX file descriptors. * * Returns: (transfer none): #GDBusMessage. Do not free, it is owned by @invocation. * @@ -418,6 +416,67 @@ g_dbus_method_invocation_return_value_internal (GDBusMethodInvocation *invocatio g_variant_type_free (type); } + /* property_info is only non-NULL if set that way from + * GDBusConnection, so this must be the case of async property + * handling on either 'Get', 'Set' or 'GetAll'. + */ + if (invocation->property_info != NULL) + { + if (g_str_equal (invocation->method_name, "Get")) + { + GVariant *nested; + + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(v)"))) + { + g_warning ("Type of return value for property 'Get' call should be '(v)' but got '%s'", + g_variant_get_type_string (parameters)); + goto out; + } + + /* Go deeper and make sure that the value inside of the + * variant matches the property type. + */ + g_variant_get (parameters, "(v)", &nested); + if (!g_str_equal (g_variant_get_type_string (nested), invocation->property_info->signature)) + { + g_warning ("Value returned from property 'Get' call for '%s' should be '%s' but is '%s'", + invocation->property_info->name, invocation->property_info->signature, + g_variant_get_type_string (nested)); + g_variant_unref (nested); + goto out; + } + g_variant_unref (nested); + } + + else if (g_str_equal (invocation->method_name, "GetAll")) + { + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(a{sv})"))) + { + g_warning ("Type of return value for property 'GetAll' call should be '(a{sv})' but got '%s'", + g_variant_get_type_string (parameters)); + goto out; + } + + /* Could iterate the list of properties and make sure that all + * of them are actually on the interface and with the correct + * types, but let's not do that for now... + */ + } + + else if (g_str_equal (invocation->method_name, "Set")) + { + if (!g_variant_is_of_type (parameters, G_VARIANT_TYPE_UNIT)) + { + g_warning ("Type of return value for property 'Set' call should be '()' but got '%s'", + g_variant_get_type_string (parameters)); + goto out; + } + } + + else + g_assert_not_reached (); + } + if (G_UNLIKELY (_g_dbus_debug_return ())) { _g_dbus_debug_print_lock (); @@ -516,12 +575,11 @@ g_dbus_method_invocation_return_value_with_unix_fd_list (GDBusMethodInvocation * * will be returned on the wire. In a nutshell, if the given error is * registered using g_dbus_error_register_error() the name given * during registration is used. Otherwise, a name of the form - * org.gtk.GDBus.UnmappedGError.Quark... is - * used. This provides transparent mapping of #GError between - * applications using GDBus. + * `org.gtk.GDBus.UnmappedGError.Quark...` is used. This provides + * transparent mapping of #GError between applications using GDBus. * * If you are writing an application intended to be portable, - * always register errors with g_dbus_error_register_error() + * always register errors with g_dbus_error_register_error() * or use g_dbus_method_invocation_return_dbus_error(). * * This method will free @invocation, you cannot use it afterwards.