Ejemplo n.º 1
0
        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);
            }
        }