/* FIXME get the real folder ids of the system folders using * by fetching them using distinguished folder ids once */ static void add_folder_to_summary (CamelEwsStore *store, EEwsFolder *folder) { CamelEwsStoreSummary *ews_summary = store->summary; const EwsFolderId *pfid, *fid; const gchar *dname; gint64 unread, total; EEwsFolderType ftype; fid = e_ews_folder_get_id (folder); pfid = e_ews_folder_get_parent_id (folder); dname = e_ews_folder_get_escaped_name (folder); total = e_ews_folder_get_total_count (folder); unread = e_ews_folder_get_unread_count (folder); ftype = e_ews_folder_get_folder_type (folder); camel_ews_store_summary_new_folder ( ews_summary, fid->id, pfid ? pfid->id : NULL, fid->change_key, dname, ftype, 0, total, e_ews_folder_get_foreign (folder), FALSE); camel_ews_store_summary_set_folder_unread ( ews_summary, fid->id, unread); }
static void sync_created_folders (CamelEwsStore *ews_store, GSList *created_folders, GSList **created_folder_ids) { GSList *l; for (l = created_folders; l != NULL; l = g_slist_next (l)) { EEwsFolder *folder = (EEwsFolder *) l->data; EEwsFolderType ftype; CamelFolderInfo *fi; const EwsFolderId *fid; ftype = e_ews_folder_get_folder_type (folder); if (ftype != E_EWS_FOLDER_TYPE_MAILBOX) continue; fid = e_ews_folder_get_id (folder); /* FIXME: Sort folders so that a child is always added *after* * its parent. But since the old code was already completely * broken and would just go into an endless loop if the server * didn't return the folders in the 'right' order for that, * let's worry about that in a later commit. */ add_folder_to_summary (ews_store, folder); if (created_folder_ids) { *created_folder_ids = g_slist_append (*created_folder_ids, g_strdup (fid->id)); } else { fi = camel_ews_utils_build_folder_info ( ews_store, fid->id); camel_store_folder_created ( CAMEL_STORE (ews_store), fi); camel_subscribable_folder_subscribed ( CAMEL_SUBSCRIBABLE (ews_store), fi); camel_folder_info_free (fi); } } }
static void test_time_zones_sync (gconstpointer user_data) { gboolean retval = FALSE; gint i; GError *error = NULL; UhmServer *local_server; EwsTestData *etd = (gpointer) user_data; EwsCalendarConvertData convert_data; EwsFolderId *calendar_fid = NULL; gboolean includes_last_folder = FALSE; gchar *old_sync_state = NULL; gchar **tokens; GSList *zone_location_errors = NULL; local_server = ews_test_get_mock_server (); ews_test_server_set_trace_directory (local_server, etd->version, "calendar/timezones"); ews_test_server_start_trace (local_server, etd, "get_server_time_zones_sync", &error); if (error != NULL) { g_printerr ("\n%s\n", error->message); goto exit; } while (!includes_last_folder) { GSList *folders_created = NULL; GSList *folders_updated = NULL; GSList *folders_deleted = NULL; GSList *l; gchar *new_sync_state = NULL; gboolean found = FALSE; old_sync_state = new_sync_state; e_ews_connection_sync_folder_hierarchy_sync ( etd->connection, EWS_PRIORITY_MEDIUM, old_sync_state, &new_sync_state, &includes_last_folder, &folders_created, &folders_updated, &folders_deleted, NULL, &error); if (error != NULL) { g_free (old_sync_state); g_printerr ("\n%s\n", error->message); goto exit; } for (l = folders_created; l != NULL; l = l->next) { EEwsFolder *folder = l->data; if (e_ews_folder_get_folder_type (folder) == E_EWS_FOLDER_TYPE_CALENDAR) { const EwsFolderId *fid; fid = e_ews_folder_get_id (folder); calendar_fid = g_new0 (EwsFolderId, 1); calendar_fid->id = g_strdup (fid->id); calendar_fid->change_key = g_strdup (fid->change_key); found = TRUE; break; } } g_slist_free_full (folders_created, g_object_unref); g_slist_free_full (folders_updated, g_object_unref); g_slist_free_full (folders_deleted, g_free); g_free (old_sync_state); old_sync_state = NULL; if (found) { g_free (new_sync_state); break; } } if (!calendar_fid) { g_printerr ("No calendar folder found\n"); goto exit; } convert_data.connection = etd->connection; convert_data.default_zone = icaltimezone_get_utc_timezone (); tokens = g_strsplit (str_comp, "ICAL_TIMEZONE", 0); for (i = 0; i < builtin_timezones->num_elements; i++) { GSList *ll; GSList *ids = NULL; icaltimezone *zone; ECalComponent *comp; const gchar *zone_location; gchar *str; zone = icalarray_element_at (builtin_timezones, i); zone_location = icaltimezone_get_location (zone); if (is_a_known_unknown_timezone (zone_location)) continue; str = g_strdup_printf ("%s%s%s%s%s", tokens[0], zone_location, tokens[1], zone_location, tokens[2]); comp = e_cal_component_new_from_string (str); g_free (str); convert_data.icalcomp = e_cal_component_get_icalcomponent (comp); e_ews_connection_create_items_sync ( etd->connection, EWS_PRIORITY_MEDIUM, "SaveOnly", "SendToNone", calendar_fid, convert_calcomp_to_xml, &convert_data, &ids, NULL, &error); g_object_unref (comp); if (error != NULL) { g_printerr ("\n%s\n", error->message); g_clear_error (&error); zone_location_errors = g_slist_append (zone_location_errors, g_strdup (zone_location)); continue; } for (ll = ids; ll != NULL; ll = ll->next) { EEwsItem *item = ll->data; if (e_ews_item_get_item_type (item) == E_EWS_ITEM_TYPE_ERROR) { const GError *item_error = e_ews_item_get_error (item); g_printerr ("\n%s\n", item_error->message); g_clear_error (&error); zone_location_errors = g_slist_append (zone_location_errors, g_strdup (zone_location)); continue; } } g_slist_free_full (ids, g_object_unref); } retval = zone_location_errors == NULL; exit: if (zone_location_errors != NULL) { GSList *l; g_printerr ("Errors found in: \n"); for (l = zone_location_errors; l != NULL; l = l->next) g_printerr (" - %s\n", (gchar *) l->data); g_slist_free_full (zone_location_errors, g_free); } uhm_server_end_trace (local_server); g_clear_error (&error); g_assert (retval == TRUE); }
static void sync_updated_folders (CamelEwsStore *store, GSList *updated_folders) { CamelEwsStoreSummary *ews_summary = store->summary; GSList *l; for (l = updated_folders; l != NULL; l = g_slist_next (l)) { EEwsFolder *ews_folder = (EEwsFolder *) l->data; EEwsFolderType ftype; gchar *folder_name; gchar *display_name; const EwsFolderId *fid, *pfid; ftype = e_ews_folder_get_folder_type (ews_folder); if (ftype != E_EWS_FOLDER_TYPE_MAILBOX) continue; fid = e_ews_folder_get_id (ews_folder); folder_name = camel_ews_store_summary_get_folder_full_name ( ews_summary, fid->id, NULL); if (!folder_name) { /* in case the folder is not in the local store summary, just add it as a new folder */ add_folder_to_summary (store, ews_folder); continue; } pfid = e_ews_folder_get_parent_id (ews_folder); display_name = g_strdup (e_ews_folder_get_escaped_name (ews_folder)); /* If the folder is moved or renamed (which are separate * operations in Exchange, unfortunately, then the name * or parent folder will change. Handle both... */ if (pfid || display_name) { GError *error = NULL; gchar *new_fname = NULL; if (pfid) { gchar *pfname; /* If the display name wasn't changed, its basename is still * the same as it was before... */ if (!display_name) display_name = camel_ews_store_summary_get_folder_name ( ews_summary, fid->id, NULL); if (!display_name) goto done; pfname = camel_ews_store_summary_get_folder_full_name ( ews_summary, pfid->id, NULL); /* If the lookup failed, it'll be because the new parent folder * is the message folder root. */ if (pfname) { new_fname = g_strconcat ( pfname, "/", display_name, NULL); g_free (pfname); } else new_fname = g_strdup (display_name); } else { /* Parent folder not changed; just basename */ const gchar *last_slash; /* Append new display_name to old parent directory name... */ last_slash = g_strrstr (folder_name, "/"); if (last_slash) new_fname = g_strdup_printf ( "%.*s/%s", (gint)(last_slash - folder_name), folder_name, display_name); else /* ...unless it was a child of the root folder */ new_fname = g_strdup (display_name); } if (strcmp (new_fname, folder_name)) ews_utils_rename_folder ( store, ftype, fid->id, fid->change_key, pfid ? pfid->id : NULL, display_name, folder_name, &error); g_free (new_fname); g_clear_error (&error); } done: g_free (folder_name); g_free (display_name); } }