+/* return >1 for a special folder, 0 for a user-folder */
+static gint
+get_rank (const gchar *folder)
+{
+ if (strcmp (folder, "INBOX") == 0)
+ return 1;
+ if (strcmp (folder, modest_local_folder_info_get_type_name(TNY_FOLDER_TYPE_SENT)) == 0)
+ return 2;
+ if (strcmp (folder, modest_local_folder_info_get_type_name(TNY_FOLDER_TYPE_DRAFTS)) == 0)
+ return 3;
+ if (strcmp (folder, modest_local_folder_info_get_type_name(TNY_FOLDER_TYPE_OUTBOX)) == 0)
+ return 4;
+ return 0;
+}
+
+static gint
+folder_name_compare_func (const gchar* folder1, const gchar* folder2)
+{
+ gint r1 = get_rank (folder1);
+ gint r2 = get_rank (folder2);
+
+ if (r1 > 0 && r2 > 0)
+ return r1 - r2;
+ if (r1 > 0 && r2 == 0)
+ return -1;
+ if (r1 == 0 && r2 > 0)
+ return 1;
+ else
+ return modest_text_utils_utf8_strcmp (folder1, folder2, TRUE);
+}
+
+/* FIXME: */
+/* - we're still missing the outbox */
+/* - we need to take care of localization (urgh) */
+/* - what about 'All mail folders'? */
+static void
+on_dbus_method_get_folders (DBusConnection *con, DBusMessage *message)
+{
+ DBusMessage *reply = NULL;
+ ModestAccountMgr *account_mgr = NULL;
+ gchar *account_name = NULL;
+ GList *folder_names = NULL;
+ TnyAccount *account_local = NULL;
+ TnyAccount *account_mmc = NULL;
+
+ /* Get the TnyStoreAccount so we can get the folders: */
+ account_mgr = modest_runtime_get_account_mgr();
+ account_name = modest_account_mgr_get_default_account (account_mgr);
+ if (!account_name) {
+ g_printerr ("modest: no account found\n");
+ }
+
+ if (account_name) {
+ TnyAccount *account = NULL;
+ if (account_mgr) {
+ account = modest_tny_account_store_get_server_account (
+ modest_runtime_get_account_store(), account_name,
+ TNY_ACCOUNT_TYPE_STORE);
+ }
+
+ if (!account) {
+ g_printerr ("modest: failed to get tny account folder'%s'\n", account_name);
+ }
+
+ printf("DEBUG: %s: Getting folders for account name=%s\n", __FUNCTION__, account_name);
+ g_free (account_name);
+ account_name = NULL;
+
+ add_folders_to_list (TNY_FOLDER_STORE (account), &folder_names);
+
+ g_object_unref (account);
+ account = NULL;
+ }
+
+ /* Also add the folders from the local folders account,
+ * because they are (currently) used with all accounts:
+ * TODO: This is not working. It seems to get only the Merged Folder (with an ID of "" (not NULL)).
+ */
+ account_local =
+ modest_tny_account_store_get_local_folders_account (modest_runtime_get_account_store());
+ add_folders_to_list (TNY_FOLDER_STORE (account_local), &folder_names);
+
+ g_object_unref (account_local);
+ account_local = NULL;
+
+ /* Obtain the mmc account */
+ account_mmc =
+ modest_tny_account_store_get_mmc_folders_account (modest_runtime_get_account_store());
+ if (account_mmc) {
+ add_folders_to_list (TNY_FOLDER_STORE (account_mmc), &folder_names);
+ g_object_unref (account_mmc);
+ account_mmc = NULL;
+ }
+
+ /* specs require us to sort the folder names, although
+ * this is really not the place to do that...
+ */
+ folder_names = g_list_sort (folder_names,
+ (GCompareFunc)folder_name_compare_func);
+
+ /* Put the result in a DBus reply: */
+ reply = dbus_message_new_method_return (message);
+
+ get_folders_result_to_message (reply, folder_names);
+
+ if (reply == NULL) {
+ g_warning ("%s: Could not create reply.", __FUNCTION__);
+ }
+
+ if (reply) {
+ dbus_uint32_t serial = 0;
+ dbus_connection_send (con, reply, &serial);
+ dbus_connection_flush (con);
+ dbus_message_unref (reply);
+ }
+
+ g_list_foreach (folder_names, (GFunc)g_free, NULL);
+ g_list_free (folder_names);
+}
+
+
+/** This D-Bus handler is used when the main osso-rpc
+ * D-Bus handler has not handled something.
+ * We use this for D-Bus methods that need to use more complex types
+ * than osso-rpc supports.
+ */
+DBusHandlerResult
+modest_dbus_req_filter (DBusConnection *con,
+ DBusMessage *message,
+ void *user_data)
+{
+ gboolean handled = FALSE;
+
+ if (dbus_message_is_method_call (message,
+ MODEST_DBUS_IFACE,
+ MODEST_DBUS_METHOD_SEARCH)) {
+ on_dbus_method_search (con, message);
+ handled = TRUE;
+ } else if (dbus_message_is_method_call (message,
+ MODEST_DBUS_IFACE,
+ MODEST_DBUS_METHOD_GET_FOLDERS)) {
+ on_dbus_method_get_folders (con, message);
+ handled = TRUE;
+ }
+ else {
+ /* Note that this mentions methods that were already handled in modest_dbus_req_handler(). */
+ /*
+ g_debug (" debug: %s: Unexpected (maybe already handled) D-Bus method:\n Interface=%s, Member=%s\n",
+ __FUNCTION__, dbus_message_get_interface (message),
+ dbus_message_get_member(message));
+ */
+ }
+