+2007-06-03 Christian Kellner <ckellner@openismus.com>
+
+ * libmodest-dbus-client/libmodest-dbus-client.h:
+ * libmodest-dbus-client/libmodest-dbus-client.c:
+ (libmodest_dbus_client_delete_message):
+ Implement deletion of messages (Client side).
+
+ (modest_search_hit_free),
+ (modest_search_hit_list_free):
+ Utility functions to free the result hits.
+
+ * src/dbus_api/modest-dbus-api.h:
+ * src/dbus_api/modest-dbus-callbacks.c:
+ (on_delete_message),
+ (modest_dbus_req_handler):
+ Implement deletion of messages (Server side).
+
+ * tests/dbus_api/test_search.c: (main):
+ Free the hits.
+
+ * tests/dbus_api/Makefile.am:
+ * tests/dbus_api/test_delete_message:
+ Add little test for the message deletion logic
+
2007-06-03 Armin Burgmeier <armin@openismus.com>
* src/modest-mail-operation-queue.c: Fixed a deadlock in finalize()
return TRUE;
}
-static void
+gboolean
+libmodest_dbus_client_delete_message (osso_context_t *osso_ctx,
+ const char *msg_uri)
+{
+ osso_rpc_t retval;
+ osso_return_t ret;
+
+ ret = osso_rpc_run_with_defaults (osso_ctx,
+ MODEST_DBUS_NAME,
+ MODEST_DBUS_METHOD_DELETE_MESSAGE, &retval,
+ DBUS_TYPE_STRING, msg_uri,
+ DBUS_TYPE_INVALID);
+
+ if (ret != OSSO_OK) {
+ g_debug ("debug: osso_rpc_run() failed.\n");
+ } else {
+ g_debug ("debug: osso_rpc_run() succeeded.\n");
+ }
+
+ osso_rpc_free_val (&retval);
+
+ return ret == OSSO_OK;
+}
+
+void
modest_search_hit_free (ModestSearchHit *hit)
{
g_free (hit->msgid);
-
g_slice_free (ModestSearchHit, hit);
}
+void
+modest_search_hit_list_free (GList *hits)
+{
+ GList *iter;
+
+ for (iter = hits; iter; iter = iter->next) {
+ modest_search_hit_free ((ModestSearchHit *) iter->data);
+ }
+
+ g_list_free (hits);
+}
static char *
_dbus_iter_get_string_or_null (DBusMessageIter *iter)
} ModestSearchHit;
-gboolean
-libmodest_dbus_client_search (osso_context_t *osso_ctx,
- const gchar *query,
- const gchar *folder,
- time_t start_date,
- time_t end_date,
- guint32 min_size,
- ModestDBusSearchFlags flags,
- GList **hits);
+void modest_search_hit_free (ModestSearchHit *hit);
+void modest_search_hit_list_free (GList *hits);
+
+
+gboolean libmodest_dbus_client_search (osso_context_t *osso_ctx,
+ const gchar *query,
+ const gchar *folder,
+ time_t start_date,
+ time_t end_date,
+ guint32 min_size,
+ ModestDBusSearchFlags flags,
+ GList **hits);
+gboolean libmodest_dbus_client_delete_message (osso_context_t *osso_ctx,
+ const char *msg_uri);
#endif /* __LIBMODEST_DBUS_CLIENT_H__ */
#define MODEST_DBUS_METHOD_SEARCH "Search"
+#define MODEST_DBUS_METHOD_DELETE_MESSAGE "DeleteMessage"
+enum ModestDbusDeleteMessageArguments
+{
+ MODEST_DEBUS_DELETE_MESSAGE_ARG_URI,
+ MODEST_DEBUS_DELETE_MESSAGE_ARGS_COUNT
+};
#include <stdio.h>
#include <string.h>
+#include <tny-list.h>
+#include <tny-iterator.h>
+#include <tny-simple-list.h>
+
typedef struct
{
gchar *to;
}
+static gint
+on_delete_message (GArray *arguments, gpointer data, osso_rpc_t *retval)
+{
+ TnyList *headers;
+ TnyFolder *folder;
+ TnyIterator *iter;
+ TnyHeader *header;
+ TnyHeader *msg_header;
+ TnyMsg *msg;
+ TnyAccount *account;
+ GError *error;
+ osso_rpc_t val;
+ const char *uri;
+ const char *uid;
+ gint res;
+
+ if (arguments->len != MODEST_DEBUS_DELETE_MESSAGE_ARGS_COUNT) {
+ return OSSO_ERROR;
+ }
+
+ val = g_array_index (arguments,
+ osso_rpc_t,
+ MODEST_DEBUS_DELETE_MESSAGE_ARG_URI);
+
+ uri = (const char *) val.value.s;
+
+ g_debug ("Searching message (delete message)");
+
+ msg = find_message_by_url (uri, &account);
+
+ if (msg == NULL) {
+ return OSSO_ERROR;
+ }
+
+ g_debug ("Found message");
+
+ msg_header = tny_msg_get_header (msg);
+ uid = tny_header_get_uid (msg_header);
+ folder = tny_msg_get_folder (msg);
+
+
+ /* tny_msg_get_header () flaw:
+ * From tinythingy doc: You can't use the returned instance with the
+ * TnyFolder operations
+ *
+ * To get a header instance that will work with these folder methods,
+ * you can use tny_folder_get_headers.
+ *
+ * Ok, we will do so then. Sigh.
+ * */
+ headers = tny_simple_list_new ();
+
+ tny_folder_get_headers (folder, headers, TRUE, NULL);
+ iter = tny_list_create_iterator (headers);
+ header = NULL;
+
+ g_debug ("Searching header for msg in folder");
+ while (!tny_iterator_is_done (iter)) {
+ const char *cur_id;
+
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ cur_id = tny_header_get_uid (header);
+
+ if (cur_id && uid && g_str_equal (cur_id, uid)) {
+ g_debug ("Found correspoding header from folder");
+ break;
+ }
+
+ header = NULL;
+ g_object_unref (header);
+ tny_iterator_next (iter);
+ }
+
+ g_object_unref (iter);
+ g_object_unref (headers);
+
+ g_object_unref (msg_header);
+ g_object_unref (msg);
+
+ if (header == NULL) {
+ g_object_unref (folder);
+ return OSSO_ERROR;
+ }
+
+
+ error = NULL;
+ res = OSSO_OK;
+ tny_folder_remove_msg (folder, header, &error);
+
+ if (error != NULL) {
+ res = OSSO_ERROR;
+ g_error_free (error);
+ }
+
+ g_object_unref (folder);
+ return res;
+}
+
static gboolean
on_idle_send_receive(gpointer user_data)
{
osso_rpc_t * retval)
{
- printf("debug: modest_dbus_req_handler()\n");
- printf("debug: method received: %s\n", method);
+ g_debug ("modest_dbus_req_handler()\n");
+ g_debug ("debug: method received: %s\n", method);
if (g_ascii_strcasecmp(method, MODEST_DBUS_METHOD_SEND_MAIL) == 0) {
return on_send_mail (arguments, data, retval);
return on_send_receive (arguments, data, retval);
} else if (g_ascii_strcasecmp(method, MODEST_DBUS_METHOD_COMPOSE_MAIL) == 0) {
return on_compose_mail (arguments, data, retval);
+ } else if (g_ascii_strcasecmp(method, MODEST_DBUS_METHOD_DELETE_MESSAGE) == 0) {
+ return on_delete_message (arguments,data, retval);
}
- else {
+ else {
/* We need to return INVALID here so
* osso is returning DBUS_HANDLER_RESULT_NOT_YET_HANDLED
* so our modest_dbus_req_filter can kick in!
$(MODEST_LIBTINYMAIL_MAEMO_LIBS) \
${top_srcdir}/libmodest-dbus-client/libmodest-dbus-client-1.0.la
-noinst_PROGRAMS = test_send_mail test_mail_to test_open_message test_search
+noinst_PROGRAMS = test_send_mail \
+ test_mail_to \
+ test_open_message \
+ test_search \
+ test_delete_message
test_send_mail_SOURCES = test_send_mail.c
test_send_mail_LDADD = $(objects)
test_search_SOURCES = test_search.c
test_search_LDADD = $(objects)
+test_delete_message_SOURCES = test_delete_message.c
+test_delete_message_LDADD = $(objects)
+
--- /dev/null
+#include <libmodest-dbus-client/libmodest-dbus-client.h>
+#include <stdio.h>
+
+int
+main (int argc, char *argv[])
+{
+ osso_context_t *osso_context;
+ const char *url;
+ gboolean ret;
+
+ osso_context = osso_initialize ("test_delete_msg",
+ "0.0.1",
+ TRUE,
+ NULL);
+
+ if (osso_context == NULL) {
+ g_printerr ("osso_initialize() failed.\n");
+ return -1;
+ }
+
+ if (argc == 2) {
+ url = argv[1];
+ } else {
+ url = "local://???FIXME???";
+ }
+
+ g_print ("Trying to delete msg: %s\n", url);
+ ret = libmodest_dbus_client_delete_message (osso_context,
+ url);
+
+ if (!ret) {
+ g_printerr ("libmodest_dbus_client_delete_message() failed.\n");
+ } else {
+ g_print ("libmodest_dbus_client_delete_message() succeeded.\n");
+ }
+
+ return ret ? 0 : -1;
+
+}
}
+ modest_search_hit_list_free (hits);
+
return res ? 0 : -1;
}