Seperate GATT unregister instance function
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-avrcp.c
index ba5a922..cd6c898 100644 (file)
@@ -1,13 +1,11 @@
 /*
- * bluetooth-frwk
- *
- * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
- *              http://www.apache.org/licenses/LICENSE-2.0
+ *             http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  *
  */
 
-#include <dbus/dbus-glib-lowlevel.h>
-#include <dbus/dbus-glib.h>
-#include <dbus/dbus.h>
+#include <gio/gio.h>
 #include <glib.h>
 #include <dlog.h>
 #include <string.h>
-#ifndef LIBNOTIFY_SUPPORT
 #include <syspopup_caller.h>
-#endif
+#include <dbus/dbus.h>
 
 #include "bluetooth-api.h"
 #include "bt-internal-types.h"
-
 #include "bt-service-common.h"
 #include "bt-service-avrcp.h"
 #include "bt-service-event.h"
 #include "bt-service-util.h"
+#include "bt-service-audio.h"
 
-struct player_settinngs_t {
-       int key;
-       const char *property;
-};
-
-static struct player_settinngs_t loopstatus_settings[] = {
+static bt_player_settinngs_t loopstatus_settings[] = {
        { REPEAT_INVALID, "" },
        { REPEAT_MODE_OFF, "None" },
        { REPEAT_SINGLE_TRACK, "Track" },
@@ -48,844 +38,579 @@ static struct player_settinngs_t loopstatus_settings[] = {
        { REPEAT_INVALID, "" }
 };
 
-static struct player_settinngs_t playback_status[] = {
-       { STATUS_STOPPED, "Stopped" },
-       { STATUS_PLAYING, "Playing" },
-       { STATUS_PAUSED, "Paused" },
-       { STATUS_INVALID, "" }
+static bt_player_settinngs_t shuffle_settings[] = {
+       { SHUFFLE_INVALID, "" },
+       { SHUFFLE_MODE_OFF, "off" },
+       { SHUFFLE_ALL_TRACK, "alltracks" },
+       { SHUFFLE_GROUP, "group" },
+       { SHUFFLE_INVALID, "" }
 };
 
-static struct player_settinngs_t repeat_settings[] = {
-       { REPEAT_INVALID, "" },
-       { REPEAT_MODE_OFF, "off" },
-       { REPEAT_SINGLE_TRACK, "singletrack" },
-       { REPEAT_ALL_TRACK, "alltracks" },
-       { REPEAT_INVALID, "" }
+static bt_player_settinngs_t player_status[] = {
+       { STATUS_STOPPED, "stopped" },
+       { STATUS_PLAYING, "playing" },
+       { STATUS_PAUSED, "paused" },
+       { STATUS_FORWARD_SEEK, "forward-seek" },
+       { STATUS_REVERSE_SEEK, "reverse-seek" },
+       { STATUS_ERROR, "error" },
+       { STATUS_INVALID, "" }
 };
 
-typedef struct {
-       GObject parent;
-} BtMediaAgent;
-
-typedef struct {
-       GObjectClass parent;
-} BtMediaAgentClass;
-
-GType bt_media_agent_get_type(void);
-
-DBusConnection *g_bt_dbus_conn = NULL;
-
-#define BT_MEDIA_TYPE_AGENT (bt_media_agent_get_type())
-#define BT_MEDIA_GET_AGENT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), BT_MEDIA_TYPE_AGENT, BtMediaAgent))
-#define BT_MEDIA_IS_AGENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), BT_MEDIA_TYPE_AGENT))
-#define BT_MEDIA_AGENT_CLASS(class) (G_TYPE_CHECK_CLASS_CAST((class), BT_MEDIA_TYPE_AGENT, \
-                                                                               BtMediaAgentClass))
-#define BT_MEDIA_GET_AGENT_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), BT_MEDIA_TYPE_AGENT, \
-                                                                               BtMediaAgentClass))
-#define BT_MEDIA_IS_AGENT_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE((class), BT_MEDIA_TYPE_AGENT))
-
-G_DEFINE_TYPE(BtMediaAgent, bt_media_agent, G_TYPE_OBJECT)
-
-static gboolean bt_media_agent_set_property(BtMediaAgent *agent,
-                                               const char *property, GValue *value,
-                                               DBusGMethodInvocation *context);
-
-static BtMediaAgent *bt_media_obj = NULL;
-
-#include "bt-media-agent-method.h"
-
-typedef enum {
-       BT_MEDIA_AGENT_ERROR_INVALID_PARAM,
-       BT_MEDIA_AGENT_ERROR_NOT_AVAILABLE,
-       BT_MEDIA_AGENT_ERROR_BUSY,
-} BtMediaAgentError;
-
-#define BT_MEDIA_AGENT_ERROR (bt_media_agent_error_quark())
-
-static GQuark bt_media_agent_error_quark(void)
-{
-       static GQuark quark = 0;
-       if (!quark)
-               quark = g_quark_from_static_string("agent");
-
-       return quark;
-}
-
-#define ENUM_ENTRY(NAME, DESC) { NAME, "" #NAME "", DESC }
-
-static GError *bt_media_agent_error(BtMediaAgentError error, const char *err_msg)
-{
-       return g_error_new(BT_MEDIA_AGENT_ERROR, error, err_msg, NULL);
-}
-
-static void bt_media_agent_init(BtMediaAgent *agent)
-{
-       BT_DBG("agent %p\n", agent);
-}
-
-static void bt_media_agent_finalize(GObject *agent)
-{
-       BT_DBG("Free agent %p\n", agent);
-
-       G_OBJECT_CLASS(bt_media_agent_parent_class)->finalize(agent);
-}
-
-static void bt_media_agent_class_init(BtMediaAgentClass *klass)
-{
-       GObjectClass *object_class = (GObjectClass *) klass;
-
-       BT_DBG("class %p\n", klass);
-
-       object_class->finalize = bt_media_agent_finalize;
-
-       dbus_g_object_type_install_info(BT_MEDIA_TYPE_AGENT,
-                                       &dbus_glib_bt_media_agent_object_info);
-}
-
-static BtMediaAgent *__bt_media_agent_new(void)
+static guint avrcp_reg_id = 0;
+
+/* Introspection data exposed from bt-service */
+static const gchar bt_avrcp_bluez_introspection_xml[] =
+"<node name='/'>"
+" <interface name='org.freedesktop.DBus.Properties'>"
+"     <method name='Set'>"
+"          <arg type='s' name='interface' direction='in'/>"
+"          <arg type='s' name='property' direction='in'/>"
+"          <arg type='v' name='value' direction='in'/>"
+"     </method>"
+" </interface>"
+"</node>";
+
+static gboolean __bt_media_emit_property_changed(GDBusConnection *connection,
+               const char *path, const char *interface, const char *name,
+               const GVariant *variant)
 {
-       BtMediaAgent *agent;
-
-       agent = BT_MEDIA_GET_AGENT(g_object_new(BT_MEDIA_TYPE_AGENT, NULL));
-
-       BT_DBG("agent %p\n", agent);
-
-       return agent;
-}
-
-static gboolean bt_media_agent_set_property(BtMediaAgent *agent,
-                                               const char *property, GValue *val,
-                                               DBusGMethodInvocation *context)
-{
-       GError *error;
-       const gchar *value;
-       unsigned int status;
-
-       BT_DBG("property %s\n", property);
+       GVariantBuilder *builder = NULL;
+       GError *error = NULL;
+
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       g_variant_builder_add(builder, "{sv}", name, variant);
+
+       g_dbus_connection_emit_signal(connection, NULL, path,
+                               DBUS_INTERFACE_PROPERTIES,
+                               "PropertiesChanged",
+                               g_variant_new("(sa{sv})",
+                               interface, builder),
+                               &error);
+
+       g_variant_builder_unref(builder);
+       if (error) {
+               BT_ERR("Could not Emit PropertiesChanged Signal: errCode[%x], message[%s]",
+                       error->code, error->message);
+               g_clear_error(&error);
+               return FALSE;
+       }
 
-       dbus_g_method_return(context);
        return TRUE;
-
 }
 
-static const char *loopstatus_to_repeat(const char *value)
+static GQuark __bt_avrcp_error_quark(void)
 {
-       if (strcasecmp(value, "None") == 0)
-               return "off";
-       else if (strcasecmp(value, "Track") == 0)
-               return "singletrack";
-       else if (strcasecmp(value, "Playlist") == 0)
-               return "alltracks";
-
-       return NULL;
-}
-
-void set_shuffle(DBusMessageIter *iter)
-{
-       dbus_bool_t shuffle;
-       const char *value;
-       unsigned int status;
-
-       if (dbus_message_iter_get_arg_type(iter) !=
-                                       DBUS_TYPE_BOOLEAN) {
-               BT_DBG("Invalid arguments in method call");
-               return;
-       }
-
-       dbus_message_iter_get_basic(iter, &shuffle);
-       value = shuffle ? "alltracks" : "off";
+       static GQuark quark = 0;
 
-       if (g_strcmp0(value, "alltracks") == 0)
-               status = SHUFFLE_ALL_TRACK;
-       else if (g_strcmp0(value, "off") == 0)
-               status = SHUFFLE_MODE_OFF;
-       else
-               status = SHUFFLE_INVALID;
+       if (!quark)
+               quark = g_quark_from_static_string("bt-avrcp");
 
-       _bt_send_event(BT_AVRCP_EVENT,
-                       BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
-                       DBUS_TYPE_UINT32, &status,
-                       DBUS_TYPE_INVALID);
+       return quark;
 }
 
-void set_loopstatus(DBusMessageIter *iter)
+static GError *__bt_avrcp_set_error(bt_avrcp_error_t error)
 {
-       const char *value;
-       unsigned int status;
-
-       if (dbus_message_iter_get_arg_type(iter) !=
-                                       DBUS_TYPE_STRING) {
-               BT_DBG("Invalid arguments in method call");
-               return;
+       BT_ERR("error[%d]\n", error);
+
+       switch (error) {
+       case BT_AVRCP_ERROR_INVALID_PARAM:
+               return g_error_new(BT_AVRCP_ERROR, error,
+                               BT_ERROR_INVALID_PARAM);
+       case BT_AVRCP_ERROR_INVALID_INTERFACE:
+               return g_error_new(BT_AVRCP_ERROR, error,
+                               BT_ERROR_INVALID_INTERFACE);
+       case BT_AVRCP_ERROR_INTERNAL:
+       default:
+               return g_error_new(BT_AVRCP_ERROR, error,
+                               BT_ERROR_INTERNAL);
        }
-
-       dbus_message_iter_get_basic(iter, &value);
-
-       value = loopstatus_to_repeat(value);
-
-       if (g_strcmp0(value, "singletrack") == 0)
-               status = REPEAT_SINGLE_TRACK;
-       else if (g_strcmp0(value, "alltracks") == 0)
-               status = REPEAT_ALL_TRACK;
-       else if (g_strcmp0(value, "off") == 0)
-               status = REPEAT_MODE_OFF;
-       else
-               status = REPEAT_INVALID;
-
-       _bt_send_event(BT_AVRCP_EVENT,
-                       BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
-                       DBUS_TYPE_UINT32, &status,
-                       DBUS_TYPE_INVALID);
 }
 
-static DBusHandlerResult bt_properties_message(DBusConnection *connection,
-                                               DBusMessage *message)
+static void __bt_avrcp_agent_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)
 {
-       DBusMessageIter iter, sub;
-       const char *name, *interface;
-       DBusMessage *reply;
-
-       if (!dbus_message_iter_init(message, &iter)){
-               reply = dbus_message_new_error(message,
-                       DBUS_ERROR_INVALID_ARGS, "No arguments given");
-               goto done;
-       }
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING){
-               reply = dbus_message_new_error(message,
-                       DBUS_ERROR_INVALID_ARGS, "Invalid argument type");
-               goto done;
-       }
-
-       dbus_message_iter_get_basic(&iter, &interface);
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING){
-               reply = dbus_message_new_error(message,
-                       DBUS_ERROR_INVALID_ARGS, "Invalid argument type");
-               goto done;
+       BT_DBG("+");
+       BT_INFO("method %s", method_name);
+       BT_INFO("object_path %s", object_path);
+       int ret = BT_AVRCP_ERROR_NONE;
+       GError *err = NULL;
+       gboolean shuffle_status;
+       guint32 status;
+       gchar *interface = NULL;
+       gchar *property = NULL;
+       gchar *loop_status = NULL;
+       GVariant *value = NULL;
+
+       if (g_strcmp0(method_name, "Set") == 0) {
+               g_variant_get(parameters, "(&s&sv)", &interface, &property,
+                               &value);
+
+               if (g_strcmp0(interface, BT_MEDIA_PLAYER_INTERFACE) != 0) {
+                       ret = BT_AVRCP_ERROR_INVALID_INTERFACE;
+                       goto fail;
+               }
        }
 
-       dbus_message_iter_get_basic(&iter, &name);
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT){
-               reply = dbus_message_new_error(message,
-                       DBUS_ERROR_INVALID_ARGS, "Invalid argument type");
-               goto done;
+       if (value == NULL) {
+               BT_ERR("value is NULL");
+               goto fail;
        }
 
-       dbus_message_iter_recurse(&iter, &sub);
-
-       if (g_strcmp0(interface, BT_MEDIA_PLAYER_INTERFACE) == 0){
-               if (g_strcmp0(name, "LoopStatus") == 0)
-                       set_loopstatus(&sub);
-               else if (g_strcmp0(name, "Shuffle") == 0)
-                       set_shuffle(&sub);
-       }
+       BT_DBG("Property: %s\n", property);
+       if (g_strcmp0(property, "Shuffle") == 0) {
 
-       reply = dbus_message_new_method_return(message);
-       if (reply == NULL)
-               return DBUS_HANDLER_RESULT_NEED_MEMORY;
+               if (!g_variant_is_of_type(value, G_VARIANT_TYPE_BOOLEAN)) {
+                       BT_ERR("Error");
+                       ret = BT_AVRCP_ERROR_INVALID_PARAM;
+                       goto fail;
+               }
 
-done:
-       dbus_connection_send(connection, reply, NULL);
-       dbus_message_unref(reply);
+               shuffle_status = g_variant_get_boolean(value);
+               BT_DBG("Value: %s\n", shuffle_status ? "TRUE" : "FALSE");
+               if (shuffle_status == TRUE)
+                       status = SHUFFLE_ALL_TRACK;
+               else
+                       status = SHUFFLE_MODE_OFF;
 
-       return DBUS_HANDLER_RESULT_HANDLED;
-}
+               _bt_send_event(BT_AVRCP_EVENT,
+                               BLUETOOTH_EVENT_AVRCP_SETTING_SHUFFLE_STATUS,
+                               g_variant_new("(u)", status));
+       } else if (g_strcmp0(property, "LoopStatus") == 0) {
 
-static DBusHandlerResult bt_dbus_message(DBusConnection *connection,
-                               DBusMessage *message, void *user_data)
-{
-       const char *interface;
+               if (!g_variant_is_of_type(value, G_VARIANT_TYPE_STRING)) {
+                       BT_ERR("Error");
+                       ret = BT_AVRCP_ERROR_INVALID_PARAM;
+                       goto fail;
+               }
 
-       interface = dbus_message_get_interface(message);
+               loop_status = (gchar *)g_variant_get_string(value, NULL);
+               BT_DBG("Value: %s\n", loop_status);
 
-       if (interface == NULL)
-               return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+               if (g_strcmp0(loop_status, "Track") == 0)
+                       status = REPEAT_SINGLE_TRACK;
+               else if (g_strcmp0(loop_status, "Playlist") == 0)
+                       status = REPEAT_ALL_TRACK;
+               else if (g_strcmp0(loop_status, "None") == 0)
+                       status = REPEAT_MODE_OFF;
+               else
+                       status = REPEAT_INVALID;
 
-       if (g_strcmp0(interface, BT_PROPERTIES_INTERFACE) == 0)
-               return bt_properties_message(connection, message);
+               _bt_send_event(BT_AVRCP_EVENT,
+                               BLUETOOTH_EVENT_AVRCP_SETTING_REPEAT_STATUS,
+                               g_variant_new("(u)", status));
+       }
 
-       return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+       BT_DBG("-");
+       return;
+
+fail:
+       if (value)
+               g_variant_unref(value);
+       err = __bt_avrcp_set_error(ret);
+       g_dbus_method_invocation_return_gerror(invocation, err);
+       g_clear_error(&err);
+       BT_INFO("-");
 }
 
-static DBusObjectPathVTable bt_object_table = {
-        .message_function       = bt_dbus_message,
+static const GDBusInterfaceVTable method_table = {
+       __bt_avrcp_agent_method,
+       NULL,
+       NULL,
 };
 
-gboolean bt_dbus_register_object_path(DBusConnection *connection,
-                                               const char *path)
+static GDBusNodeInfo *__bt_avrcp_create_method_node_info
+                               (const gchar *introspection_data)
 {
-       if (!dbus_connection_register_object_path(connection, path,
-                               &bt_object_table, NULL))
-               return FALSE;
+       GError *err = NULL;
+       GDBusNodeInfo *node_info = NULL;
 
-       return TRUE;
-}
-
-void bt_dbus_unregister_object_path(DBusConnection *connection,
-                                               const char *path)
-{
-       dbus_connection_unregister_object_path(connection, path);
-}
+       if (introspection_data == NULL)
+               return NULL;
 
-static inline void bt_dbus_queue_dispatch(DBusConnection *conn,
-                                       DBusDispatchStatus status)
-{
-       if (status == DBUS_DISPATCH_DATA_REMAINS){
-               dbus_connection_ref(conn);
-                while (dbus_connection_dispatch(conn)
-                               == DBUS_DISPATCH_DATA_REMAINS)
-                               ;
+       node_info = g_dbus_node_info_new_for_xml(introspection_data, &err);
 
-               dbus_connection_unref(conn);
+       if (err) {
+               BT_ERR("Unable to create node: %s", err->message);
+               g_clear_error(&err);
        }
-}
-
-static void bt_dbus_dispatch_status(DBusConnection *conn,
-                               DBusDispatchStatus status, void *data)
-{
-       if (!dbus_connection_get_is_connected(conn))
-               return;
 
-       bt_dbus_queue_dispatch(conn, status);
+       return node_info;
 }
 
-DBusConnection *bt_dbus_setup_private(DBusBusType type, DBusError *error)
+int _bt_register_media_player(void)
 {
-       DBusConnection *conn;
-       DBusDispatchStatus status;
-
-       conn = dbus_bus_get_private(type, error);
-
-       if (conn == NULL)
-               return NULL;
-
-       dbus_connection_set_dispatch_status_function(conn,
-                               bt_dbus_dispatch_status, NULL, NULL);
-
-       status = dbus_connection_get_dispatch_status(conn);
-       bt_dbus_queue_dispatch(conn, status);
-
-       return conn;
-}
+       BT_DBG("+");
+       GDBusConnection *g_conn;
+       gchar *adapter_path;
+       gboolean shuffle_status;
+       gchar *path;
+       GDBusNodeInfo *node_info;
+       GDBusProxy *proxy;
+       GVariantBuilder *builder;
+       GVariant *ret;
+       GError *error = NULL;
 
-static void __bt_media_append_variant(DBusMessageIter *iter,
-                       int type, void *value)
-{
-       char sig[2] = { type, '\0'};
-       DBusMessageIter value_iter;
+       media_player_settings_t player_settings = {0,};
 
-       dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, sig,
-                                                       &value_iter);
+       player_settings.repeat  = REPEAT_MODE_OFF;
+       player_settings.status = STATUS_STOPPED;
+       player_settings.position = 0;
+       shuffle_status = FALSE;
 
-       dbus_message_iter_append_basic(&value_iter, type, value);
+       g_conn = _bt_gdbus_get_system_gconn();
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       dbus_message_iter_close_container(iter, &value_iter);
-}
+       node_info = __bt_avrcp_create_method_node_info(
+                               bt_avrcp_bluez_introspection_xml);
+       if (node_info == NULL)
+               return BLUETOOTH_ERROR_INTERNAL;
 
-static void __bt_media_append_dict_entry(DBusMessageIter *iter,
-                       const char *key, int type, void *property)
-{
-       DBusMessageIter dict_entry;
-       const char *str_ptr;
+       avrcp_reg_id = g_dbus_connection_register_object(g_conn,
+                                       BT_MEDIA_OBJECT_PATH,
+                                       node_info->interfaces[0],
+                                       &method_table,
+                                       NULL, NULL, &error);
+       g_dbus_node_info_unref(node_info);
 
-       if (type == DBUS_TYPE_STRING) {
-               str_ptr = *((const char **)property);
-               ret_if(str_ptr == NULL);
+       if (avrcp_reg_id == 0) {
+               BT_ERR("Failed to register: %s", error->message);
+               g_clear_error(&error);
+               return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       dbus_message_iter_open_container(iter,
-                                       DBUS_TYPE_DICT_ENTRY,
-                                       NULL, &dict_entry);
-
-       dbus_message_iter_append_basic(&dict_entry, DBUS_TYPE_STRING, &key);
-
-       __bt_media_append_variant(&dict_entry, type, property);
+       adapter_path = _bt_get_adapter_path();
+       retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       dbus_message_iter_close_container(iter, &dict_entry);
-}
+       proxy =  g_dbus_proxy_new_sync(g_conn,
+                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       BT_BLUEZ_NAME, adapter_path,
+                       BT_MEDIA_INTERFACE, NULL, &error);
+       g_free(adapter_path);
 
-static void __bt_media_append_array_variant(DBusMessageIter *iter, int type,
-                       void *val, int n_elements)
-{
-       DBusMessageIter variant, array;
-       char type_sig[2] = { type, '\0' };
-       char array_sig[3] = { DBUS_TYPE_ARRAY, type, '\0' };
-
-       dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
-                                               array_sig, &variant);
-
-       dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
-                                               type_sig, &array);
-
-       if (dbus_type_is_fixed(type) == TRUE) {
-               dbus_message_iter_append_fixed_array(&array, type, val,
-                                                       n_elements);
-       } else if (type == DBUS_TYPE_STRING ||
-                               type == DBUS_TYPE_OBJECT_PATH) {
-               const char ***str_array = val;
-               int i;
-
-               for (i = 0; i < n_elements; i++)
-                       dbus_message_iter_append_basic(&array, type,
-                                               &((*str_array)[i]));
+       if (proxy == NULL) {
+               BT_ERR("Unable to create proxy");
+               if (error) {
+                       BT_ERR("Error: %s", error->message);
+                       g_clear_error(&error);
+               }
+               return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       dbus_message_iter_close_container(&variant, &array);
-       dbus_message_iter_close_container(iter, &variant);
-}
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
 
-static void __bt_media_append_array(DBusMessageIter *dict, const char *key,
-                       int type, void *val, int n_elements)
-{
-       DBusMessageIter entry;
+       g_variant_builder_add(builder, "{sv}", "LoopStatus",
+                       g_variant_new("s",
+                       loopstatus_settings[player_settings.repeat].property));
+       BT_ERR("LoopStatus: %s", loopstatus_settings[player_settings.repeat].property);
 
-       dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
-                                                       NULL, &entry);
+       g_variant_builder_add(builder, "{sv}", "Shuffle",
+                       g_variant_new("b", shuffle_status));
 
-       BT_DBG("key = %s", key);
-       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key);
+       g_variant_builder_add(builder, "{sv}", "PlaybackStatus",
+                       g_variant_new("s",
+                       player_status[player_settings.status].property));
+       BT_ERR("PlaybackStatus: %s", player_status[player_settings.status].property);
 
-       __bt_media_append_array_variant(&entry, type, val, n_elements);
+       g_variant_builder_add(builder, "{sv}", "Position",
+                       g_variant_new("u", player_settings.position));
 
-       dbus_message_iter_close_container(dict, &entry);
-}
+       path = g_strdup(BT_MEDIA_OBJECT_PATH);
+       ret = g_dbus_proxy_call_sync(proxy, "RegisterPlayer",
+                       g_variant_new("(oa{sv})", path, builder),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
 
-static void __bt_media_append_metadata_variant(DBusMessageIter *iter,
-               const char *key, int type, void *property, int count)
-{
-       DBusMessageIter value, metadata;
-
-       dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{sv}",
-                                                               &value);
-
-       dbus_message_iter_open_container(&value, DBUS_TYPE_ARRAY,
-                       DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                       DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
-                       DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &metadata);
-
-       if (type == DBUS_TYPE_ARRAY)
-               __bt_media_append_array(&metadata, key,
-                       DBUS_TYPE_STRING, property, count);
-       else
-       __bt_media_append_dict_entry(&metadata, key, type, property);
-
-       dbus_message_iter_close_container(&value, &metadata);
-       dbus_message_iter_close_container(iter, &value);
-}
-
-static void __bt_media_append_metadata_dict_entry(DBusMessageIter *iter,
-                       const char *key, int type, void *property, int count)
-{
-       DBusMessageIter dict_entry;
-       const char *str_ptr;
-       char * metadata = "Metadata";
+       g_object_unref(proxy);
+       g_free(path);
+       g_variant_builder_unref(builder);
 
-       if (type == DBUS_TYPE_STRING) {
-               str_ptr = *((const char **)property);
-               ret_if(str_ptr == NULL);
+       if (ret == NULL) {
+               BT_ERR("Call RegisterPlayer Failed");
+               if (error) {
+                       BT_ERR("errCode[%x], message[%s]",
+                                       error->code, error->message);
+                       g_clear_error(&error);
+               }
+               return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       dbus_message_iter_open_container(iter,
-                                       DBUS_TYPE_DICT_ENTRY,
-                                       NULL, &dict_entry);
-
-       dbus_message_iter_append_basic(&dict_entry, DBUS_TYPE_STRING, &metadata);
-
-       __bt_media_append_metadata_variant(&dict_entry, key, type, property, count);
-
-       dbus_message_iter_close_container(iter, &dict_entry);
+       g_variant_unref(ret);
+       return BLUETOOTH_ERROR_NONE;
 }
 
-static void __bt_metadata_append_property_changed(DBusMessageIter *property_dict,
-                                        media_metadata_attributes_t *metadata)
+static void __bt_avrcp_unregister_object_path(void)
 {
-       if(property_dict == NULL || metadata == NULL)
-               return
-
-       __bt_media_append_metadata_dict_entry(property_dict,
-               "xesam:title",
-               DBUS_TYPE_STRING, &metadata->title, 0);
-
-       __bt_media_append_array(property_dict,
-               "xesam:artist",
-               DBUS_TYPE_ARRAY,&metadata->artist, 1);
+       GDBusConnection *g_conn;
 
-       __bt_media_append_metadata_dict_entry(property_dict,
-               "xesam:album",
-               DBUS_TYPE_STRING, &metadata->album, 0);
+       g_conn = _bt_gdbus_get_system_gconn();
+       ret_if(g_conn == NULL);
 
-       __bt_media_append_array(property_dict,
-               "xesam:genre",
-               DBUS_TYPE_ARRAY,&metadata->genre, 1);
-
-       __bt_media_append_metadata_dict_entry(property_dict,
-               "mpris:length",
-               DBUS_TYPE_INT64, &metadata->duration, 0);
-
-       __bt_media_append_metadata_dict_entry(property_dict,
-               "xesam:trackNumber",
-               DBUS_TYPE_INT32, &metadata->tracknumber, 0);
+       if (avrcp_reg_id > 0) {
+               g_dbus_connection_unregister_object(g_conn,
+                                                       avrcp_reg_id);
+               avrcp_reg_id = 0;
+       }
 }
 
-static gboolean __bt_media_emit_property_changed(
-                                DBusConnection *connection,
-                                const char *path,
-                                const char *interface,
-                                const char *name,
-                                int type,
-                                void *property)
+int _bt_unregister_media_player(void)
 {
-       DBusMessage *sig;
-       DBusMessageIter entry, dict;
-       gboolean ret;
-
        BT_DBG("+");
-       sig = dbus_message_new_signal(path, DBUS_INTERFACE_PROPERTIES,
-                                               "PropertiesChanged");
-       retv_if(sig == NULL, FALSE);
-
-       dbus_message_iter_init_append(sig, &entry);
-       dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &interface);
+       GDBusConnection *g_conn;
+       GDBusProxy *proxy;
+       gchar *adapter_path;
+       GVariant *ret;
+       GError *error = NULL;
+       gchar *path;
+       int result = BLUETOOTH_ERROR_NONE;
 
-       dbus_message_iter_open_container(&entry, DBUS_TYPE_ARRAY,
-                       DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                       DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
-                       DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
-
-       if (g_strcmp0(name, "Metadata") == 0)
-               __bt_metadata_append_property_changed(&dict,
-                       (media_metadata_attributes_t *)property);
-       else
-               __bt_media_append_dict_entry(&dict,
-                                       name, type, property);
-
-       dbus_message_iter_close_container(&entry, &dict);
-
-       ret = dbus_connection_send(connection, sig, NULL);
-       dbus_message_unref(sig);
-
-       BT_DBG("-");
-
-       return ret;
-}
-
-int _bt_register_media_player(void)
-{
-       DBusMessage *msg;
-       DBusMessage *reply;
-       DBusMessageIter iter;
-       DBusMessageIter property_dict;
-       DBusError err;
-       char *object;
-       char *adapter_path;
-       DBusConnection *conn;
-       DBusGConnection *gconn;
-
-       media_player_settings_t player_settings = {0,};
-       media_metadata_attributes_t metadata = {0,};
-
-       player_settings.loopstatus  = REPEAT_MODE_OFF;
-       player_settings.playbackstatus = STATUS_STOPPED;
-       player_settings.shuffle = FALSE;
-       player_settings.position = 0;
-
-       metadata.title = "\0";
-       metadata.album = "\0";
-       metadata.tracknumber = 0;
-       metadata.duration = 0;
-
-       gconn = _bt_get_system_gconn();
-       retv_if(gconn  == NULL, BLUETOOTH_ERROR_INTERNAL);
-
-       conn = bt_dbus_setup_private(DBUS_BUS_SYSTEM, NULL);
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
-       g_bt_dbus_conn = conn;
-
-       if (!bt_media_obj) {
-               bt_media_obj = __bt_media_agent_new();
-
-               retv_if(bt_media_obj == NULL, BLUETOOTH_ERROR_INTERNAL);
-
-               dbus_g_connection_register_g_object(gconn,
-                                                       BT_MEDIA_OBJECT_PATH,
-                                                       G_OBJECT(bt_media_obj));
+       adapter_path = _bt_get_adapter_path();
+       if (adapter_path == NULL) {
+               result = BLUETOOTH_ERROR_INTERNAL;
+               goto FAIL;
        }
 
-       if (!bt_dbus_register_object_path(conn, BT_MEDIA_OBJECT_PATH)){
-               BT_DBG("Could not register interface %s",
-                                       MPRIS_PLAYER_INTERFACE);
+       g_conn = _bt_gdbus_get_system_gconn();
+       if (g_conn == NULL) {
+               BT_ERR("g_conn is NULL");
+               g_free(adapter_path);
+               result = BLUETOOTH_ERROR_INTERNAL;
+               goto FAIL;
        }
 
-       adapter_path = _bt_get_adapter_path();
-       retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
-
-       msg = dbus_message_new_method_call(BT_BLUEZ_NAME, adapter_path,
-                                       BT_MEDIA_INTERFACE, "RegisterPlayer");
-
+       proxy =  g_dbus_proxy_new_sync(g_conn,
+                       G_DBUS_PROXY_FLAGS_NONE, NULL,
+                       BT_BLUEZ_NAME, adapter_path,
+                       BT_MEDIA_INTERFACE, NULL, &error);
        g_free(adapter_path);
 
-       retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL);
-
-       object = g_strdup(BT_MEDIA_OBJECT_PATH);
-
-       dbus_message_iter_init_append(msg, &iter);
-       dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH, &object);
-       g_free(object);
-
-       dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
-                       DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
-                       DBUS_TYPE_STRING_AS_STRING
-                       DBUS_TYPE_VARIANT_AS_STRING
-                       DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &property_dict);
-
-       __bt_media_append_dict_entry(&property_dict,
-               "LoopStatus",
-               DBUS_TYPE_STRING,
-               &loopstatus_settings[player_settings.loopstatus].property);
-
-       __bt_media_append_dict_entry(&property_dict,
-               "Shuffle",
-               DBUS_TYPE_BOOLEAN,
-               &player_settings.shuffle);
-
-       __bt_media_append_dict_entry(&property_dict,
-               "PlaybackStatus",
-               DBUS_TYPE_STRING,
-               &playback_status[player_settings.playbackstatus].property);
-
-       __bt_media_append_dict_entry(&property_dict,
-               "Position",
-               DBUS_TYPE_INT64, &player_settings.position);
-
-       __bt_media_append_metadata_dict_entry(&property_dict,
-               "xesam:title",
-               DBUS_TYPE_STRING, &metadata.title, 0);
-
-       metadata.artists = g_malloc0(sizeof(char *));
-       metadata.artists[0] = "";
-
-       __bt_media_append_metadata_dict_entry(&property_dict,
-               "xesam:artist",
-               DBUS_TYPE_ARRAY, &metadata.artists, 1);
-
-       __bt_media_append_metadata_dict_entry(&property_dict,
-               "xesam:album",
-               DBUS_TYPE_STRING, &metadata.album, 0);
-
-       metadata.genres = g_malloc0(sizeof(char *));
-       metadata.genres[0] = "";
-
-       __bt_media_append_metadata_dict_entry(&property_dict,
-               "xesam:genre",
-               DBUS_TYPE_ARRAY, &metadata.genres, 1);
-
-       __bt_media_append_metadata_dict_entry(&property_dict,
-               "mpris:length",
-               DBUS_TYPE_INT64, &metadata.duration, 0);
-
-       __bt_media_append_metadata_dict_entry(&property_dict,
-               "xesam:trackNumber",
-               DBUS_TYPE_INT32, &metadata.tracknumber, 0);
-
-       dbus_message_iter_close_container(&iter, &property_dict);
-
-       dbus_error_init(&err);
-       reply = dbus_connection_send_with_reply_and_block(conn,
-                                       msg, -1, &err);
-       dbus_message_unref(msg);
-
-       if (!reply) {
-               BT_DBG("Error in registering the Music Player \n");
-
-               if (dbus_error_is_set(&err)) {
-                       BT_ERR("%s", err.message);
-                       dbus_error_free(&err);
-                       return BLUETOOTH_ERROR_INTERNAL;
+       if (proxy == NULL) {
+               BT_ERR("Unable to create proxy");
+               if (error) {
+                       BT_ERR("Error: %s", error->message);
+                       g_clear_error(&error);
                }
+               result = BLUETOOTH_ERROR_INTERNAL;
+               goto FAIL;
+       }
 
-               if (bt_media_obj) {
-                       dbus_g_connection_unregister_g_object(gconn,
-                                               G_OBJECT(bt_media_obj));
-                       g_object_unref(bt_media_obj);
-                       bt_media_obj = NULL;
+       path = g_strdup(BT_MEDIA_OBJECT_PATH);
+       BT_DBG("path is [%s]", path);
+
+       ret = g_dbus_proxy_call_sync(proxy, "UnregisterPlayer",
+                       g_variant_new("(o)", path),
+                       G_DBUS_CALL_FLAGS_NONE, -1,
+                       NULL, &error);
+       g_free(path);
+       g_object_unref(proxy);
+
+       if (ret == NULL) {
+               BT_ERR("UnregisterPlayer failed");
+               if (error) {
+                       BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
+                                       error->code, error->message);
+                       g_clear_error(&error);
                }
+               result = BLUETOOTH_ERROR_INTERNAL;
        }
+       g_variant_unref(ret);
 
-       if (reply)
-               dbus_message_unref(reply);
+FAIL:
+       __bt_avrcp_unregister_object_path();
 
-       g_free(metadata.artist);
-       g_free(metadata.genre);
-
-       return BLUETOOTH_ERROR_NONE;
+       BT_DBG("-");
+       return result;
 }
 
-int _bt_unregister_media_player(void)
+int _bt_avrcp_set_track_info(media_metadata_attributes_t *meta_data)
 {
-       DBusMessage *msg;
-       DBusMessage *reply;
-       DBusError err;
-       char *object;
-       char *adapter_path;
-       DBusConnection *conn;
+       BT_DBG("+");
+       char *interface = BT_MEDIA_PLAYER_INTERFACE;
+       GDBusConnection *g_conn;
+       GError *error = NULL;
+       GVariantBuilder *builder = NULL;
+       GVariantBuilder *inner_builder = NULL;
+       GVariant *children[1];
+       gboolean ret;
 
-       conn = g_bt_dbus_conn;
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       retv_if(meta_data == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       adapter_path = _bt_get_adapter_path();
-       retv_if(adapter_path == NULL, BLUETOOTH_ERROR_INTERNAL);
+       g_conn = _bt_gdbus_get_system_gconn();;
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       msg = dbus_message_new_method_call(BT_BLUEZ_NAME, adapter_path,
-                               BT_MEDIA_INTERFACE, "UnregisterPlayer");
+       builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+       inner_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
 
-       g_free(adapter_path);
+       g_variant_builder_add(inner_builder, "{sv}",
+               "xesam:title", g_variant_new_string(meta_data->title));
 
-       retv_if(msg == NULL, BLUETOOTH_ERROR_INTERNAL);
+       children[0] = g_variant_new_string(meta_data->artist);
+       g_variant_builder_add(inner_builder, "{sv}",
+               "xesam:artist", g_variant_new_array(G_VARIANT_TYPE_STRING,
+               children, 1));
 
-       object = g_strdup(BT_MEDIA_OBJECT_PATH);
+       g_variant_builder_add(inner_builder, "{sv}",
+               "xesam:album", g_variant_new_string(meta_data->album));
 
-       dbus_message_append_args(msg,
-                               DBUS_TYPE_OBJECT_PATH, &object,
-                               DBUS_TYPE_INVALID);
+       children[0] = g_variant_new_string(meta_data->genre);
+       g_variant_builder_add(inner_builder, "{sv}",
+               "xesam:genre", g_variant_new_array(G_VARIANT_TYPE_STRING,
+               children, 1));
 
-       g_free(object);
+       g_variant_builder_add(inner_builder, "{sv}",
+               "xesam:totalTracks", g_variant_new_int32(meta_data->total_tracks));
 
-       dbus_error_init(&err);
-       reply = dbus_connection_send_with_reply_and_block(conn,
-                               msg, -1, &err);
-       dbus_message_unref(msg);
+       g_variant_builder_add(inner_builder, "{sv}",
+               "xesam:trackNumber", g_variant_new_int32(meta_data->number));
 
-       if (!reply) {
-               BT_ERR("Error in unregistering the Music Player \n");
+       g_variant_builder_add(inner_builder, "{sv}",
+               "mpris:length", g_variant_new_int64(meta_data->duration));
 
-               if (dbus_error_is_set(&err)) {
-                       BT_DBG("%s", err.message);
-                       dbus_error_free(&err);
-                       return BLUETOOTH_ERROR_INTERNAL;
-               }
-       } else {
-               dbus_message_unref(reply);
-       }
+       g_variant_builder_add(builder, "{sv}",
+               "Metadata", g_variant_new("a{sv}", inner_builder));
 
-       if (bt_media_obj) {
-               dbus_g_connection_unregister_g_object(_bt_get_system_gconn(),
-                                               G_OBJECT(bt_media_obj));
-               g_object_unref(bt_media_obj);
-               bt_media_obj = NULL;
-       }
+       ret = g_dbus_connection_emit_signal(g_conn, NULL, BT_MEDIA_OBJECT_PATH,
+                               DBUS_INTERFACE_PROPERTIES,
+                               "PropertiesChanged",
+                               g_variant_new("(sa{sv})",
+                               interface, builder),
+                               &error);
 
-       bt_dbus_unregister_object_path(conn, BT_MEDIA_OBJECT_PATH);
-       g_bt_dbus_conn = NULL;
+       g_variant_builder_unref(inner_builder);
+       g_variant_builder_unref(builder);
 
+       if (!ret) {
+               if (error != NULL) {
+                       BT_ERR("D-Bus API failure: errCode[%x], message[%s]",
+                               error->code, error->message);
+                       g_clear_error(&error);
+               }
+       }
+
+       BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
 
 int _bt_avrcp_set_interal_property(int type, media_player_settings_t *properties)
 {
-       DBusConnection *conn;
+       BT_DBG("+");
+       GDBusConnection *g_conn;
        int value;
        media_metadata_attributes_t meta_data;
-       dbus_bool_t shuffle;
+       gboolean shuffle;
+       GVariantBuilder *builder = NULL;
+       GVariant *children[1];
 
-       conn = g_bt_dbus_conn;
-       retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
+       g_conn = _bt_gdbus_get_system_gconn();;
+       retv_if(g_conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        switch (type) {
-       case LOOPSTATUS:
-               value = properties->loopstatus;
-               if (!__bt_media_emit_property_changed(
-                       conn,
-                       BT_MEDIA_OBJECT_PATH,
-                       BT_MEDIA_PLAYER_INTERFACE,
-                       "LoopStatus",
-                       DBUS_TYPE_STRING,
-                       &loopstatus_settings[value].property)) {
-                       BT_DBG("Error sending the PropertyChanged signal \n");
+       case REPEAT:
+               value = properties->repeat;
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
+                               BT_MEDIA_PLAYER_INTERFACE, "LoopStatus",
+                               g_variant_new_string(loopstatus_settings[value].property))) {
+                       BT_ERR("Error sending the PropertyChanged signal \n");
                        return BLUETOOTH_ERROR_INTERNAL;
                }
                break;
        case SHUFFLE:
                value = properties->shuffle;
-               if (g_strcmp0(repeat_settings[value].property, "alltracks") == 0)
-                       shuffle = 1;
+               if (g_strcmp0(shuffle_settings[value].property, "off") == 0)
+                       shuffle = FALSE;
                else
-                       shuffle = 0;
-
-               if (!__bt_media_emit_property_changed(
-                       conn,
-                       BT_MEDIA_OBJECT_PATH,
-                       BT_MEDIA_PLAYER_INTERFACE,
-                       "Shuffle",
-                       DBUS_TYPE_BOOLEAN,
-                       &shuffle)) {
-                       BT_DBG("Error sending the PropertyChanged signal \n");
+                       shuffle = TRUE;
+
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
+                               BT_MEDIA_PLAYER_INTERFACE, "Shuffle",
+                               g_variant_new_boolean(shuffle))) {
+                       BT_ERR("Error sending the PropertyChanged signal \n");
                        return BLUETOOTH_ERROR_INTERNAL;
                }
                break;
-       case PLAYBACKSTATUS:
-               value = properties->playbackstatus;
-               if (!__bt_media_emit_property_changed(
-                       conn,
-                       BT_MEDIA_OBJECT_PATH,
-                       BT_MEDIA_PLAYER_INTERFACE,
-                       "PlaybackStatus",
-                       DBUS_TYPE_STRING,
-                       &playback_status[value].property)) {
-                       BT_DBG("Error sending the PropertyChanged signal \n");
+       case STATUS:
+               value = properties->status;
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
+                               BT_MEDIA_PLAYER_INTERFACE, "PlaybackStatus",
+                               g_variant_new_string(player_status[value].property))) {
+                       BT_ERR("Error sending the PropertyChanged signal \n");
                        return BLUETOOTH_ERROR_INTERNAL;
                }
                break;
        case POSITION:
                value = properties->position;
-               if (!__bt_media_emit_property_changed(
-                       conn,
-                       BT_MEDIA_OBJECT_PATH,
-                       BT_MEDIA_PLAYER_INTERFACE,
-                       "Position",
-                       DBUS_TYPE_UINT32,
-                       &value)) {
-                       BT_DBG("Error sending the PropertyChanged signal \n");
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
+                               BT_MEDIA_PLAYER_INTERFACE, "Position",
+                               g_variant_new_uint32(value))) {
+                       BT_ERR("Error sending the PropertyChanged signal \n");
                        return BLUETOOTH_ERROR_INTERNAL;
                }
                break;
        case METADATA:
                meta_data = properties->metadata;
-               if (!__bt_media_emit_property_changed(
-                       conn,
-                       BT_MEDIA_OBJECT_PATH,
-                       BT_MEDIA_PLAYER_INTERFACE,
-                       "Metadata",
-                       DBUS_TYPE_ARRAY,
-                       &meta_data)) {
-                       BT_DBG("Error sending the PropertyChanged signal \n");
+
+               builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
+               g_variant_builder_add(builder, "{sv}",
+                               "xesam:title", g_variant_new_string(meta_data.title));
+
+               children[0] = g_variant_new_string(meta_data.artist);
+               g_variant_builder_add(builder, "{sv}",
+                               "xesam:artist", g_variant_new_array(G_VARIANT_TYPE_STRING,
+                                               children, 1));
+
+               g_variant_builder_add(builder, "{sv}",
+                               "xesam:album", g_variant_new_string(meta_data.album));
+
+               children[0] = g_variant_new_string(meta_data.genre);
+               g_variant_builder_add(builder, "{sv}",
+                               "xesam:genre", g_variant_new_array(G_VARIANT_TYPE_STRING,
+                                               children, 1));
+
+               g_variant_builder_add(builder, "{sv}",
+                               "xesam:totalTracks", g_variant_new_int32(meta_data.total_tracks));
+
+               g_variant_builder_add(builder, "{sv}",
+                               "xesam:trackNumber", g_variant_new_int32(meta_data.number));
+
+               g_variant_builder_add(builder, "{sv}",
+                               "mpris:length", g_variant_new_int64(meta_data.duration));
+
+               if (!__bt_media_emit_property_changed(g_conn, BT_MEDIA_OBJECT_PATH,
+                               BT_MEDIA_PLAYER_INTERFACE, "Metadata",
+                               g_variant_new("a{sv}", builder))) {
+                       BT_ERR("Error sending the PropertyChanged signal \n");
+                       g_variant_builder_unref(builder);
                        return BLUETOOTH_ERROR_INTERNAL;
                }
+               g_variant_builder_unref(builder);
                break;
        default:
-               BT_DBG("Invalid Type\n");
+               BT_ERR("Invalid Type\n");
                return BLUETOOTH_ERROR_INTERNAL;
        }
-
+       BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
 
 int _bt_avrcp_set_properties(media_player_settings_t *properties)
 {
-       if (_bt_avrcp_set_interal_property(LOOPSTATUS,
-                       properties) != BLUETOOTH_ERROR_NONE) {
-               return BLUETOOTH_ERROR_INTERNAL;
-       }
+       BT_DBG("+");
 
+       if (_bt_avrcp_set_interal_property(REPEAT,
+                               properties) != BLUETOOTH_ERROR_NONE) {
+                       return BLUETOOTH_ERROR_INTERNAL;
+       }
        if (_bt_avrcp_set_interal_property(SHUFFLE,
                        properties) != BLUETOOTH_ERROR_NONE) {
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       if (_bt_avrcp_set_interal_property(PLAYBACKSTATUS,
+       if (_bt_avrcp_set_interal_property(STATUS,
                        properties) != BLUETOOTH_ERROR_NONE) {
                return BLUETOOTH_ERROR_INTERNAL;
        }
@@ -899,25 +624,24 @@ int _bt_avrcp_set_properties(media_player_settings_t *properties)
                        properties) != BLUETOOTH_ERROR_NONE) {
                return BLUETOOTH_ERROR_INTERNAL;
        }
-
+       BT_DBG("-");
        return BLUETOOTH_ERROR_NONE;
 }
 
 int _bt_avrcp_set_property(int type, unsigned int value)
 {
-       media_player_settings_t properties;
-
        BT_DBG("+");
+       media_player_settings_t properties;
 
        switch (type) {
-       case LOOPSTATUS:
-               properties.loopstatus = value;
+       case REPEAT:
+               properties.repeat = value;
                break;
        case SHUFFLE:
                properties.shuffle = value;
                break;
-       case PLAYBACKSTATUS:
-               properties.playbackstatus = value;
+       case STATUS:
+               properties.status = value;
                break;
        case POSITION:
                properties.position = value;
@@ -927,7 +651,9 @@ int _bt_avrcp_set_property(int type, unsigned int value)
                return BLUETOOTH_ERROR_INTERNAL;
        }
 
-       _bt_avrcp_set_interal_property(type, &properties);
+       if (_bt_avrcp_set_interal_property(type,
+                       &properties) != BLUETOOTH_ERROR_NONE)
+               return BLUETOOTH_ERROR_INTERNAL;
 
        BT_DBG("-");