Example #1
0
        private async Task SyncMailboxesAsync()
        {
            Application.Current.AssertBackgroundThread();

            lock (_syncChildrenMutex) {
                if (IsSyncingChildren)
                {
                    return;
                }

                IsSyncingChildren = true;
            }

            try {
                var pattern  = string.Format("{0}{1}%", Name, Delimiter);
                var children = await _account.ListMailboxesAsync(pattern);

                var subscribed = await _account.ListSubscribedMailboxesAsync(pattern);

                using (var database = new DatabaseContext()) {
                    foreach (var child in children)
                    {
                        var c       = child;
                        var mailbox = await database.Mailboxes.FirstOrDefaultAsync(x => x.Name == c.Fullname);

                        if (mailbox != null)
                        {
                            continue;
                        }

                        var context = new MailboxContext(_account, new MailboxModel {
                            AccountId = _account.Id
                        });

                        await context.InsertAsync();

                        await context.BindMailboxAsync(child, subscribed);

                        await Application.Current.Dispatcher
                        .InvokeAsync(() => _account.NotifyMailboxAdded(context));
                    }
                }
            } finally {
                lock (_syncChildrenMutex) {
                    IsSyncingChildren = false;
                }
            }
        }