long ProcessSourceAddress(SourceAddress address) { List <Profile> profiles; using (mailbox.Profiles.ReaderLock) profiles = mailbox.Profiles.Where(p => p.Address == address.Address).ToList(); if (profiles.Count == 0) { Logger.Debug("Profile for address {0} not found", LogSource.Sync, address); if (String.IsNullOrEmpty(address.DisplayName)) { Logger.Warn("Address {0} had no displayname, ignoring", LogSource.Sync, address); return(-1); } else { // No profile found, try to match on person string name = PersonName.Parse(address.DisplayName).ToString(); List <Person> persons; // The non spaced matche helps with contacts that are for instance called waseemsadiq on twitter and Waseem Sadiq elsewhere using (mailbox.Persons.ReaderLock) persons = mailbox.Persons.Where(c => c.Name == name || c.Name == name.Replace(" ", String.Empty).Trim()).ToList(); if (persons.Count > 0) { Logger.Debug("Profile for address {0} had contact, creating new profile", LogSource.Sync, address); // Add profile to existing person var person = persons.First(); // Person has been redirected if (person.RedirectPersonId.HasValue) { using (mailbox.Persons.ReaderLock) { // Find redirected person Person person1 = person; person = mailbox.Persons.FirstOrDefault(p => p.PersonId == person1.RedirectPersonId); } } if (person != null) { // If personid does not have a value yet, spin until the object is written to the database while (!person.PersonId.HasValue) { Thread.SpinWait(1000); } SaveProfile(person, address); return(person.PersonId.Value); } } Logger.Debug("Person for address {0} not found, creating new person and profile", LogSource.Sync, address); // Create new soft contact and soft profile return(SavePerson(address)); } } else { var profile = profiles.First(); Thread.CurrentThread.ExecuteOnUIThread(delegate { // Set profile message.Profile = profile; profile.Messages.Add(message); if (profile.Person != null) { profile.Person.Messages.Add(message); profile.Person.RebuildScore(); } }); return(profile.PersonId); } }