#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;
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;
}
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)
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;
}
}
dbus_message_unref(reply);
+ DBG("-\n");
}
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);
session->user_data);
}
dbus_message_unref(reply);
+ DBG("-\n");
}
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)) {
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("/");
*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,
messages_folder_listing_cb callback,
void *user_data)
{
+ DBG("+\n");
struct session *session = s;
session->name = g_strdup(name);
session->max = max;
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,
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;
}
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);
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;
}
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)) {
}
}
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;
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;
}
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)) {
}
}
dbus_message_unref(reply);
+ DBG("-\n");
}
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);
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,
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, ®,
+ 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;
}