void dsync_brain_mailbox_trees_init(struct dsync_brain *brain) { struct mail_namespace *ns; dsync_brain_check_namespaces(brain); brain->local_mailbox_tree = dsync_mailbox_tree_init(brain->hierarchy_sep, brain->alt_char); /* we'll convert remote mailbox names to use our own separator */ brain->remote_mailbox_tree = dsync_mailbox_tree_init(brain->hierarchy_sep, brain->alt_char); /* fill the local mailbox tree */ for (ns = brain->user->namespaces; ns != NULL; ns = ns->next) { if (!dsync_brain_want_namespace(brain, ns)) continue; if (dsync_mailbox_tree_fill(brain->local_mailbox_tree, ns, brain->sync_box, brain->sync_box_guid, brain->exclude_mailboxes, &brain->mail_error) < 0) { brain->failed = TRUE; break; } } brain->local_tree_iter = dsync_mailbox_tree_iter_init(brain->local_mailbox_tree); }
bool dsync_brain_recv_mailbox_tree_deletes(struct dsync_brain *brain) { const struct dsync_mailbox_node *node; const char *status; const struct dsync_mailbox_delete *deletes; unsigned int i, count; char sep; if (dsync_ibc_recv_mailbox_deletes(brain->ibc, &deletes, &count, &sep) == 0) return FALSE; /* apply remote's mailbox deletions based on our local tree */ dsync_mailbox_tree_set_remote_sep(brain->local_mailbox_tree, sep); for (i = 0; i < count; i++) { dsync_brain_mailbox_tree_add_delete(brain->local_mailbox_tree, brain->remote_mailbox_tree, &deletes[i], &node, &status); if (brain->debug) { const char *node_name = node == NULL ? "" : dsync_mailbox_node_get_full_name(brain->local_mailbox_tree, node); i_debug("brain %c: Remote mailbox tree deletion: guid=%s type=%s timestamp=%ld name=%s local update=%s", brain->master_brain ? 'M' : 'S', guid_128_to_string(deletes[i].guid), dsync_mailbox_delete_type_to_string(deletes[i].type), deletes[i].timestamp, node_name, status); } } /* apply local mailbox deletions based on remote tree */ deletes = dsync_mailbox_tree_get_deletes(brain->local_mailbox_tree, &count); dsync_mailbox_tree_set_remote_sep(brain->remote_mailbox_tree, brain->hierarchy_sep); for (i = 0; i < count; i++) { dsync_brain_mailbox_tree_add_delete(brain->remote_mailbox_tree, brain->local_mailbox_tree, &deletes[i], &node, &status); } dsync_brain_mailbox_trees_sync(brain); brain->state = brain->master_brain ? DSYNC_STATE_MASTER_SEND_MAILBOX : DSYNC_STATE_SLAVE_RECV_MAILBOX; i_assert(brain->local_tree_iter == NULL); brain->local_tree_iter = dsync_mailbox_tree_iter_init(brain->local_mailbox_tree); return TRUE; }
bool dsync_brain_recv_mailbox_tree_deletes(struct dsync_brain *brain) { const struct dsync_mailbox_delete *deletes; unsigned int i, count; char sep; if (dsync_ibc_recv_mailbox_deletes(brain->ibc, &deletes, &count, &sep) == 0) return FALSE; /* apply remote's mailbox deletions based on our local tree */ dsync_mailbox_tree_set_remote_sep(brain->local_mailbox_tree, sep); for (i = 0; i < count; i++) { dsync_brain_mailbox_tree_add_delete(brain->local_mailbox_tree, brain->remote_mailbox_tree, &deletes[i]); } /* apply local mailbox deletions based on remote tree */ deletes = dsync_mailbox_tree_get_deletes(brain->local_mailbox_tree, &count); dsync_mailbox_tree_set_remote_sep(brain->remote_mailbox_tree, brain->hierarchy_sep); for (i = 0; i < count; i++) { dsync_brain_mailbox_tree_add_delete(brain->remote_mailbox_tree, brain->local_mailbox_tree, &deletes[i]); } dsync_brain_mailbox_trees_sync(brain); brain->state = brain->master_brain ? DSYNC_STATE_MASTER_SEND_MAILBOX : DSYNC_STATE_SLAVE_RECV_MAILBOX; i_assert(brain->local_tree_iter == NULL); brain->local_tree_iter = dsync_mailbox_tree_iter_init(brain->local_mailbox_tree); return TRUE; }