upgrade obexd to 0.47
[profile/ivi/obexd.git] / plugins / messages-tizen.c
index 74baf41..7805d5a 100644 (file)
 #define QUERY_GET_MESSAGE "GetMessage"
 #define QUERY_UPDATE_MESSAGE "UpdateMessage"
 #define QUERY_MESSAGE_STATUS "MessageStatus"
+#define QUERY_NOTI_REGISTRATION "NotiRegistration"
 
 #define BT_MAP_SERVICE_OBJECT_PATH "/org/bluez/map_agent"
 #define BT_MAP_SERVICE_NAME "org.bluez.map_agent"
 #define BT_MAP_SERVICE_INTERFACE "org.bluez.MapAgent"
 
+static DBusConnection *g_conn = NULL;
+
+struct mns_reg_data {
+       int notification_status;
+       char *remote_addr;
+};
+
 struct message_folder {
        char *name;
        GSList *subfolders;
@@ -155,6 +163,12 @@ static void create_folder_tree()
 
 int messages_init(void)
 {
+       g_conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
+       if (!g_conn) {
+               error("Can't get on session bus");
+               return -1;
+       }
+
        create_folder_tree();
        return 0;
 }
@@ -162,6 +176,11 @@ int messages_init(void)
 void messages_exit(void)
 {
        destroy_folder_tree(folder_tree);
+
+       if (g_conn) {
+               dbus_connection_unref(g_conn);
+               g_conn = NULL;
+       }
 }
 
 static void message_get_folder_list(DBusPendingCall *call, void *user_data)
@@ -175,7 +194,7 @@ static void message_get_folder_list(DBusPendingCall *call, void *user_data)
        struct message_folder *parent = {0,}, *child = {0,};
        GSList *l;
 
-       DBG("message_get_folder_list \n");
+       DBG("+\n");
 
        for (l = folder_tree->subfolders; l != NULL; l = parent->subfolders)
                parent = l->data;
@@ -203,6 +222,7 @@ static void message_get_folder_list(DBusPendingCall *call, void *user_data)
                }
        }
        dbus_message_unref(reply);
+       DBG("-\n");
 }
 
 static void message_get_msg_list(DBusPendingCall *call, void *user_data)
@@ -218,7 +238,7 @@ static void message_get_msg_list(DBusPendingCall *call, void *user_data)
        struct session *session = user_data;
        struct messages_message *data = g_new0(struct messages_message, 1);
 
-       DBG("message_get_msg_list \n");
+       DBG("+\n");
 
        dbus_error_init(&derr);
 
@@ -258,6 +278,7 @@ static void message_get_msg_list(DBusPendingCall *call, void *user_data)
                                        session->user_data);
        }
        dbus_message_unref(reply);
+       DBG("-\n");
 }
 
 static void message_get_msg(DBusPendingCall *call, void *user_data)
@@ -270,7 +291,7 @@ static void message_get_msg(DBusPendingCall *call, void *user_data)
        struct session *session = user_data;
        char *msg_body;
 
-       DBG("message_get_msg \n");
+       DBG("+\n");
 
        dbus_error_init(&derr);
        if (dbus_set_error_from_message(&derr, reply)) {
@@ -292,10 +313,15 @@ static void message_get_msg(DBusPendingCall *call, void *user_data)
                                        NULL, session->user_data);
        }
        dbus_message_unref(reply);
+       DBG("-\n");
 }
 
 int messages_connect(void **s)
 {
+       DBusPendingCall *call;
+       DBusMessage *message;
+       DBG("+\n");
+
        struct session *session = g_new0(struct session, 1);
 
        session->cwd = g_strdup("/");
@@ -303,48 +329,38 @@ int messages_connect(void **s)
 
        *s = session;
 
-       DBusConnection *conn;
-       DBusPendingCall *call;
-       DBusMessage *message;
-
-
-       conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
-       if (!conn) {
-               error("Can't get on session bus");
-               return -1;
-       }
-
        message = dbus_message_new_method_call(BT_MAP_SERVICE_NAME,
                                                BT_MAP_SERVICE_OBJECT_PATH,
                                                BT_MAP_SERVICE_INTERFACE,
                                                QUERY_GET_FOLDER_TREE);
        if (!message) {
                error("Can't allocate new message");
-               dbus_connection_unref(conn);
                return -1;
        }
 
-       if (dbus_connection_send_with_reply(conn, message, &call, -1) ==
+       if (dbus_connection_send_with_reply(g_conn, message, &call, -1) ==
                        FALSE) {
                error("Could not send dbus message");
                dbus_message_unref(message);
-               dbus_connection_unref(conn);
                return -1;
        }
 
        dbus_pending_call_set_notify(call, message_get_folder_list, session,
                                                NULL);
        dbus_message_unref(message);
-       dbus_connection_unref(conn);
+       DBG("-\n");
        return 0;
 }
 
 void messages_disconnect(void *s)
 {
+       DBG("+\n");
        struct session *session = s;
 
        g_free(session->cwd);
        g_free(session);
+
+       DBG("-\n");
 }
 
 int messages_set_notification_registration(void *session,
@@ -457,6 +473,7 @@ int messages_get_folder_listing(void *s, const char *name,
                                        messages_folder_listing_cb callback,
                                        void *user_data)
 {
+       DBG("+\n");
        struct session *session = s;
        session->name = g_strdup(name);
        session->max = max;
@@ -467,44 +484,30 @@ int messages_get_folder_listing(void *s, const char *name,
        g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, async_get_folder_listing,
                                                session, NULL);
 
+       DBG("-\n");
        return 0;
 }
 
-int messages_get_messages_listing(void *data,
-                               const char *name,
-                               uint16_t max, uint16_t offset,
+int messages_get_messages_listing(void *session, const char *name,
+                               uint16_t max, uint16_t offset, uint8_t subject_len,
                                const struct messages_filter *filter,
                                messages_get_messages_listing_cb callback,
                                void *user_data)
 {
-       DBusConnection *conn;
        DBusPendingCall *call;
        DBusMessage *message;
-       struct session *s = data;
-       struct session *request =  g_new0(struct session, 1);
-       char *folder_name;
+       struct session *s = session;
 
        if (strlen(name) != 0)
-               request->name = g_strdup(name);
+               s->name = g_strdup(name);
         else
-               request->name = g_strdup(s->cwd);
-
-       folder_name = g_strdup(request->name);
-       request->max = max;
-       request->offset = offset;
-       request->filter = filter;
-       request->msg_list_cb = (void *)callback;
-       request->user_data = user_data;
-
-       DBG("messages_get_messages_listing \n");
+               s->name = g_strdup(s->cwd);
 
-       conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
-       if (!conn) {
-               error("Can't get on session bus");
-               g_free(folder_name);
-               g_free(request->name);
-               return -1;
-       }
+       s->max = max;
+       s->offset = offset;
+       s->filter = filter;
+       s->msg_list_cb = (void *)callback;
+       s->user_data = user_data;
 
        message = dbus_message_new_method_call(BT_MAP_SERVICE_NAME,
                                                BT_MAP_SERVICE_OBJECT_PATH,
@@ -512,28 +515,23 @@ int messages_get_messages_listing(void *data,
                                                QUERY_GET_MSG_LIST);
        if (!message) {
                error("Can't allocate new message");
-               dbus_connection_unref(conn);
-               g_free(folder_name);
-               g_free(request->name);
+               g_free(s->name);
                return -1;
        }
-       dbus_message_append_args(message, DBUS_TYPE_STRING, &folder_name,
+       dbus_message_append_args(message, DBUS_TYPE_STRING, &s->name,
                                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(conn, message, &call, -1) ==
+       if (dbus_connection_send_with_reply(g_conn, message, &call, -1) ==
                                        FALSE) {
                error("Could not send dbus message");
                dbus_message_unref(message);
-               dbus_connection_unref(conn);
-               g_free(folder_name);
-               g_free(request->name);
+               g_free(s->name);
                return -1;
        }
-       dbus_pending_call_set_notify(call, message_get_msg_list, request, NULL);
+       dbus_pending_call_set_notify(call, message_get_msg_list, s, NULL);
        dbus_message_unref(message);
-       dbus_connection_unref(conn);
-       g_free(folder_name);
-       g_free(request->name);
+       g_free(s->name);
+       DBG("-\n");
        return 1;
 }
 
@@ -543,12 +541,11 @@ int messages_get_message(void *session,
                                        messages_get_message_cb callback,
                                        void *user_data)
 {
-       DBusConnection *conn;
        DBusPendingCall *call;
        DBusMessage *message;
        struct session *s = session;
        char *message_name;
-
+       DBG("+\n");
 
        if (NULL != handle) {
                message_name =  g_strdup(handle);
@@ -559,40 +556,29 @@ int messages_get_message(void *session,
        s->get_msg_cb = callback;
        s->user_data = user_data;
 
-       DBG("messages_get_message \n");
-
-       conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
-       if (!conn) {
-               error("Can't get on session bus");
-               g_free(message_name);
-               return -1;
-       }
-
        message = dbus_message_new_method_call(BT_MAP_SERVICE_NAME,
                                                BT_MAP_SERVICE_OBJECT_PATH,
                                                BT_MAP_SERVICE_INTERFACE,
                                                QUERY_GET_MESSAGE);
        if (!message) {
                error("Can't allocate new message");
-               dbus_connection_unref(conn);
                g_free(message_name);
                return -1;
        }
        dbus_message_append_args(message, DBUS_TYPE_STRING, &message_name,
                                                        DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(conn, message, &call, -1) ==
+       if (dbus_connection_send_with_reply(g_conn, message, &call, -1) ==
                                        FALSE) {
                error("Could not send dbus message");
                dbus_message_unref(message);
-               dbus_connection_unref(conn);
                g_free(message_name);
                return -1;
        }
        dbus_pending_call_set_notify(call, message_get_msg, s, NULL);
        dbus_message_unref(message);
-       dbus_connection_unref(conn);
        g_free(message_name);
+       DBG("-\n");
        return 1;
 }
 
@@ -603,8 +589,7 @@ static void message_update_msg(DBusPendingCall *call, void *user_data)
        DBusError derr;
        struct session *session = user_data;
        int err;
-
-       DBG("message_get_msg \n");
+       DBG("+\n");
 
        dbus_error_init(&derr);
        if (dbus_set_error_from_message(&derr, reply)) {
@@ -621,25 +606,18 @@ static void message_update_msg(DBusPendingCall *call, void *user_data)
                }
        }
        dbus_message_unref(reply);
+       DBG("-\n");
 }
 
-
 int messages_update_inbox(void *session,
                                        messages_update_inbox_cb callback,
                                        void *user_data)
 {
-       DBusConnection *conn;
        DBusPendingCall *call;
        DBusMessage *message;
        struct session *s = session;
 
-       DBG("messages_update_inbox 123\n");
-
-       conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
-       if (!conn) {
-               error("Can't get on session bus");
-               return -1;
-       }
+       DBG("+\n");
 
        s->msg_update_cb = callback;
        s->user_data = user_data;
@@ -650,20 +628,18 @@ int messages_update_inbox(void *session,
                                                QUERY_UPDATE_MESSAGE);
        if (!message) {
                error("Can't allocate new message");
-               dbus_connection_unref(conn);
                return -1;
        }
 
-       if (dbus_connection_send_with_reply(conn, message, &call, -1) ==
+       if (dbus_connection_send_with_reply(g_conn, message, &call, -1) ==
                                        FALSE) {
                error("Could not send dbus message");
                dbus_message_unref(message);
-               dbus_connection_unref(conn);
                return -1;
        }
        dbus_pending_call_set_notify(call, message_update_msg, s, NULL);
        dbus_message_unref(message);
-       dbus_connection_unref(conn);
+       DBG("-\n");
        return 1;
 }
 
@@ -675,7 +651,7 @@ static void message_status_msg(DBusPendingCall *call, void *user_data)
        struct session *session = user_data;
        int err;
 
-       DBG("message_get_msg \n");
+       DBG("+\n");
 
        dbus_error_init(&derr);
        if (dbus_set_error_from_message(&derr, reply)) {
@@ -692,6 +668,7 @@ static void message_status_msg(DBusPendingCall *call, void *user_data)
                }
        }
        dbus_message_unref(reply);
+       DBG("-\n");
 }
 
 int messages_set_message_status(void *session, const char *handle,
@@ -699,13 +676,12 @@ int messages_set_message_status(void *session, const char *handle,
                                        messages_set_message_status_cb callback,
                                        void *user_data)
 {
-       DBusConnection *conn;
        DBusPendingCall *call;
        DBusMessage *message;
        struct session *s = session;
        char *message_name;
 
-       DBG("messages_set_message_status \n");
+       DBG("+\n");
 
        if (NULL != handle) {
                message_name =  g_strdup(handle);
@@ -717,13 +693,6 @@ int messages_set_message_status(void *session, const char *handle,
        s->msg_status_cb = callback;
        s->user_data = user_data;
 
-       conn = dbus_bus_get(DBUS_BUS_SESSION, NULL);
-       if (!conn) {
-               error("Can't get on session bus");
-               g_free(message_name);
-               return -1;
-       }
-
        message = dbus_message_new_method_call(BT_MAP_SERVICE_NAME,
                                                BT_MAP_SERVICE_OBJECT_PATH,
                                                BT_MAP_SERVICE_INTERFACE,
@@ -731,26 +700,83 @@ int messages_set_message_status(void *session, const char *handle,
        if (!message) {
                error("Can't allocate new message");
                g_free(message_name);
-               dbus_connection_unref(conn);
                return -1;
        }
+
        dbus_message_append_args(message, DBUS_TYPE_STRING, &message_name,
                                                DBUS_TYPE_INT32, &indicator,
                                                DBUS_TYPE_INT32, &value,
                                                DBUS_TYPE_INVALID);
 
-       if (dbus_connection_send_with_reply(conn, message, &call, -1) ==
+       if (dbus_connection_send_with_reply(g_conn, message, &call, -1) ==
                                        FALSE) {
                error("Could not send dbus message");
                g_free(message_name);
                dbus_message_unref(message);
-               dbus_connection_unref(conn);
                return -1;
        }
        dbus_pending_call_set_notify(call, message_status_msg, s, NULL);
        dbus_message_unref(message);
-       dbus_connection_unref(conn);
        g_free(message_name);
+       DBG("-\n");
+       return 1;
+}
+
+static gboolean notification_registration(gpointer user_data)
+{
+       DBG("+\n");
+       DBusMessage *message = NULL;
+       gboolean reg;
+       struct mns_reg_data *data = (struct mns_reg_data *)user_data;
+
+       message = dbus_message_new_method_call(BT_MAP_SERVICE_NAME,
+                                       BT_MAP_SERVICE_OBJECT_PATH,
+                                       BT_MAP_SERVICE_INTERFACE,
+                                       QUERY_NOTI_REGISTRATION);
+       if (!message) {
+               error("Can't allocate new message");
+               goto done;
+       }
+
+       DBG("data->notification_status = %d\n", data->notification_status);
+
+       if (data->notification_status == 1)
+               reg = TRUE;
+       else
+               reg = FALSE;
+
+       dbus_message_append_args(message, DBUS_TYPE_STRING, &data->remote_addr,
+                                               DBUS_TYPE_BOOLEAN, &reg,
+                                               DBUS_TYPE_INVALID);
+
+       if (dbus_connection_send(g_conn, message, NULL) == FALSE)
+               error("Could not send dbus message");
+
+done:
+       if (message)
+               dbus_message_unref(message);
+
+       g_free(data->remote_addr);
+       g_free(data);
+
+       DBG("-\n");
+       return FALSE;
+}
+
+int messages_notification_registration(void *session,
+                               char *address, int status,
+                               messages_notification_registration_cb callback,
+                               void *user_data)
+{
+       DBG("+\n");
+       struct mns_reg_data *data = g_new0(struct mns_reg_data, 1);
+       data->notification_status = status;
+       data->remote_addr = g_strdup(address);
+
+       DBG("status = %d\n", status);
+
+       g_idle_add(notification_registration, data);
+       DBG("-\n");
        return 1;
 }