diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItem.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItem.cs
index 5846ab6..bb5f5e4 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItem.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItem.cs
@@ -35,12 +35,9 @@ namespace Acacia.Stubs
string Subject { get; set; }
///
- /// Returns the events for the item. The same object is returned, it does not need to be disposed.
+ /// Returns the events for the item. The caller is responsible for disposing.
///
- IItemEvents Events
- {
- get;
- }
+ IItemEvents GetEvents();
#endregion
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItemEvents.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItemEvents.cs
index 7628d9c..76870f7 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItemEvents.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IItemEvents.cs
@@ -7,7 +7,7 @@ using NSOutlook = Microsoft.Office.Interop.Outlook;
namespace Acacia.Stubs
{
- public interface IItemEvents
+ public interface IItemEvents : IComWrapper
{
#region Event handlers
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/ItemEventsWrapper.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/ItemEventsWrapper.cs
index 378f125..a80f2f9 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/ItemEventsWrapper.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/ItemEventsWrapper.cs
@@ -7,13 +7,11 @@ using NSOutlook = Microsoft.Office.Interop.Outlook;
namespace Acacia.Stubs.OutlookWrappers
{
- class ItemEventsWrapper : IItemEvents
+ class ItemEventsWrapper : ComWrapper, IItemEvents
{
- private readonly NSOutlook.ItemEvents_10_Event _item;
-
- internal ItemEventsWrapper(object item)
+ internal ItemEventsWrapper(NSOutlook.ItemEvents_10_Event item) : base(item)
{
- this._item = (NSOutlook.ItemEvents_10_Event)item;
+ MustRelease = false;
}
#region Events
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookItemWrapper.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookItemWrapper.cs
index 61a352a..393ea6b 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookItemWrapper.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookItemWrapper.cs
@@ -16,15 +16,9 @@ namespace Acacia.Stubs.OutlookWrappers
{
}
- private ItemEventsWrapper _events;
- public IItemEvents Events
+ public IItemEvents GetEvents()
{
- get
- {
- if (_events == null)
- _events = new ItemEventsWrapper(_item);
- return _events;
- }
+ return new ItemEventsWrapper((NSOutlook.ItemEvents_10_Event)_item);
}
public Type GetUserProperty(string name)
diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs
index 044562d..5fbd393 100644
--- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs
+++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs
@@ -190,8 +190,8 @@ namespace Acacia.Utils
private void OnItemLoad(object item)
{
- IItem wrapped = Wrappers.Wrap(item);
- // TODO: check type
+ IItem wrapped = Wrappers.Wrap(item, false);
+ // TODO: only register for desired types
if (wrapped != null)
{
new MailEventHooker(wrapped, this);
@@ -214,40 +214,37 @@ namespace Acacia.Utils
HookEvents(true);
}
- /*~MailEventHooker()
- {
- }
- */
-
protected override void DoRelease()
{
Logger.Instance.Debug(this, "DoRelease: {0}", _id);
- // TODO: It looks like release _itemEvents is not only not needed, but causes exceptions.
- // If that is really the case, this doesn't need to be a ComWrapper
_item.Dispose();
}
private void HookEvents(bool add)
{
- if (add)
+ using (IItemEvents events = _item.GetEvents())
{
- _item.Events.BeforeDelete += HandleBeforeDelete;
- _item.Events.Forward += HandleForward;
- _item.Events.Read += HandleRead;
- _item.Events.Reply += HandleReply;
- _item.Events.ReplyAll += HandleReplyAll;
- _item.Events.Unload += HandleUnload;
- _item.Events.Write += HandleWrite;
- }
- else
- {
- _item.Events.BeforeDelete -= HandleBeforeDelete;
- _item.Events.Forward -= HandleForward;
- _item.Events.Read -= HandleRead;
- _item.Events.Reply -= HandleReply;
- _item.Events.ReplyAll -= HandleReplyAll;
- _item.Events.Unload -= HandleUnload;
- _item.Events.Write -= HandleWrite;
+ if (add)
+ {
+
+ events.BeforeDelete += HandleBeforeDelete;
+ events.Forward += HandleForward;
+ events.Read += HandleRead;
+ events.Reply += HandleReply;
+ events.ReplyAll += HandleReplyAll;
+ events.Unload += HandleUnload;
+ events.Write += HandleWrite;
+ }
+ else
+ {
+ events.BeforeDelete -= HandleBeforeDelete;
+ events.Forward -= HandleForward;
+ events.Read -= HandleRead;
+ events.Reply -= HandleReply;
+ events.ReplyAll -= HandleReplyAll;
+ events.Unload -= HandleUnload;
+ events.Write -= HandleWrite;
+ }
}
}