From 66b8c501b5e09539fd6d0dc8bd52782ed91f8adc Mon Sep 17 00:00:00 2001 From: Amarnath Valluri Date: Tue, 15 Oct 2013 11:46:22 +0300 Subject: [PATCH] Using D-Bus properties for Service object --- common/org.tizen.messageport.Service.xml | 7 +- daemon/dbus-service.c | 45 ++----------- lib/message-port.c | 5 +- lib/msgport-manager.c | 41 ++++++------ lib/msgport-service.c | 106 +++++++++++++------------------ lib/msgport-service.h | 2 +- lib/msgport-utils.c | 20 ++++++ lib/msgport-utils.h | 5 +- 8 files changed, 103 insertions(+), 128 deletions(-) diff --git a/common/org.tizen.messageport.Service.xml b/common/org.tizen.messageport.Service.xml index 0457af4..a6b91a0 100644 --- a/common/org.tizen.messageport.Service.xml +++ b/common/org.tizen.messageport.Service.xml @@ -1,9 +1,9 @@ - - - + + + @@ -15,5 +15,6 @@ + diff --git a/daemon/dbus-service.c b/daemon/dbus-service.c index 6fef244..8b20048 100644 --- a/daemon/dbus-service.c +++ b/daemon/dbus-service.c @@ -114,43 +114,6 @@ _dbus_service_handle_unregister ( return TRUE; } -static GVariant * -_msgport_service_to_variant (MsgPortDbusService *service) -{ - GVariantBuilder v_builder; - g_return_val_if_fail (service && MSGPORT_IS_DBUS_SERVICE (service), NULL); - - g_variant_builder_init (&v_builder, G_VARIANT_TYPE_VARDICT); - - g_variant_builder_add (&v_builder, "{sv}", "Id", - g_variant_new_int32 (service->priv->id)); - g_variant_builder_add (&v_builder, "{sv}", "AappId", - g_variant_new_string (msgport_dbus_manager_get_app_id - (service->priv->owner))); - g_variant_builder_add (&v_builder, "{sv}", "PortName", - g_variant_new_string (service->priv->port_name)); - g_variant_builder_add (&v_builder, "{sv}", "IsTrusted", - g_variant_new_boolean (service->priv->is_trusted)); - - return g_variant_builder_end (&v_builder); -} - -static gboolean -_dbus_service_handle_get_properties ( - MsgPortDbusService *dbus_service, - GDBusMethodInvocation *invocation, - gpointer userdata) -{ - g_return_val_if_fail (dbus_service && MSGPORT_IS_DBUS_SERVICE (dbus_service), FALSE); - - msgport_dbus_glue_service_complete_get_properties ( - dbus_service->priv->dbus_skeleton, - invocation, - _msgport_service_to_variant (dbus_service)); - - return TRUE; -} - static void msgport_dbus_service_init (MsgPortDbusService *self) { @@ -165,8 +128,6 @@ msgport_dbus_service_init (MsgPortDbusService *self) G_CALLBACK (_dbus_service_handle_send_message), (gpointer)self); g_signal_connect_swapped (priv->dbus_skeleton, "handle-unregister", G_CALLBACK (_dbus_service_handle_unregister), (gpointer)self); - g_signal_connect_swapped (priv->dbus_skeleton, "handle-get-properties", - G_CALLBACK (_dbus_service_handle_get_properties), (gpointer)self); self->priv = priv; } @@ -222,6 +183,12 @@ msgport_dbus_service_new (MsgPortDbusManager *owner, const gchar *name, gboolean } g_free (object_path); + /* set dbus-properties */ + g_object_set (G_OBJECT (dbus_service->priv->dbus_skeleton), + "id", dbus_service->priv->id, + "port-name", dbus_service->priv->port_name, + "is-trusted", dbus_service->priv->is_trusted, NULL); + ++object_conter; return dbus_service; diff --git a/lib/message-port.c b/lib/message-port.c index 0dac6ad..32f1496 100644 --- a/lib/message-port.c +++ b/lib/message-port.c @@ -10,6 +10,9 @@ _messageport_register_port (const char *name, gboolean is_trusted, messageport_m messageport_error_e res; MsgPortManager *manager = msgport_get_manager (); + g_assert (manager); + g_assert (MSGPORT_IS_MANAGER (manager)); + res = msgport_manager_register_service (manager, name, is_trusted, cb, &port_id); return port_id > 0 ? port_id : (int)res; @@ -25,7 +28,7 @@ _messageport_check_remote_port (const char *app_id, const char *port, gboolean i if (exists) *exists = (res == MESSAGEPORT_ERROR_NONE); - return (int) res; + return res; } static messageport_error_e diff --git a/lib/msgport-manager.c b/lib/msgport-manager.c index e073c2d..bc4a0c2 100644 --- a/lib/msgport-manager.c +++ b/lib/msgport-manager.c @@ -1,6 +1,6 @@ #include "msgport-manager.h" #include "msgport-service.h" -#include "message-port.h" /* MESSAGEPORT_ERROR */ +#include "message-port.h" /* messageport_error_e */ #include "common/dbus-manager-glue.h" #include "common/log.h" #include "config.h" /* MESSAGEPORT_BUS_ADDRESS */ @@ -132,24 +132,6 @@ _create_and_cache_service (MsgPortManager *manager, gchar *object_path, messagep return id; } -static MsgPortService * -_get_local_port (MsgPortManager *manager, int service_id) -{ - const gchar *object_path = NULL; - MsgPortService *service = NULL; - - object_path = g_hash_table_lookup (manager->local_services, GINT_TO_POINTER(service_id)); - if (!object_path) return NULL; - - service = MSGPORT_SERVICE (g_hash_table_lookup (manager->services, object_path)); - if (!service) { - g_hash_table_remove (manager->local_services, GINT_TO_POINTER (service_id)); - return NULL; - } - - return service; -} - messageport_error_e msgport_manager_register_service (MsgPortManager *manager, const gchar *port_name, gboolean is_trusted, messageport_message_cb message_cb, int *service_id) { @@ -165,8 +147,9 @@ msgport_manager_register_service (MsgPortManager *manager, const gchar *port_nam if (error) { WARN ("unable to register service (%s): %s", port_name, error->message); + messageport_error_e res = msgport_daemon_error_to_error(error); g_error_free (error); - return MESSAGEPORT_ERROR_IO_ERROR; + return res; } *service_id = _create_and_cache_service (manager, object_path, message_cb); @@ -174,6 +157,24 @@ msgport_manager_register_service (MsgPortManager *manager, const gchar *port_nam return MESSAGEPORT_ERROR_NONE; } +static MsgPortService * +_get_local_port (MsgPortManager *manager, int service_id) +{ + const gchar *object_path = NULL; + MsgPortService *service = NULL; + + object_path = g_hash_table_lookup (manager->local_services, GINT_TO_POINTER(service_id)); + if (!object_path) return NULL; + + service = MSGPORT_SERVICE (g_hash_table_lookup (manager->services, object_path)); + if (!service) { + g_hash_table_remove (manager->local_services, GINT_TO_POINTER (service_id)); + return NULL; + } + + return service; +} + messageport_error_e msgport_manager_unregister_servcie (MsgPortManager *manager, int service_id) { diff --git a/lib/msgport-service.c b/lib/msgport-service.c index 0f370c7..db698b3 100644 --- a/lib/msgport-service.c +++ b/lib/msgport-service.c @@ -10,30 +10,13 @@ struct _MsgPortService GObject parent; MsgPortDbusGlueService *proxy; - - int id; /* unique service id */ - gchar *name; /* service name */ - gboolean is_trusted; /* is trusted service */ - - guint on_messge_signal_id; - messageport_message_cb client_cb; + guint on_messge_signal_id; + messageport_message_cb client_cb; }; -static int __object_counter; - G_DEFINE_TYPE(MsgPortService, msgport_service, G_TYPE_OBJECT) static void -_service_finalize (GObject *self) -{ - MsgPortService *service = MSGPORT_SERVICE (self); - - g_free (service->name); - - G_OBJECT_CLASS (msgport_service_parent_class)->finalize (self); -} - -static void _service_dispose (GObject *self) { MsgPortService *service = MSGPORT_SERVICE (self); @@ -49,16 +32,12 @@ msgport_service_class_init (MsgPortServiceClass *klass) GObjectClass *g_klass = G_OBJECT_CLASS(klass); g_klass->dispose = _service_dispose; - g_klass->finalize = _service_finalize; } static void msgport_service_init (MsgPortService *service) { service->proxy = NULL; - service->id = 0; - service->name = NULL; - service->is_trusted = FALSE; service->client_cb = NULL; service->on_messge_signal_id = 0; } @@ -66,12 +45,14 @@ msgport_service_init (MsgPortService *service) static void _on_got_message (MsgPortService *service, GVariant *data, const gchar *remote_app_id, const gchar *remote_port, gboolean remote_is_trusted, gpointer userdata) { +#ifdef ENABLE_DEBUG gchar *str_data = g_variant_print (data, TRUE); - DBG ("Message received : %s(%d)", str_data, g_variant_n_children (data)); + DBG ("Message received : %s(%"G_GSIZE_FORMAT")", str_data, g_variant_n_children (data)); g_free (str_data); +#endif bundle *b = bundle_from_variant_map (data); - service->client_cb (service->id, remote_app_id, remote_port, remote_is_trusted, b); + service->client_cb (msgport_dbus_glue_service_get_id (service->proxy), remote_app_id, remote_port, remote_is_trusted, b); bundle_free (b); } @@ -79,19 +60,16 @@ _on_got_message (MsgPortService *service, GVariant *data, const gchar *remote_ap MsgPortService * msgport_service_new (GDBusConnection *connection, const gchar *path, messageport_message_cb message_cb) { - GVariant *properties = NULL; - GVariantIter iter; + //GVariant *v_prop = NULL; GError *error = NULL; - MsgPortService *service = g_object_new (MSGPORT_TYPE_SERVICE, NULL); + MsgPortService *service = g_object_new (MSGPORT_TYPE_SERVICE, NULL); if (!service) { - /* FIXME: return no merory error */ return NULL; } service->proxy = msgport_dbus_glue_service_proxy_new_sync (connection, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, - NULL, path, NULL, &error); + G_DBUS_PROXY_FLAGS_NONE, NULL, path, NULL, &error); if (!service->proxy) { g_object_unref (service); WARN ("failed create servie proxy for path '%s' : %s", path, @@ -99,60 +77,62 @@ msgport_service_new (GDBusConnection *connection, const gchar *path, messageport g_error_free (error); return NULL; } - - service->id = ++__object_counter; - - if (msgport_dbus_glue_service_call_get_properties_sync (service->proxy, &properties, NULL, &error)) { - gchar *key = NULL; - GVariant *value = NULL; - g_variant_iter_init (&iter, properties); - - while (g_variant_iter_next (&iter, "{sv}", &key, &value)) { - if ( !g_strcmp0 (key, "PortName")) service->name = g_strdup (g_variant_get_string (value, NULL)); - else if ( !g_strcmp0 (key, "IsTrusted")) service->is_trusted = g_variant_get_boolean (value); - else { - WARN ("Unknown property : %s", key); - } - - g_free (key); - g_variant_unref (value); - } +#if 0 + v_prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (service->proxy), "Id"); + if (v_prop) { + service->id = g_variant_get_uint32 (v_prop); + g_variant_unref (v_prop); + } else { + WARN ("Could not load property name 'Id' of service '%s'", path); } - else { - WARN ("Failed to get properties from service proxy '%s' : %s", - path, error->message); - g_error_free (error); + + v_prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (service->proxy), "PortName"); + if (v_prop) { + service->name = g_strdup (g_variant_get_string (v_prop, NULL)); + g_variant_unref (v_prop); + } else { + WARN ("Could not load property name 'PortName' of service '%s'", path); } + v_prop = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (service->proxy), "IsTrusted"); + if (v_prop) { + service->is_trusted = g_variant_get_boolean (v_prop); + g_object_unref (v_prop); + } else { + WARN ("Could not load property name 'IsTrusted' of service '%s'", path); + } +#endif service->client_cb = message_cb; service->on_messge_signal_id = g_signal_connect_swapped (service->proxy, "on-message", G_CALLBACK (_on_got_message), service); return service; } +guint +msgport_service_id (MsgPortService *service) +{ + g_return_val_if_fail (service && MSGPORT_IS_SERVICE (service), 0); + g_return_val_if_fail (service->proxy && MSGPORT_DBUS_GLUE_IS_SERVICE (service->proxy), 0); + + return msgport_dbus_glue_service_get_id (service->proxy); +} const gchar * msgport_service_name (MsgPortService *service) { g_return_val_if_fail (service && MSGPORT_IS_SERVICE (service), NULL); + g_return_val_if_fail (service->proxy && MSGPORT_DBUS_GLUE_IS_SERVICE (service->proxy), NULL); - return service->name; + return msgport_dbus_glue_service_get_port_name (service->proxy); } gboolean msgport_service_is_trusted (MsgPortService *service) { g_return_val_if_fail (service && MSGPORT_IS_SERVICE (service), FALSE); + g_return_val_if_fail (service->proxy && MSGPORT_DBUS_GLUE_IS_SERVICE (service->proxy), FALSE); - return service->is_trusted; -} - -int -msgport_service_id (MsgPortService *service) -{ - g_return_val_if_fail (service && MSGPORT_IS_SERVICE (service), 0); - - return service->id; + return msgport_dbus_glue_service_get_is_trusted (service->proxy); } gboolean diff --git a/lib/msgport-service.h b/lib/msgport-service.h index aac8266..d9791d1 100644 --- a/lib/msgport-service.h +++ b/lib/msgport-service.h @@ -33,7 +33,7 @@ msgport_service_name (MsgPortService *service); gboolean msgport_service_is_trusted (MsgPortService *service); -int +guint msgport_service_id (MsgPortService *service); gboolean diff --git a/lib/msgport-utils.c b/lib/msgport-utils.c index 758dcb1..7c87f2d 100644 --- a/lib/msgport-utils.c +++ b/lib/msgport-utils.c @@ -1,4 +1,5 @@ #include "msgport-utils.h" +#include "common/dbus-error.h" /* MsgPortError */ #include "common/log.h" static void @@ -51,3 +52,22 @@ bundle * bundle_from_variant_map (GVariant *v_data) return b; } +messageport_error_e +msgport_daemon_error_to_error (const GError *error) +{ + if (!error) return MESSAGEPORT_ERROR_NONE; + + switch (error->code) { + case MSGPORT_ERROR_OUT_OF_MEMORY: + return MESSAGEPORT_ERROR_OUT_OF_MEMORY; + case MSGPORT_ERROR_NOT_FOUND: + return MESSAGEPORT_ERROR_MESSAGEPORT_NOT_FOUND; + case MSGPORT_ERROR_INVALID_PARAMS: + return MESSAGEPORT_ERROR_INVALID_PARAMETER; + case MSGPORT_ERROR_CERTIFICATE_MISMATCH: + return MESSAGEPORT_ERROR_CERTIFICATE_NOT_MATCH; + case MSGPORT_ERROR_UNKNOWN: + case MSGPORT_ERROR_IO_ERROR: + return MESSAGEPORT_ERROR_IO_ERROR; + } +} diff --git a/lib/msgport-utils.h b/lib/msgport-utils.h index b1f681e..4ee9321 100644 --- a/lib/msgport-utils.h +++ b/lib/msgport-utils.h @@ -1,10 +1,13 @@ #ifndef __MSGPORT_UTILS_H -#define __MSGPORT_UTILS_ +#define __MSGPORT_UTILS_H #include #include +#include GVariant *bundle_to_variant_map (bundle *b); bundle *bundle_from_variant_map (GVariant *v); +messageport_error_e msgport_daemon_error_to_error (const GError *error); + #endif /* __MSGPORT_UTILS_H */ -- 2.7.4