From 49efb682982d623012173cfd5a8c931b5fded49d Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Mon, 13 Feb 2017 15:20:18 +0100 Subject: [PATCH] Further fixes for item events --- .../AcaciaZPushPlugin/Stubs/IItem.cs | 7 +-- .../AcaciaZPushPlugin/Stubs/IItemEvents.cs | 2 +- .../OutlookWrappers/ItemEventsWrapper.cs | 8 ++- .../OutlookWrappers/OutlookItemWrapper.cs | 10 +--- .../AcaciaZPushPlugin/Utils/MailEvents.cs | 51 +++++++++---------- 5 files changed, 32 insertions(+), 46 deletions(-) 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; + } } }