public Clue Create(ContactModel value) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (value.Folder?.IsFilteredFolder() == true) { value.LoadContactSchemaProperties(); var emails = value.GetEmailAddresses(); var codes = value.CreateEntityCodesFromEmailAddresses(emails).ToList(); if (codes.Count > 0) { var clue = this.Create(EntityType.Infrastructure.User, codes.First()); clue.Data.EntityData.Codes.AddRange(codes.Skip(1)); return(clue); } } return(this.Create(EntityType.Infrastructure.User, value.Object.Id.UniqueId)); }
protected void PopulateContact(Clue clue, ContactModel contact, ExchangeService service) { var value = contact.Object; var data = clue.Data.EntityData; data.Name = value.ExPrintIfAvailable(v => v.DisplayName); data.CreatedDate = value.ExGetIfAvailable(v => v.DateTimeCreated, data.CreatedDate); data.Culture = CultureInfo.InvariantCulture; this.PopulateItem(clue, contact, ExchangeSharedMailboxVocabulary.Contact, service); contact.LoadContactSchemaProperties(); data.DisplayName = value.ExPrintIfAvailable(v => v.DisplayName) ?? data.DisplayName; data.Properties[ExchangeSharedMailboxVocabulary.Contact.Alias] = value.ExPrintIfAvailable(v => v.Alias); data.Properties[ExchangeSharedMailboxVocabulary.Contact.AssistantName] = value.ExPrintIfAvailable(v => v.AssistantName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Birthday] = value.ExPrintIfAvailable(v => v.Birthday); data.Properties[ExchangeSharedMailboxVocabulary.Contact.BusinessHomePage] = value.ExPrintIfAvailable(v => v.BusinessHomePage); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Companies] = value.ExPrintIfAvailable(v => v.Companies); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompanyName] = value.ExPrintIfAvailable(v => v.CompanyName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.FullName] = value.ExPrintIfAvailable(v => v.CompleteName?.FullName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.GivenName] = value.ExPrintIfAvailable(v => v.CompleteName?.GivenName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Initials] = value.ExPrintIfAvailable(v => v.CompleteName?.Initials); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.MiddleName] = value.ExPrintIfAvailable(v => v.CompleteName?.MiddleName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.NickName] = value.ExPrintIfAvailable(v => v.CompleteName?.NickName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Suffix] = value.ExPrintIfAvailable(v => v.CompleteName?.Suffix); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Surname] = value.ExPrintIfAvailable(v => v.CompleteName?.Surname); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.Title] = value.ExPrintIfAvailable(v => v.CompleteName?.Title); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.YomiGivenName] = value.ExPrintIfAvailable(v => v.CompleteName?.YomiGivenName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.CompleteName.YomiSurname] = value.ExPrintIfAvailable(v => v.CompleteName?.YomiSurname); data.Properties[ExchangeSharedMailboxVocabulary.Contact.ContactSource] = value.ExPrintIfAvailable(v => v.ContactSource); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Department] = value.ExPrintIfAvailable(v => v.Department); data.Properties[ExchangeSharedMailboxVocabulary.Contact.DirectoryId] = value.ExPrintIfAvailable(v => v.DirectoryId); data.Properties[ExchangeSharedMailboxVocabulary.Contact.DisplayName] = value.ExPrintIfAvailable(v => v.DisplayName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.FileAs] = value.ExPrintIfAvailable(v => v.FileAs); data.Properties[ExchangeSharedMailboxVocabulary.Contact.FileAsMapping] = value.ExPrintIfAvailable(v => v.FileAsMapping != FileAsMapping.None ? v.FileAsMapping.ToString() : null); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Generation] = value.ExPrintIfAvailable(v => v.Generation); data.Properties[ExchangeSharedMailboxVocabulary.Contact.GivenName] = value.ExPrintIfAvailable(v => v.GivenName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.HasPicture] = value.ExPrintIfAvailable(v => v.HasPicture); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Initials] = value.ExPrintIfAvailable(v => v.Initials); data.Properties[ExchangeSharedMailboxVocabulary.Contact.JobTitle] = value.ExPrintIfAvailable(v => v.JobTitle); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Manager] = value.ExPrintIfAvailable(v => v.Manager); data.Properties[ExchangeSharedMailboxVocabulary.Contact.MiddleName] = value.ExPrintIfAvailable(v => v.MiddleName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Mileage] = value.ExPrintIfAvailable(v => v.Mileage); data.Properties[ExchangeSharedMailboxVocabulary.Contact.NickName] = value.ExPrintIfAvailable(v => v.NickName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Notes] = value.ExPrintIfAvailable(v => v.Notes); data.Properties[ExchangeSharedMailboxVocabulary.Contact.OfficeLocation] = value.ExPrintIfAvailable(v => v.OfficeLocation); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticFirstName] = value.ExPrintIfAvailable(v => v.PhoneticFirstName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticFullName] = value.ExPrintIfAvailable(v => v.PhoneticFullName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneticLastName] = value.ExPrintIfAvailable(v => v.PhoneticLastName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PostalAddressIndex] = value.ExPrintIfAvailable(v => v.PostalAddressIndex); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Profession] = value.ExPrintIfAvailable(v => v.Profession); data.Properties[ExchangeSharedMailboxVocabulary.Contact.SpouseName] = value.ExPrintIfAvailable(v => v.SpouseName); data.Properties[ExchangeSharedMailboxVocabulary.Contact.Surname] = value.ExPrintIfAvailable(v => v.Surname); data.Properties[ExchangeSharedMailboxVocabulary.Contact.WeddingAnniversary] = value.ExPrintIfAvailable(v => v.WeddingAnniversary); // EmailAddresses try { var emails = contact.GetEmailAddresses(); var filteredEmails = contact.GetSmtpEmailAddresses(emails).ToList(); if (filteredEmails.Any()) { data.Properties[ExchangeSharedMailboxVocabulary.Contact.EmailAddress] = filteredEmails.First(); if (filteredEmails.Count > 1) { data.Properties[ExchangeSharedMailboxVocabulary.Contact.EmailAddresses] = string.Join(";", filteredEmails); } data.Aliases.AddRange(filteredEmails); } clue.Data.EntityData.Codes.AddRange(contact.CreateEntityCodesFromEmailAddresses(emails)); } catch (ServiceObjectPropertyException e) { this.state.Log.Warn(() => "Could not get email addresses", e); } // PhoneNumbers { data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.AssistantPhone] = GetPhoneNumber(value, PhoneNumberKey.AssistantPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessFax] = GetPhoneNumber(value, PhoneNumberKey.BusinessFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessPhone] = GetPhoneNumber(value, PhoneNumberKey.BusinessPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessPhone2] = GetPhoneNumber(value, PhoneNumberKey.BusinessPhone2); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Callback] = GetPhoneNumber(value, PhoneNumberKey.Callback); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.CarPhone] = GetPhoneNumber(value, PhoneNumberKey.CarPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.CompanyMainPhone] = GetPhoneNumber(value, PhoneNumberKey.CompanyMainPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomeFax] = GetPhoneNumber(value, PhoneNumberKey.HomeFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomePhone] = GetPhoneNumber(value, PhoneNumberKey.HomePhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.HomePhone2] = GetPhoneNumber(value, PhoneNumberKey.HomePhone2); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Isdn] = GetPhoneNumber(value, PhoneNumberKey.Isdn); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.MobilePhone] = GetPhoneNumber(value, PhoneNumberKey.MobilePhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.OtherFax] = GetPhoneNumber(value, PhoneNumberKey.OtherFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.BusinessFax] = GetPhoneNumber(value, PhoneNumberKey.BusinessFax); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Pager] = GetPhoneNumber(value, PhoneNumberKey.Pager); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.OtherTelephone] = GetPhoneNumber(value, PhoneNumberKey.OtherTelephone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.RadioPhone] = GetPhoneNumber(value, PhoneNumberKey.RadioPhone); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.Telex] = GetPhoneNumber(value, PhoneNumberKey.Telex); data.Properties[ExchangeSharedMailboxVocabulary.Contact.PhoneNumbers.TtyTddPhone] = GetPhoneNumber(value, PhoneNumberKey.TtyTddPhone); } // DirectoryPhoto try { var version = (int)contact.Service.RequestedServerVersion; var additional = new List <PropertyDefinitionBase>() { ContactSchema.Photo }; var filtered = additional.Where(p => ((int)p.Version) <= version).ToArray(); if (filtered.Any()) { var tmp = new PropertySet(BasePropertySet.FirstClassProperties, filtered.Concat(new[] { ItemSchema.Attachments })); if (value.Id != null) { value.ExLoad(this.state, tmp); } var directoryPhoto = value.ExGetIfAvailable(v => v.DirectoryPhoto, null); if (directoryPhoto != null) { using (var stream = new MemoryStream(directoryPhoto)) { var mimeType = FileCrawlingUtility.DetectMimeType(new FileInfo("PreviewImage"), new DataPart(), stream, this.state); if (mimeType.FileDescriptor.Category == FileCategory.ImageBitmap) { var rawDataPart = new RawDataPart() { Type = "/RawData/PreviewImage", MimeType = mimeType.Code, FileName = "preview_{0}".FormatWith(data.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(directoryPhoto), RawData = Convert.ToBase64String(directoryPhoto) }; clue.Details.RawData.Add(rawDataPart); data.PreviewImage = new ImageReferencePart(rawDataPart); } else { this.state.Log.Info(() => $"DirectoryPhoto is not an image: {mimeType.Code}"); } } } } if (value.Attachments != null) { var contactPhotos = value.Attachments.Where(a => a is FileAttachment && ((FileAttachment)a).IsContactPhoto).Cast <FileAttachment>().ToList(); var contactPhoto = contactPhotos.FirstOrDefault(); if (contactPhoto != null) { using (var tempFile = new TemporaryFile(contactPhoto.Name)) { contactPhoto.ExLoad(this.state, tempFile.FilePath); var mimeType = tempFile.FileInfo.ToMimeType(); using (var stream = File.OpenRead(tempFile.FilePath)) { mimeType = FileCrawlingUtility.DetectMimeType(tempFile.FileInfo, new DataPart(), stream, this.state); } if (mimeType.FileDescriptor.Category == FileCategory.ImageBitmap) { using (var stream = File.OpenRead(tempFile.FilePath)) { var bytes = stream.ToArray(); var rawDataPart = new RawDataPart() { Type = "/RawData/PreviewImage", MimeType = mimeType.Code, FileName = "preview_{0}".FormatWith(data.OriginEntityCode.Key), RawDataMD5 = FileHashUtility.GetMD5Base64String(bytes), RawData = Convert.ToBase64String(bytes) }; clue.Details.RawData.Add(rawDataPart); data.PreviewImage = new ImageReferencePart(rawDataPart); } } else { this.state.Log.Info(() => $"ContactPhoto is not an image: {mimeType.Code}"); } } } } } catch (OperationCanceledException) { } catch (Exception e) { this.state.Log.Warn(() => "Could not get DirectoryPhoto", e); } }