static void action_address_book_delete_cb (GtkAction *action, EBookShellView *book_shell_view) { EShellView *shell_view; EShellWindow *shell_window; EBookShellBackend *book_shell_backend; EBookShellSidebar *book_shell_sidebar; ESource *source; ESourceSelector *selector; ESourceGroup *source_group; ESourceList *source_list; EBookClient *book; gint response; GError *error = NULL; shell_view = E_SHELL_VIEW (book_shell_view); shell_window = e_shell_view_get_shell_window (shell_view); book_shell_backend = book_shell_view->priv->book_shell_backend; source_list = e_book_shell_backend_get_source_list (book_shell_backend); book_shell_sidebar = book_shell_view->priv->book_shell_sidebar; selector = e_book_shell_sidebar_get_selector (book_shell_sidebar); source = e_source_selector_get_primary_selection (selector); g_return_if_fail (source != NULL); response = e_alert_run_dialog_for_args ( GTK_WINDOW (shell_window), "addressbook:ask-delete-addressbook", e_source_peek_name (source), NULL); if (response != GTK_RESPONSE_YES) return; book = e_book_client_new (source, &error); if (error != NULL) { g_warning ("Error removing addressbook: %s", error->message); g_error_free (error); return; } if (!e_client_remove_sync (E_CLIENT (book), NULL, NULL)) { e_alert_run_dialog_for_args ( GTK_WINDOW (shell_window), "addressbook:remove-addressbook", NULL); g_object_unref (book); return; } if (e_source_selector_source_is_selected (selector, source)) e_source_selector_unselect_source (selector, source); source_group = e_source_peek_group (source); e_source_group_remove_source (source_group, source); e_source_list_sync (source_list, NULL); g_object_unref (book); }
static void on_delete_cb(GtkAction *action, EShellView *shell_view) { EShellSidebar *shell_sidebar = e_shell_view_get_shell_sidebar(shell_view); ESourceSelector *selector; g_object_get(shell_sidebar, "selector", &selector, NULL); ESource *source = e_source_selector_peek_primary_selection(selector); if (e_alert_run_dialog_for_args(GTK_WINDOW(shell_view), "calendar:prompt-delete-calendar", e_source_peek_name(source), NULL) != GTK_RESPONSE_YES) { g_object_unref (selector); return; } ESourceGroup *group = e_source_peek_group(source); char *calname = (char *)e_source_get_property(source, "eee-calname"); EeeAccount *account; GError *err = NULL; if (!eee_plugin_online) { display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (selector)), _("This action is not available with 3e plugin in offline mode.")); g_object_unref (selector); return; } if (!e_source_is_3e_owned_calendar(source)) { display_error_message (gtk_widget_get_toplevel (GTK_WIDGET (selector)), _("This action is available only for 3e calendars.")); g_object_unref (selector); return; } g_object_unref (selector); account = eee_accounts_manager_find_account_by_source(mgr(), source); if (eee_account_delete_calendar(account, calname)) { // get ECal and remove calendar from the server ECalClient *ecal = e_cal_client_new(source, E_CAL_CLIENT_SOURCE_TYPE_EVENTS, &err); if (!e_client_remove_sync((EClient *)ecal, NULL, &err)) { g_warning("** EEE ** ECal remove failed (%d:%s)", err->code, err->message); g_clear_error(&err); } g_object_unref(ecal); e_source_group_remove_source(group, source); } eee_account_disconnect(account); eee_accounts_manager_restart_sync(mgr()); }
void eee_accounts_manager_activate_accounts(EeeAccountsManager *self) { GSList *iter, *iter2, *iter2_next, *iter_next; g_return_if_fail(IS_EEE_ACCOUNTS_MANAGER(self)); // for each accessible account for (iter = self->priv->access_accounts; iter; iter = iter->next) { EeeAccount *account; ESourceGroup *group; char *name = iter->data; char *group_name = g_strdup_printf("3e: %s", name); // find ESourceGroup and EeeAccount #if EVOLUTION_VERSION >= 232 group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", group_name, NULL); #else group = e_source_list_peek_group_by_name(self->priv->eslist, group_name); #endif /* EVOLUTION_VERSION >= 232 */ account = eee_accounts_manager_find_account_by_name(self, name); // create account if it does not exist if (account == NULL) { account = eee_account_new(name); eee_account_set_state(account, EEE_ACCOUNT_STATE_NOTAVAIL); eee_accounts_manager_add_account(self, account); } // create group if it does not exist if (group == NULL) { group = e_source_group_new(group_name, EEE_URI_PREFIX); e_source_list_add_group(self->priv->eslist, group, -1); g_object_unref(group); } else { // check group sources for (iter2 = e_source_group_peek_sources(group); iter2 != NULL; iter2 = iter2_next) { // we may be removing sources so ensure that we have valid next pointer iter2_next = iter2->next; ESource *source = iter2->data; if (e_source_is_3e(source)) { const char *calname = e_source_get_property(source, "eee-calname"); e_source_set_3e_properties(source, calname, account->name, account, NULL, NULL, 0); } else { // ESource without calname is useless, drop it e_source_group_remove_source(group, source); } } g_free(group_name); } g_object_set_data(G_OBJECT(group), "accessible", (gpointer)TRUE); } // for each ESourceGroup that does not represent accessible account for (iter = e_source_list_peek_groups(self->priv->eslist); iter; iter = iter_next) { iter_next = iter->next; ESourceGroup *group = iter->data; gboolean contains_source = FALSE; // skip non-3E groups and accessible groups initialized above if (!e_source_group_is_3e(group) || g_object_get_data(G_OBJECT(group), "accessible")) { continue; } for (iter2 = e_source_group_peek_sources(group); iter2 != NULL; iter2 = iter2_next) { // we may be removing sources so ensure that we have valid next pointer iter2_next = iter2->next; ESource *source = iter2->data; // these ESources are probably for shared calendars, if we can't find // account for them, remove them if (eee_accounts_manager_find_account_by_source(self, source)) { contains_source = TRUE; } else { e_source_group_remove_source(group, source); } } if (!contains_source) { e_source_list_remove_group(self->priv->eslist, group); } } e_source_list_sync(self->priv->eslist, NULL); }
/* sync finish phase */ static gboolean eee_accounts_manager_sync_phase2(EeeAccountsManager *self) { GSList *iter, *iter2, *iter_next, *iter2_next; g_return_val_if_fail(IS_EEE_ACCOUNTS_MANAGER(self), FALSE); // unmark groups/sources for (iter = e_source_list_peek_groups(self->priv->eslist); iter; iter = iter->next) { ESourceGroup *group = E_SOURCE_GROUP(iter->data); if (!e_source_group_is_3e(group)) { continue; } g_object_set_data(G_OBJECT(group), "synced", (gpointer)FALSE); for (iter2 = e_source_group_peek_sources(group); iter2; iter2 = iter2->next) { ESource *source = E_SOURCE(iter2->data); g_object_set_data(G_OBJECT(source), "synced", (gpointer)FALSE); } } // go through synced account description structures and update ESourceList // accordingly for (iter = self->priv->sync_accounts; iter; iter = iter->next) { EeeAccount *account = iter->data; EeeAccount *current_account; ESourceGroup *group; char *group_name = g_strdup_printf("3e: %s", account->name); // find ESourceGroup and EeeAccount #if EVOLUTION_VERSION >= 232 group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", group_name, NULL); #else group = e_source_list_peek_group_by_name(self->priv->eslist, group_name); #endif /* EVOLUTION_VERSION >= 232 */ current_account = eee_accounts_manager_find_account_by_name(self, account->name); if (account->state == EEE_ACCOUNT_STATE_DISABLED) { if (current_account) { eee_accounts_manager_remove_account(self, current_account); } if (group) { e_source_list_remove_group(self->priv->eslist, group); } g_object_unref(account); continue; } // create account if it does not exist if (current_account == NULL) { eee_accounts_manager_add_account(self, g_object_ref(account)); } else { eee_account_copy(current_account, account); } // create group if it does not exist if (group == NULL) { group = e_source_group_new(group_name, EEE_URI_PREFIX); e_source_list_add_group(self->priv->eslist, group, -1); g_object_unref(group); } g_free(group_name); // check group sources if account is available, otherwise just mark them as // synced if (account->state == EEE_ACCOUNT_STATE_NOTAVAIL) { GSList *iter_grp, *iter_src; for (iter_grp = e_source_list_peek_groups(self->priv->eslist); iter_grp; iter_grp = iter_grp->next) { ESourceGroup *group = iter_grp->data; for (iter_src = e_source_group_peek_sources(group); iter_src; iter_src = iter_src->next) { ESource *source = iter_src->data; const char *account_name = e_source_get_property(source, "eee-account"); if (account_name && !strcmp(account_name, account->name)) { g_object_set_data(G_OBJECT(source), "synced", (gpointer)TRUE); g_object_set_data(G_OBJECT(group), "synced", (gpointer)TRUE); } } } } else { GArray * cals = eee_account_peek_calendars (account); guint i; for (i = 0; i < cals->len; i++) { ESCalendarInfo *cal = g_array_index (cals, ESCalendarInfo *, i); ESource *source; if (!strcmp(cal->owner, account->name)) { // calendar owned by owner of account that represents current group source = e_source_group_peek_source_by_calname(group, cal->name); if (source == NULL) { source = e_source_new_3e_with_attrs(cal->name, cal->owner, account, cal->perm, cal->attrs); e_source_group_add_source(group, source, -1); g_object_unref(source); } else { e_source_set_3e_properties_with_attrs(source, cal->name, cal->owner, account, cal->perm, cal->attrs); } } else { char *owner_group_name = g_strdup_printf("3e: %s", cal->owner); // shared calendar, it should be put into another group #if EVOLUTION_VERSION >= 232 ESourceGroup *owner_group = e_source_list_peek_group_by_properties(self->priv->eslist, "name", owner_group_name, NULL); #else ESourceGroup *owner_group = e_source_list_peek_group_by_name(self->priv->eslist, owner_group_name); #endif /* EVOLUTION_VERSION >= 232 */ if (owner_group == NULL) { owner_group = e_source_group_new(owner_group_name, EEE_URI_PREFIX); e_source_list_add_group(self->priv->eslist, owner_group, -1); g_object_unref(owner_group); } g_object_set_data(G_OBJECT(owner_group), "synced", (gpointer)TRUE); source = e_source_group_peek_source_by_calname(owner_group, cal->name); if (source == NULL) { source = e_source_new_3e_with_attrs(cal->name, cal->owner, account, cal->perm, cal->attrs); e_source_group_add_source(owner_group, source, -1); g_object_unref(source); } else { e_source_set_3e_properties_with_attrs(source, cal->name, cal->owner, account, cal->perm, cal->attrs); } } g_object_set_data(G_OBJECT(source), "synced", (gpointer)TRUE); } } g_object_set_data(G_OBJECT(group), "synced", (gpointer)TRUE); g_object_unref(account); } g_slist_free(self->priv->sync_accounts); self->priv->sync_accounts = NULL; // remove non-marked sources/groups for (iter = e_source_list_peek_groups(self->priv->eslist); iter; iter = iter_next) { ESourceGroup *group = E_SOURCE_GROUP(iter->data); iter_next = iter->next; if (!e_source_group_is_3e(group)) { continue; } if (g_object_get_data(G_OBJECT(group), "synced")) { for (iter2 = e_source_group_peek_sources(group); iter2; iter2 = iter2_next) { ESource *source = E_SOURCE(iter2->data); iter2_next = iter2->next; if (!g_object_get_data(G_OBJECT(source), "synced")) { e_source_group_remove_source(group, source); } } } else { e_source_list_remove_group(self->priv->eslist, group); } } e_source_list_sync(self->priv->eslist, NULL); return TRUE; }