You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
526 lines
23 KiB
526 lines
23 KiB
//
|
|
// Contact.cs
|
|
//
|
|
// Author: Kees van Spelde <sicos2002@hotmail.com>
|
|
//
|
|
// Copyright (c) 2013-2018 Magic-Sessions. (www.magic-sessions.com)
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to deal
|
|
// in the Software without restriction, including without limitation the rights
|
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
// copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
// THE SOFTWARE.
|
|
//
|
|
|
|
using System;
|
|
|
|
namespace MsgReader.Outlook
|
|
{
|
|
public partial class Storage
|
|
{
|
|
/// <summary>
|
|
/// Class used to contain all the contact information
|
|
/// </summary>
|
|
public sealed class Contact : Storage
|
|
{
|
|
#region Properties
|
|
/// <summary>
|
|
/// Returns the full name (e.g. De heer Kees van Spelde), null when not available
|
|
/// </summary>
|
|
public string DisplayName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the prefix of the name (e.g. De heer), null when not available
|
|
/// </summary>
|
|
public string Prefix { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the initials, null when not available
|
|
/// </summary>
|
|
public string Initials { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the sur name (e.g. Spelde), null when not available
|
|
/// </summary>
|
|
public string SurName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the given name (e.g. Kees), null when not available
|
|
/// </summary>
|
|
public string GivenName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the generation (e.g. Jr.), null when not available
|
|
/// </summary>
|
|
public string Generation { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the function, null when not available
|
|
/// </summary>
|
|
public string Function { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the department, null when not available
|
|
/// </summary>
|
|
public string Department { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name of the company, null when not available
|
|
/// </summary>
|
|
public string Company { get; }
|
|
|
|
#region Business address information
|
|
/// <summary>
|
|
/// Returns the named propery work (business) address (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string WorkAddress { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the street of the business address, null when not available
|
|
/// </summary>
|
|
public string BusinessAddressStreet { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the city of the business address, null when not available
|
|
/// </summary>
|
|
public string BusinessAddressCity { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the state of the business address, null when not available
|
|
/// </summary>
|
|
public string BusinessAddressState { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the postal code of the business address, null when not available
|
|
/// </summary>
|
|
public string BusinessAddressPostalCode { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the country of the business address, null when not available
|
|
/// </summary>
|
|
public string BusinessAddressCountry { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the business telephone number, null when not available
|
|
/// </summary>
|
|
public string BusinessTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the business second telephone number, null when not available
|
|
/// </summary>
|
|
public string BusinessTelephoneNumber2 { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the business fax number, null when not available
|
|
/// </summary>
|
|
public string BusinessFaxNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the business home page, null when not available
|
|
/// </summary>
|
|
public string BusinessHomePage { get; }
|
|
#endregion
|
|
|
|
#region Home address information
|
|
/// <summary>
|
|
/// Returns the named propery home address (Outlook 2007 or higher)
|
|
/// </summary>
|
|
public string HomeAddress { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the street of the home address, null when not available
|
|
/// </summary>
|
|
public string HomeAddressStreet { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the city of the home address, null when not available
|
|
/// </summary>
|
|
public string HomeAddressCity { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the state of the home address, null when not available
|
|
/// </summary>
|
|
public string HomeAddressState { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the postal code of the home address, null when not available
|
|
/// </summary>
|
|
public string HomeAddressPostalCode { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the country of the home address, null when not available
|
|
/// </summary>
|
|
public string HomeAddressCountry { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the home telephone number, null when not available
|
|
/// </summary>
|
|
public string HomeTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the home second telephone number, null when not available
|
|
/// </summary>
|
|
public string HomeTelephoneNumber2 { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the home fax number, null when not available
|
|
/// </summary>
|
|
public string HomeFaxNumber { get; }
|
|
#endregion
|
|
|
|
#region Other address information
|
|
/// <summary>
|
|
/// Returns the named propery other address (Outlook 2007 or higher)
|
|
/// </summary>
|
|
public string OtherAddress { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the street of the other address, null when not available
|
|
/// </summary>
|
|
public string OtherAddressStreet { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the city of the other address, null when not available
|
|
/// </summary>
|
|
public string OtherAddressCity { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the state of the other address, null when not available
|
|
/// </summary>
|
|
public string OtherAddressState { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the postal code of the other address, null when not available
|
|
/// </summary>
|
|
public string OtherAddressPostalCode { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the country of the other address, null when not available
|
|
/// </summary>
|
|
public string OtherAddressCountry { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the other telephone number, null when not available
|
|
/// </summary>
|
|
public string OtherTelephoneNumber { get; }
|
|
#endregion
|
|
|
|
#region Primary information
|
|
/// <summary>
|
|
/// Returns the primary telephone number, null when not available
|
|
/// </summary>
|
|
public string PrimaryTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the primary fax number, null when not available
|
|
/// </summary>
|
|
public string PrimaryFaxNumber { get; }
|
|
#endregion
|
|
|
|
#region Assistant information
|
|
/// <summary>
|
|
/// Returns the name of the assistant, null when not available
|
|
/// </summary>
|
|
public string AssistantName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the telephone number of the assistant, null when not available
|
|
/// </summary>
|
|
public string AssistantTelephoneNumber { get; }
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Return the instant messaging address, null when not available
|
|
/// </summary>
|
|
public string InstantMessagingAddress { get; }
|
|
|
|
#region Telephone numbers
|
|
/// <summary>
|
|
/// Returns the company main telephone number, null when not available
|
|
/// </summary>
|
|
public string CompanyMainTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the cellular telephone number, null when not available
|
|
/// </summary>
|
|
public string CellularTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the car telephone number, null when not available
|
|
/// </summary>
|
|
public string CarTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the radio telephone number, null when not available
|
|
/// </summary>
|
|
public string RadioTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the beeper telephone number, null when not available
|
|
/// </summary>
|
|
public string BeeperTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the callback telephone number, null when not available
|
|
/// </summary>
|
|
public string CallbackTelephoneNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the telex number, null when not available
|
|
/// </summary>
|
|
public string TelexNumber { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the text telephone (TTYTDD), null when not available
|
|
/// </summary>
|
|
public string TextTelephone { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the ISDN number, null when not available
|
|
/// </summary>
|
|
// ReSharper disable once InconsistentNaming
|
|
public string ISDNNumber { get; }
|
|
#endregion
|
|
|
|
#region E-mail information
|
|
/// <summary>
|
|
/// Returns the name property e-mail address 1 (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string Email1EmailAddress { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name property e-mail displayname 1 (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string Email1DisplayName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name property e-mail address 2 (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string Email2EmailAddress { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name property e-mail displayname 2 (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string Email2DisplayName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name property e-mail address 3 (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string Email3EmailAddress { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name property e-mail displayname 3 (Outlook 2007 or higher), null when not available
|
|
/// </summary>
|
|
public string Email3DisplayName { get; }
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Returns the birthday, null when not available
|
|
/// </summary>
|
|
public DateTime? Birthday { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the wedding/anniversary, null when not available
|
|
/// </summary>
|
|
public DateTime? WeddingAnniversary { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the name of the spouse, null when not available
|
|
/// </summary>
|
|
public string SpouseName { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the profession, null when not available
|
|
/// </summary>
|
|
public string Profession { get; }
|
|
|
|
/// <summary>
|
|
/// Returns the homepage (html), null when not available
|
|
/// </summary>
|
|
public string Html { get; }
|
|
#endregion
|
|
|
|
#region Constructor
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="Storage.Contact" /> class.
|
|
/// </summary>
|
|
/// <param name="message"> The message. </param>
|
|
internal Contact(Storage message) : base(message._rootStorage)
|
|
{
|
|
GC.SuppressFinalize(message);
|
|
_namedProperties = message._namedProperties;
|
|
_propHeaderSize = MapiTags.PropertiesStreamHeaderTop;
|
|
|
|
DisplayName = GetMapiPropertyString(MapiTags.PR_DISPLAY_NAME);
|
|
Prefix = GetMapiPropertyString(MapiTags.PR_DISPLAY_NAME_PREFIX);
|
|
Initials = GetMapiPropertyString(MapiTags.PR_INITIALS);
|
|
SurName = GetMapiPropertyString(MapiTags.PR_SURNAME);
|
|
GivenName = GetMapiPropertyString(MapiTags.PR_GIVEN_NAME);
|
|
Generation = GetMapiPropertyString(MapiTags.PR_GENERATION);
|
|
Function = GetMapiPropertyString(MapiTags.PR_TITLE);
|
|
Department = GetMapiPropertyString(MapiTags.PR_DEPARTMENT_NAME);
|
|
Company = GetMapiPropertyString(MapiTags.PR_COMPANY_NAME);
|
|
|
|
#region Business address information
|
|
WorkAddress = GetMapiPropertyString(MapiTags.WorkAddress);
|
|
BusinessAddressStreet = GetMapiPropertyString(MapiTags.PR_BUSINESS_ADDRESS_STREET);
|
|
BusinessAddressCity = GetMapiPropertyString(MapiTags.PR_BUSINESS_ADDRESS_CITY);
|
|
BusinessAddressState = GetMapiPropertyString(MapiTags.PR_BUSINESS_ADDRESS_STATE_OR_PROVINCE);
|
|
BusinessAddressPostalCode = GetMapiPropertyString(MapiTags.PR_BUSINESS_ADDRESS_POSTAL_CODE);
|
|
BusinessAddressCountry = GetMapiPropertyString(MapiTags.PR_BUSINESS_ADDRESS_COUNTRY);
|
|
BusinessTelephoneNumber = GetMapiPropertyString(MapiTags.PR_BUSINESS_TELEPHONE_NUMBER);
|
|
BusinessTelephoneNumber2 = GetMapiPropertyString(MapiTags.PR_BUSINESS2_TELEPHONE_NUMBER);
|
|
BusinessFaxNumber = GetMapiPropertyString(MapiTags.PR_BUSINESS_FAX_NUMBER);
|
|
BusinessHomePage = GetMapiPropertyString(MapiTags.PR_BUSINESS_HOME_PAGE);
|
|
|
|
// WorkAddress is only filled when the msg object is made with Outlook 2007 or higher.
|
|
// So we fill it from code.
|
|
if (string.IsNullOrEmpty(WorkAddress))
|
|
{
|
|
var workAddress = string.Empty;
|
|
|
|
if (!string.IsNullOrEmpty(BusinessAddressStreet))
|
|
workAddress += BusinessAddressStreet + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(BusinessAddressPostalCode))
|
|
workAddress += BusinessAddressPostalCode + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(BusinessAddressCity))
|
|
workAddress += BusinessAddressCity + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(BusinessAddressCountry))
|
|
workAddress += BusinessAddressCountry + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(workAddress))
|
|
WorkAddress = workAddress;
|
|
}
|
|
#endregion
|
|
|
|
#region Home address information
|
|
HomeAddress = GetMapiPropertyString(MapiTags.HomeAddress);
|
|
HomeAddressStreet = GetMapiPropertyString(MapiTags.PR_HOME_ADDRESS_STREET);
|
|
HomeAddressCity = GetMapiPropertyString(MapiTags.PR_HOME_ADDRESS_CITY);
|
|
HomeAddressState = GetMapiPropertyString(MapiTags.PR_HOME_ADDRESS_STATE_OR_PROVINCE);
|
|
HomeAddressPostalCode = GetMapiPropertyString(MapiTags.PR_HOME_ADDRESS_POSTAL_CODE);
|
|
HomeAddressCountry = GetMapiPropertyString(MapiTags.PR_HOME_ADDRESS_COUNTRY);
|
|
HomeTelephoneNumber = GetMapiPropertyString(MapiTags.PR_HOME_TELEPHONE_NUMBER);
|
|
HomeTelephoneNumber2 = GetMapiPropertyString(MapiTags.PR_HOME2_TELEPHONE_NUMBER);
|
|
HomeFaxNumber = GetMapiPropertyString(MapiTags.PR_HOME_FAX_NUMBER);
|
|
|
|
// HomeAddress is only filled when the msg object is made with Outlook 2007 or higher.
|
|
// So we fill it from code.
|
|
if (string.IsNullOrEmpty(HomeAddress))
|
|
{
|
|
var homeAddress = string.Empty;
|
|
|
|
if (!string.IsNullOrEmpty(HomeAddressStreet))
|
|
homeAddress += HomeAddressStreet + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(HomeAddressPostalCode))
|
|
homeAddress += HomeAddressPostalCode + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(HomeAddressCity))
|
|
homeAddress += HomeAddressCity + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(HomeAddressCountry))
|
|
homeAddress += HomeAddressCountry + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(homeAddress))
|
|
HomeAddress = homeAddress;
|
|
}
|
|
#endregion
|
|
|
|
#region Other address information
|
|
OtherAddress = GetMapiPropertyString(MapiTags.OtherAddress);
|
|
OtherAddressStreet = GetMapiPropertyString(MapiTags.PR_OTHER_ADDRESS_STREET);
|
|
OtherAddressCity = GetMapiPropertyString(MapiTags.PR_OTHER_ADDRESS_CITY);
|
|
OtherAddressState = GetMapiPropertyString(MapiTags.PR_OTHER_ADDRESS_STATE_OR_PROVINCE);
|
|
OtherAddressPostalCode = GetMapiPropertyString(MapiTags.PR_OTHER_ADDRESS_POSTAL_CODE);
|
|
OtherAddressCountry = GetMapiPropertyString(MapiTags.PR_OTHER_ADDRESS_COUNTRY);
|
|
OtherTelephoneNumber = GetMapiPropertyString(MapiTags.PR_OTHER_TELEPHONE_NUMBER);
|
|
|
|
// OtherAddress is only filled when the msg object is made with Outlook 2007 or higher.
|
|
// So we fill it from code.
|
|
if (string.IsNullOrEmpty(OtherAddress))
|
|
{
|
|
var otherAddress = string.Empty;
|
|
|
|
if (!string.IsNullOrEmpty(OtherAddressStreet))
|
|
otherAddress += OtherAddressStreet + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(OtherAddressPostalCode))
|
|
otherAddress += OtherAddressPostalCode + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(OtherAddressCity))
|
|
otherAddress += OtherAddressCity + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(OtherAddressCountry))
|
|
otherAddress += OtherAddressCountry + Environment.NewLine;
|
|
|
|
if (!string.IsNullOrEmpty(otherAddress))
|
|
OtherAddress = otherAddress;
|
|
}
|
|
#endregion
|
|
|
|
#region Primary information
|
|
PrimaryTelephoneNumber = GetMapiPropertyString(MapiTags.PR_PRIMARY_TELEPHONE_NUMBER);
|
|
PrimaryFaxNumber = GetMapiPropertyString(MapiTags.PR_PRIMARY_FAX_NUMBER);
|
|
#endregion
|
|
|
|
#region Assistant information
|
|
AssistantName = GetMapiPropertyString(MapiTags.PR_ASSISTANT);
|
|
AssistantTelephoneNumber = GetMapiPropertyString(MapiTags.PR_ASSISTANT_TELEPHONE_NUMBER);
|
|
#endregion
|
|
|
|
InstantMessagingAddress = GetMapiPropertyString(MapiTags.InstantMessagingAddress);
|
|
|
|
#region Telephone numbers
|
|
CompanyMainTelephoneNumber = GetMapiPropertyString(MapiTags.PR_COMPANY_MAIN_PHONE_NUMBER);
|
|
CellularTelephoneNumber = GetMapiPropertyString(MapiTags.PR_CELLULAR_TELEPHONE_NUMBER);
|
|
CarTelephoneNumber = GetMapiPropertyString(MapiTags.PR_CAR_TELEPHONE_NUMBER);
|
|
RadioTelephoneNumber = GetMapiPropertyString(MapiTags.PR_RADIO_TELEPHONE_NUMBER);
|
|
BeeperTelephoneNumber = GetMapiPropertyString(MapiTags.PR_BEEPER_TELEPHONE_NUMBER);
|
|
CallbackTelephoneNumber = GetMapiPropertyString(MapiTags.PR_CALLBACK_TELEPHONE_NUMBER);
|
|
TextTelephone = GetMapiPropertyString(MapiTags.PR_TELEX_NUMBER);
|
|
ISDNNumber = GetMapiPropertyString(MapiTags.PR_ISDN_NUMBER);
|
|
TelexNumber = GetMapiPropertyString(MapiTags.PR_TELEX_NUMBER);
|
|
#endregion
|
|
|
|
#region E-mail information
|
|
Email1EmailAddress = GetMapiPropertyString(MapiTags.Email1EmailAddress);
|
|
Email1DisplayName = GetMapiPropertyString(MapiTags.Email1DisplayName);
|
|
Email2EmailAddress = GetMapiPropertyString(MapiTags.Email2EmailAddress);
|
|
Email2DisplayName = GetMapiPropertyString(MapiTags.Email2DisplayName);
|
|
Email3EmailAddress = GetMapiPropertyString(MapiTags.Email3EmailAddress);
|
|
Email3DisplayName = GetMapiPropertyString(MapiTags.Email3DisplayName);
|
|
#endregion
|
|
|
|
var birthday = GetMapiPropertyDateTime(MapiTags.PR_BIRTHDAY);
|
|
if (birthday != null)
|
|
Birthday = ((DateTime) birthday).ToLocalTime();
|
|
|
|
var weddingAnniversary = GetMapiPropertyDateTime(MapiTags.PR_WEDDING_ANNIVERSARY);
|
|
if (weddingAnniversary != null)
|
|
WeddingAnniversary = ((DateTime) weddingAnniversary).ToLocalTime();
|
|
|
|
SpouseName = GetMapiPropertyString(MapiTags.PR_SPOUSE_NAME);
|
|
Profession = GetMapiPropertyString(MapiTags.PR_PROFESSION);
|
|
Html = GetMapiPropertyString(MapiTags.Html);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|
|
}
|