Пример #1
0
        internal void Submit(bool submitItems, bool repairDeleted)
        {
            ContactsManager.InsertOrUpdateContact(this);

            if (submitItems)
            {
                foreach (var item in ContactInfos)
                {
                    item.Submit(repairDeleted);
                    ContactsManager.AddLink(this, item);
                }
            }

            RaiseChanged();
        }
Пример #2
0
        private bool ProcessContactsInternal()
        {
            Logger.LogNotice(String.Format("Loading contact info entities for '{0}'. Loading database links.", _addressBook.Name));
            CurrentStateString = "Loading contact info entities.";
            var contactInfosMappings = LoadContactInfosMappings(_addressBook);

            CurrentStateString = "Downloading contacts...";
            Logger.LogNotice(String.Format("Downloading contact info entities for '{0}'.", _addressBook.Name));
            _items = new List <IContactInfo>(_addressBook.AddressBook.GetContacts());
            Logger.LogNotice(String.Format("Download contact info entities for '{0}' finished. Total downloaded: {1}", _addressBook.Name, _items.Count));

            var updatedCount = 0;
            var skippedCount = 0;
            var createdCount = 0;
            var deletedCount = 0;
            var count        = _items.Count;

            for (int i = 0; i < count; i++)
            {
                var item = _items[i];
                CurrentStateString = string.Format("Processing contact {0}/{1}", i, count);
                if (contactInfosMappings.ContainsKey(item.Key))
                {
                    foreach (var contact in contactInfosMappings[item.Key])
                    {
                        var contactInfoLocal = contact.ContactInfos.FirstOrDefault(x => x.Key.Equals(item.Key));
                        if (contactInfoLocal == null)
                        {
                            skippedCount++;
                            continue;
                        }

                        if (contactInfoLocal.VersionGenerator.CompareVersions(contactInfoLocal, item) != VersionsCompareResult.Lower)
                        {
                            skippedCount++;
                            continue;
                        }

                        contactInfoLocal.UpdateFrom(item, false);
                        _contactsManager.InsertOrUpdateContactInfo(contactInfoLocal, false);

                        contactInfoLocal.RaiseChanged();
                        contact.RaiseChanged();

                        updatedCount++;
                    }
                }
                else
                {
                    var contact = new Contact(_contactsManager)
                    {
                        FirstName  = item.FirstName,
                        LastName   = item.LastName,
                        MiddleName = item.MiddleName,
                        Company    = item.Company
                    };

                    var contactInfoLocal = new ContactInfoLocal(item, _addressBook, _contactsManager);
                    contact.LinkContactInfo(contactInfoLocal);

                    _contactsManager.InsertOrUpdateContactInfo(contactInfoLocal, false);
                    if (!contactInfoLocal.IsDeleted)
                    {
                        contact.Submit(false, false);

                        createdCount++;
                    }
                    else
                    {
                        contact.RaiseChanged();
                    }

                    _contactsManager.AddLink(contact, contactInfoLocal);
                }
            }

            CurrentStateString = "Removing deleted contacts...";
            foreach (var item in contactInfosMappings.Where(x => _items.All(y => y.Key != x.Key)))
            {
                foreach (var contact in item.Value)
                {
                    var contactInfo =
                        contact.ContactInfos.FirstOrDefault(x => x.AddressBook.Id == AddressBook.Id && x.Key == item.Key);
                    if (contactInfo == null)
                    {
                        continue;
                    }

                    contact.UnlinkContactInfo(contactInfo);
                    _contactsManager.RemoveContactInfo(contactInfo);

                    if (contact.ContactInfos.Count == 0)
                    {
                        _contactsManager.RemoveContact(contact);
                    }
                    else
                    {
                        contact.Submit(false, false);
                    }

                    deletedCount++;
                }
            }

            Logger.LogNotice(string.Format("Finished contact info entities update for '{0}'. Created: {1}, updated: {2}, skipped: {3} items.", _addressBook.Name, createdCount, updatedCount, skippedCount));
            return(updatedCount > 0 || createdCount > 0 || deletedCount > 0);
        }