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(); }
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); }