extern GMainLoop *main_loop;
-/* global list to care resource handle for each client */
-static GSList *uam_dbus_clients;
-static GMutex uam_dbus_clients_mutex;
-
-typedef struct _uam_dbus_client_s {
- gchar *bus_name;
-} uam_dbus_client_s;
-
/* For maintaining Application Sync API call requests */
static GSList *request_list = NULL;
static GDBusConnection *uam_manager_conn;
static guint g_dbus_object_id = 0;
static guint owner_id = 0;
-static guint g_dbus_enabler_object_id = 0;
-static guint enabler_dbus_id = 0;
-static guint owner_sig_id = 0;
-static const gchar uam_enabler_introspection_xml[] =
+static const gchar uam_manager_introspection_xml[] =
"<node name='/net/uamd'>"
-" <interface name='net.uamd.enabler'>"
+" <interface name='net.uamd'>"
" <method name='enable'>"
" <arg type='i' name='enable' direction='in' />"
" <arg type='i' name='result' direction='out' />"
" </method>"
-" </interface>"
-"</node>";
-
-
-static const gchar uam_manager_introspection_xml[] =
-"<node name='/net/uamd'>"
-" <interface name='net.uamd'>"
" <method name='uam_request'>"
" <arg type='i' name='request_function' direction='in' />"
" <arg type='ay' name='input_param1' direction='in' />"
gpointer user_data)
{
FUNC_ENTRY;
+ int result = UAM_ERROR_NONE;
UAM_DBG("Method[%s] Path[%s] Interface[%s]",
method_name, object_path, interface_name);
- if (0 == g_strcmp0(method_name, "uam_request")) {
+ if (0 == g_strcmp0(method_name, "enable")) {
+ int enable = FALSE;
+
+ g_variant_get(parameters, "(i)", &enable);
+ UAM_INFO("Enable ua-manager %s", enable == TRUE ? "enabled" : "disabled");
+ g_dbus_method_invocation_return_value(invocation,
+ g_variant_new("(i)", result));
+
+ } else if (0 == g_strcmp0(method_name, "uam_request")) {
int function;
GVariant *in_param1 = NULL;
GVariant *in_param3 = NULL;
GVariant *in_param4 = NULL;
GArray *out_param1 = NULL;
- int result = 0;
g_variant_get(parameters, "(i@ay@ay@ay@ay)", &function,
&in_param1, &in_param2, &in_param3, &in_param4);
return;
}
-static const GDBusInterfaceVTable uam_method_table = {
- __uam_manager_method,
- NULL,
- NULL,
- {0}
-};
-
-static int __uam_comp_bus_name(const void *a, const void *b)
-{
- const uam_dbus_client_s *client = a;
-
- retv_if(NULL == a || NULL == b, -1);
-
- return g_strcmp0(client->bus_name, b);
-}
-
-static inline GSList* __uam_list_find_client(const gchar *owner)
-{
- return g_slist_find_custom(uam_dbus_clients, owner,
- __uam_comp_bus_name);
-}
-
-static void __uamd_dbus_client_cleanup(gpointer data)
-{
- uam_dbus_client_s *client = data;
-
- ret_if(NULL == data);
-
- g_free(client->bus_name);
- client->bus_name = NULL;
- g_free(client);
- client = NULL;
-}
-
-static void __uam_enabler_method(
- GDBusConnection *connection,
- const gchar *sender,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *method_name,
- GVariant *parameters,
- GDBusMethodInvocation *invocation,
- gpointer user_data)
-{
- FUNC_ENTRY;
- int enable = FALSE;
- int result = UAM_ERROR_NONE;
- GSList *list = NULL;
-
- UAM_DBG("Sender[%s] Method[%s] Path[%s] Interface[%s]",
- sender, method_name, object_path, interface_name);
-
- if (0 == g_strcmp0(method_name, "enable")) {
- g_variant_get(parameters, "(i)", &enable);
- if (TRUE == enable) {
-
- UAM_DBG("Enable ua-manager");
-
- list = __uam_list_find_client(sender);
- if (NULL == list) {
- uam_dbus_client_s *client = g_malloc(sizeof(uam_dbus_client_s));
- if (NULL == client) {
- UAM_ERR("Faild to allocate memory");
- /* To-Do clearn up */
- return;
- }
-
- client->bus_name = g_strdup(sender);
-
- g_mutex_lock(&uam_dbus_clients_mutex);
- uam_dbus_clients = g_slist_prepend(uam_dbus_clients, client);
- g_mutex_unlock(&uam_dbus_clients_mutex);
- }
- } else {
- UAM_DBG("Disable ua-manager");
-
- g_mutex_lock(&uam_dbus_clients_mutex);
- list = __uam_list_find_client(sender);
- if (list) {
- /* found bus name in our bus list */
- __uamd_dbus_client_cleanup((gpointer)list->data);
- uam_dbus_clients = g_slist_remove_link(uam_dbus_clients, list);
- }
- g_mutex_unlock(&uam_dbus_clients_mutex);
- }
- g_dbus_method_invocation_return_value(invocation,
- g_variant_new("(i)", result));
- }
- FUNC_EXIT;
- return;
-}
-
-
-static const GDBusInterfaceVTable uam_enaber_method_table = {
- __uam_enabler_method,
- NULL,
- NULL,
- {0}
-};
-
static GDBusNodeInfo *__uam_manager_create_method_node_info(
const gchar *introspection_data)
{
return node_info;
}
-static int __uam_enabler_register_object(
- GDBusConnection *conn, GDBusNodeInfo *node_info)
-{
- FUNC_ENTRY;
- GError *error = NULL;
-
- retv_if(NULL == node_info, UAM_ERROR_INTERNAL);
-
- g_dbus_enabler_object_id = g_dbus_connection_register_object(conn,
- UAM_DAEMON_PATH"/enabler",
- node_info->interfaces[0],
- &uam_enaber_method_table,
- NULL, NULL, &error);
- retv_if(0 == g_dbus_enabler_object_id, UAM_ERROR_INTERNAL);
-
- FUNC_EXIT;
- return UAM_ERROR_NONE;
-}
+static const GDBusInterfaceVTable uam_method_table = {
+ __uam_manager_method,
+ NULL,
+ NULL,
+ {0}
+};
static int __uam_manager_register_object(
GDBusConnection *conn, GDBusNodeInfo *node_info)
g_dbus_object_id = 0;
}
- if (g_dbus_enabler_object_id > 0) {
- g_dbus_connection_unregister_object(
- conn, g_dbus_enabler_object_id);
- g_dbus_enabler_object_id = 0;
- }
-
FUNC_EXIT;
return UAM_ERROR_NONE;
}
-static void __uam_manager_cleanup_requests_from_sender(const char *name)
-{
- GSList *l;
-
- ret_if(NULL == name);
-
- for (l = request_list; l != NULL;) {
- uam_request_context_t *info = l->data;
- l = g_slist_next(l);
- if (NULL == info || NULL == info->sender)
- continue;
-
- if ((strcasecmp(info->sender, name) == 0)) {
- request_list = g_slist_remove(request_list, info);
- g_free(info->sender);
- g_free(info);
- }
- }
-
- /* App terminated, cleanup monitor list */
- _uam_core_cleanup_monitor((char *)name);
-}
-
-static void __uam_manager_name_owner_changed_cb(GDBusConnection *connection,
- const gchar *sender_name,
- const gchar *object_path,
- const gchar *interface_name,
- const gchar *signal_name,
- GVariant *parameters,
- gpointer user_data)
-{
- const char *name = NULL;
- const char *old_owner = NULL;
- const char *new_owner = NULL;
-
- g_variant_get(parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
- if ('\0' == *new_owner) {
- /* Clean up client info */
- _uam_manager_cleanup_client(name);
- }
-}
-
static void __uam_manager_name_acquired_cb(
GDBusConnection *connection, const gchar *name, gpointer user_data)
{
__uam_manager_register_object(connection, node_info);
g_dbus_node_info_unref(node_info);
- /* Subscribe for name owner changed signal */
- owner_sig_id = g_dbus_connection_signal_subscribe(connection,
- UAM_SERVICE_DBUS, UAM_INTERFACE_DBUS,
- NAME_OWNER_CHANGED, NULL, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
- __uam_manager_name_owner_changed_cb, NULL, NULL);
-
- UAM_DBG("owner_sig_id: [%d]", owner_sig_id);
uam_manager_conn = connection;
FUNC_EXIT;
}
-static void __uam_enabler_bus_acquired(
- GDBusConnection *connection, const gchar *name, gpointer user_data)
-{
- GDBusNodeInfo *node_info = NULL;
-
- UAM_INFO("DBus bus acquired");
-
- ret_if(connection == NULL);
-
- node_info = __uam_manager_create_method_node_info(
- uam_enabler_introspection_xml);
- ret_if(node_info == NULL);
-
- __uam_enabler_register_object(connection, node_info);
- g_dbus_node_info_unref(node_info);
-}
-
int _uam_manager_register(void)
{
FUNC_ENTRY;
UAM_DBG("owner_id is [%d]", owner_id);
- /* Get D-Bus owner to activate mesh service daemon */
- enabler_dbus_id = g_bus_own_name(G_BUS_TYPE_SYSTEM,
- UAM_DBUS_NAME".enabler",
- G_BUS_NAME_OWNER_FLAGS_REPLACE,
- __uam_enabler_bus_acquired,
- NULL,
- NULL,
- NULL, NULL);
-
- retv_if(0 == enabler_dbus_id, UAM_ERROR_INTERNAL);
-
FUNC_EXIT;
return UAM_ERROR_NONE;
}
FUNC_ENTRY;
if (uam_manager_conn) {
- if (owner_sig_id > 0) {
- g_dbus_connection_signal_unsubscribe(
- uam_manager_conn, owner_sig_id);
- owner_sig_id = 0;
- }
__uam_manager_unregister_object(uam_manager_conn);
- if (uam_manager_conn) {
- g_object_unref(uam_manager_conn);
- uam_manager_conn = NULL;
- }
+ g_object_unref(uam_manager_conn);
+ uam_manager_conn = NULL;
if (owner_id > 0) {
g_bus_unown_name(owner_id);
owner_id = 0;
}
- if (enabler_dbus_id > 0) {
- g_bus_unown_name(enabler_dbus_id);
- enabler_dbus_id = 0;
- }
}
FUNC_EXIT;
FUNC_EXIT;
}
-void _uam_manager_cleanup_client(const char *name)
-{
- int count = 1;
- GSList *list = NULL;
-
- /* Cleanup all pending request from this sender */
- __uam_manager_cleanup_requests_from_sender(name);
-
- g_mutex_lock(&uam_dbus_clients_mutex);
- list = __uam_list_find_client(name);
- if (list) {
- /* found bus name in our bus list */
- __uamd_dbus_client_cleanup((gpointer)list->data);
- uam_dbus_clients = g_slist_remove_link(uam_dbus_clients, list);
- count = g_slist_length(uam_dbus_clients);
- }
- g_mutex_unlock(&uam_dbus_clients_mutex);
-
- if (0 == count) {
- UAM_ERR("Quit ua-manager");
- g_main_loop_quit(main_loop);
- }
-}