Cleaned up usage of Recipient/AddressEntry

This commit is contained in:
Patrick Simpson 2017-02-09 16:44:13 +01:00
parent 90e0029a8e
commit 38772d024a
16 changed files with 226 additions and 56 deletions

View File

@ -280,9 +280,13 @@
<Compile Include="Native\IOleWindow.cs" />
<Compile Include="OutlookConstants.cs" />
<Compile Include="Stubs\IAddIn.cs" />
<Compile Include="Stubs\IAddressEntry.cs" />
<Compile Include="Stubs\IComWrapper.cs" />
<Compile Include="Stubs\IRecipient.cs" />
<Compile Include="Stubs\OutlookWrappers\AddInWrapper.cs" />
<Compile Include="Stubs\OutlookWrappers\AddressEntryWrapper.cs" />
<Compile Include="Stubs\OutlookWrappers\OutlookItemWrapper.cs" />
<Compile Include="Stubs\OutlookWrappers\RecipientWrapper.cs" />
<Compile Include="UI\Outlook\OutlookImageList.cs" />
<Compile Include="UI\Outlook\RibbonToggleButton.cs" />
<Compile Include="UI\Outlook\RibbonButton.cs" />

View File

@ -281,23 +281,25 @@ namespace Acacia.Features.GAB
/// <param name="cancel"></param>
private void DoSuppressEvent(IItem item, ref bool cancel)
{
// TODO: Find and close the inspector
/*if (item != null)
{
foreach (Inspector inspector in App.Inspectors)
foreach (Inspector inspector in ThisAddIn.Instance.Inspectors)
{
if (item.EntryId == inspector.CurrentItem.EntryID)
{
break;
}
}
}
}*/
// Show message and cancel event
MessageBox.Show(StringUtil.GetResourceString("GABEvent_Body"),
StringUtil.GetResourceString("GABEvent_Title"),
MessageBoxButtons.OK,
MessageBoxIcon.Warning
);
cancel = true;*/
// TODO
cancel = true;
}
#endregion
@ -436,9 +438,12 @@ namespace Acacia.Features.GAB
GABInfo gabInfo = GABInfo.Get(gab, domainName);
gabInfo.Store(gab);
// Hook BeforeMove event to prevent modifications
// TODO: use ZPushWatcher for this?
gab.BeforeItemMove += SuppressMoveEventHandler;
if (SuppressModifications)
{
// Hook BeforeMove event to prevent modifications
// TODO: use ZPushWatcher for this?
gab.BeforeItemMove += SuppressMoveEventHandler;
}
return gab;
}
@ -446,8 +451,11 @@ namespace Acacia.Features.GAB
private void DisposeGABContacts(IAddressBook gab)
{
// Unhook the event to prevent the gab lingering in memory
gab.BeforeItemMove -= SuppressMoveEventHandler;
if (SuppressModifications)
{
// Unhook the event to prevent the gab lingering in memory
gab.BeforeItemMove -= SuppressMoveEventHandler;
}
}
public static GABInfo GetGABContactsFolderInfo(IFolder folder)

View File

@ -90,18 +90,21 @@ namespace Acacia.Features.SendAs
{
Logger.Instance.Trace(this, "Checking, Shared folder owner: {0}", shared.Store.UserName);
// It's a shared folder, use the owner as the sender if possible
// TODO: make a wrapper for this
// TODO: remove RawApp access
var recip = ThisAddIn.Instance.RawApp.Session.CreateRecipient(shared.Store.UserName);
Logger.Instance.Trace(this, "Checking, Shared folder owner recipient: {0}", recip.Name);
if (recip != null && recip.Resolve())
using (IRecipient recip = ThisAddIn.Instance.ResolveRecipient(shared.Store.UserName))
{
Logger.Instance.Trace(this, "Sending as: {0}", recip.AddressEntry.Address);
response.SetSender(recip.AddressEntry);
}
else
{
Logger.Instance.Trace(this, "Unable to resolve sender");
Logger.Instance.Trace(this, "Checking, Shared folder owner recipient: {0}", recip.Name);
if (recip != null && recip.IsResolved)
{
Logger.Instance.Trace(this, "Sending as: {0}", recip.Address);
using (IAddressEntry address = recip.GetAddressEntry())
{
response.SetSender(address);
}
}
else
{
Logger.Instance.Trace(this, "Unable to resolve sender");
}
}
}
}

View File

@ -34,6 +34,9 @@ namespace Acacia.Stubs
#endregion
#region Miscellaneous methods
// TODO: clean this up
/// <summary>
/// Sends and receives all accounts.
/// </summary>
@ -51,5 +54,9 @@ namespace Acacia.Stubs
FeatureType GetFeature<FeatureType>()
where FeatureType : Feature;
IRecipient ResolveRecipient(string name);
#endregion
}
}

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Acacia.Stubs
{
public interface IAddressEntry : IComWrapper
{
}
}

View File

@ -33,7 +33,10 @@ namespace Acacia.Stubs
string SenderEmailAddress { get; }
string SenderName { get; }
// TODO: make a wrapper for this
void SetSender(Microsoft.Office.Interop.Outlook.AddressEntry addressEntry);
/// <summary>
/// Sets the sender.
/// </summary>
/// <param name="addressEntry">The address. The caller is responsible for disposing.</param>
void SetSender(IAddressEntry addressEntry);
}
}

View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Acacia.Stubs
{
public interface IRecipient : IComWrapper
{
bool IsResolved { get; }
string Name { get; }
string Address { get; }
/// <summary>
/// Returns the address entry. The caller is responsible for disposing it.
/// </summary>
IAddressEntry GetAddressEntry();
}
}

View File

@ -190,5 +190,19 @@ namespace Acacia.Stubs.OutlookWrappers
#endregion
public IRecipient ResolveRecipient(string name)
{
using (ComRelease com = new ComRelease())
{
NSOutlook.NameSpace session = com.Add(_app.Session);
NSOutlook.Recipient recipient = session.CreateRecipient(name);
if (recipient == null)
return null;
com.Add(recipient);
recipient.Resolve();
return Mapping.Wrap(com.Remove(recipient));
}
}
}
}

View File

@ -0,0 +1,28 @@
using Acacia.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NSOutlook = Microsoft.Office.Interop.Outlook;
namespace Acacia.Stubs.OutlookWrappers
{
class AddressEntryWrapper : ComWrapper, IAddressEntry
{
private NSOutlook.AddressEntry _item;
internal AddressEntryWrapper(NSOutlook.AddressEntry item)
{
this._item = item;
}
internal NSOutlook.AddressEntry RawItem { get { return _item; } }
protected override void DoRelease()
{
ComRelease.Release(_item);
_item = null;
}
}
}

View File

@ -42,31 +42,27 @@ namespace Acacia.Stubs.OutlookWrappers
}
set
{
using (ComRelease com = new ComRelease())
{
string displayName = DLName + " (" + value + ")";
byte[] oneOffId = CreateOneOffMemberId(DLName, "SMTP", value);
string displayName = DLName + " (" + value + ")";
byte[] oneOffId = CreateOneOffMemberId(DLName, "SMTP", value);
NSOutlook.PropertyAccessor props = com.Add(_item.PropertyAccessor);
props.SetProperties(
new string[]
{
OutlookConstants.PR_EMAIL1DISPLAYNAME,
OutlookConstants.PR_EMAIL1EMAILADDRESS,
OutlookConstants.PR_EMAIL1ADDRESSTYPE,
OutlookConstants.PR_EMAIL1ORIGINALDISPLAYNAME,
OutlookConstants.PR_EMAIL1ORIGINALENTRYID
},
new object[]
{
DLName,
value,
"SMTP",
value,
oneOffId
}
);
}
SetProperties(
new string[]
{
OutlookConstants.PR_EMAIL1DISPLAYNAME,
OutlookConstants.PR_EMAIL1EMAILADDRESS,
OutlookConstants.PR_EMAIL1ADDRESSTYPE,
OutlookConstants.PR_EMAIL1ORIGINALDISPLAYNAME,
OutlookConstants.PR_EMAIL1ORIGINALENTRYID
},
new object[]
{
DLName,
value,
"SMTP",
value,
oneOffId
}
);
}
}
@ -95,12 +91,15 @@ namespace Acacia.Stubs.OutlookWrappers
private void AddContactMember(IContactItem member)
{
string email = member.Email1Address;
// TODO: remove RawApp, Recipient wrapper
NSOutlook.Recipient recipient = ThisAddIn.Instance.RawApp.Session.CreateRecipient(email);
if (recipient.Resolve())
_item.AddMember(recipient);
else
Logger.Instance.Warning(this, "Unable to resolve recipient: {0}", email);
using (IRecipient recipient = ThisAddIn.Instance.ResolveRecipient(email))
{
if (recipient.IsResolved)
{
_item.AddMember(((RecipientWrapper)recipient).RawItem);
}
else
Logger.Instance.Warning(this, "Unable to resolve recipient: {0}", email);
}
}
private void AddDistributionListMember(IDistributionList member)

View File

@ -81,9 +81,9 @@ namespace Acacia.Stubs.OutlookWrappers
}
public void SetSender(NSOutlook.AddressEntry addressEntry)
public void SetSender(IAddressEntry addressEntry)
{
_item.Sender = addressEntry;
_item.Sender = ((AddressEntryWrapper)addressEntry).RawItem;
}
#endregion

View File

@ -78,6 +78,13 @@ namespace Acacia.Stubs.OutlookWrappers
return (Type)Wrap(o, mustRelease);
}
public static IRecipient Wrap(NSOutlook.Recipient r, bool mustRelease = true)
{
RecipientWrapper wrapped = new RecipientWrapper(r);
wrapped.MustRelease = mustRelease;
return wrapped;
}
// TODO: are these not the same now? Differ only on wrong type?
public static Type WrapOrDefault<Type>(object o, bool mustRelease = true)
where Type : IBase

View File

@ -24,7 +24,7 @@ using NSOutlook = Microsoft.Office.Interop.Outlook;
namespace Acacia.Stubs.OutlookWrappers
{
public class NoteItemWrapper : OutlookItemWrapper<NSOutlook.NoteItem>, INoteItem
class NoteItemWrapper : OutlookItemWrapper<NSOutlook.NoteItem>, INoteItem
{
internal NoteItemWrapper(NSOutlook.NoteItem item)
:

View File

@ -0,0 +1,58 @@
using Acacia.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NSOutlook = Microsoft.Office.Interop.Outlook;
namespace Acacia.Stubs.OutlookWrappers
{
class RecipientWrapper : ComWrapper, IRecipient
{
private NSOutlook.Recipient _item;
internal RecipientWrapper(NSOutlook.Recipient item)
{
this._item = item;
}
internal NSOutlook.Recipient RawItem { get { return _item; } }
protected override void DoRelease()
{
ComRelease.Release(_item);
_item = null;
}
public bool IsResolved
{
get
{
return _item.Resolved;
}
}
public string Name
{
get
{
return _item.Name;
}
}
public string Address
{
get
{
return _item.Address;
// TODO:? return _item.AddressEntry.Address
}
}
public IAddressEntry GetAddressEntry()
{
return new AddressEntryWrapper(_item.AddressEntry);
}
}
}

View File

@ -25,7 +25,7 @@ using NSOutlook = Microsoft.Office.Interop.Outlook;
namespace Acacia.Stubs.OutlookWrappers
{
public class TaskItemWrapper : OutlookItemWrapper<NSOutlook.TaskItem>, ITaskItem
class TaskItemWrapper : OutlookItemWrapper<NSOutlook.TaskItem>, ITaskItem
{
internal TaskItemWrapper(NSOutlook.TaskItem item)
:

View File

@ -34,6 +34,12 @@ namespace Acacia.Utils
return t;
}
public Type Remove<Type>(Type t)
{
objects.Remove(t);
return t;
}
public void Dispose()
{
foreach (object o in objects)