From 4ba62b1e1d9ef5be9bfacbf01cd81c53c0a383c3 Mon Sep 17 00:00:00 2001 From: Patrick Simpson Date: Wed, 5 Jul 2017 16:21:23 +0200 Subject: [PATCH] [KOE-130] Removed cached property accessor, as that seems to keep the wrapper alive when it's no longer used. --- .../DebugSupport/DebugDialog.Designer.cs | 80 ++ .../Features/DebugSupport/DebugDialog.cs | 54 +- .../Features/DebugSupport/DebugDialog.resx | 738 ++++++++++-------- .../Stubs/OutlookWrappers/OutlookWrapper.cs | 62 +- .../AcaciaZPushPlugin/Utils/MailEvents.cs | 120 ++- 5 files changed, 677 insertions(+), 377 deletions(-) diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.Designer.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.Designer.cs index 6cc050a..624e6de 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.Designer.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.Designer.cs @@ -32,6 +32,10 @@ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DebugDialog)); System.Windows.Forms.ColumnHeader columnFile; System.Windows.Forms.ColumnHeader columnLine; + System.Windows.Forms.ColumnHeader columnEvent; + System.Windows.Forms.ColumnHeader columnCount; + System.Windows.Forms.ColumnHeader columnId; + System.Windows.Forms.ColumnHeader columnEvents; this.tableMain = new System.Windows.Forms.TableLayoutPanel(); this.flowButtons = new System.Windows.Forms.FlowLayoutPanel(); this.buttonGC = new System.Windows.Forms.Button(); @@ -51,9 +55,17 @@ this.listWrapperLocations = new System.Windows.Forms.ListView(); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this._tabItemEvents = new System.Windows.Forms.TabPage(); + this._layoutItemEvents = new System.Windows.Forms.TableLayoutPanel(); + this.listItemEventDetails = new System.Windows.Forms.ListView(); + this.listItemEvents = new System.Windows.Forms.ListView(); columnMethod = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); columnFile = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); columnLine = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + columnEvent = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + columnCount = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + columnId = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + columnEvents = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.tableMain.SuspendLayout(); this.flowButtons.SuspendLayout(); this._tabs.SuspendLayout(); @@ -61,6 +73,8 @@ this._tabWrapperTypes.SuspendLayout(); this._tabWrapperLocations.SuspendLayout(); this._layoutLocations.SuspendLayout(); + this._tabItemEvents.SuspendLayout(); + this._layoutItemEvents.SuspendLayout(); this.SuspendLayout(); // // columnMethod @@ -75,6 +89,18 @@ // resources.ApplyResources(columnLine, "columnLine"); // + // columnEvent + // + resources.ApplyResources(columnEvent, "columnEvent"); + // + // columnCount + // + resources.ApplyResources(columnCount, "columnCount"); + // + // columnId + // + resources.ApplyResources(columnId, "columnId"); + // // tableMain // resources.ApplyResources(this.tableMain, "tableMain"); @@ -125,6 +151,7 @@ this._tabs.Controls.Add(this._tabProperties); this._tabs.Controls.Add(this._tabWrapperTypes); this._tabs.Controls.Add(this._tabWrapperLocations); + this._tabs.Controls.Add(this._tabItemEvents); resources.ApplyResources(this._tabs, "_tabs"); this._tabs.Name = "_tabs"; this._tabs.SelectedIndex = 0; @@ -223,6 +250,53 @@ // resources.ApplyResources(this.columnHeader4, "columnHeader4"); // + // _tabItemEvents + // + this._tabItemEvents.Controls.Add(this._layoutItemEvents); + resources.ApplyResources(this._tabItemEvents, "_tabItemEvents"); + this._tabItemEvents.Name = "_tabItemEvents"; + this._tabItemEvents.UseVisualStyleBackColor = true; + // + // _layoutItemEvents + // + resources.ApplyResources(this._layoutItemEvents, "_layoutItemEvents"); + this._layoutItemEvents.Controls.Add(this.listItemEventDetails, 0, 1); + this._layoutItemEvents.Controls.Add(this.listItemEvents, 0, 0); + this._layoutItemEvents.Name = "_layoutItemEvents"; + // + // listItemEventDetails + // + this.listItemEventDetails.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + columnEvent, + columnCount}); + resources.ApplyResources(this.listItemEventDetails, "listItemEventDetails"); + this.listItemEventDetails.FullRowSelect = true; + this.listItemEventDetails.MultiSelect = false; + this.listItemEventDetails.Name = "listItemEventDetails"; + this.listItemEventDetails.ShowItemToolTips = true; + this.listItemEventDetails.UseCompatibleStateImageBehavior = false; + this.listItemEventDetails.View = System.Windows.Forms.View.Details; + // + // listItemEvents + // + this.listItemEvents.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + columnId, + columnEvents}); + resources.ApplyResources(this.listItemEvents, "listItemEvents"); + this.listItemEvents.FullRowSelect = true; + this.listItemEvents.HideSelection = false; + this.listItemEvents.MultiSelect = false; + this.listItemEvents.Name = "listItemEvents"; + this.listItemEvents.ShowItemToolTips = true; + this.listItemEvents.Sorting = System.Windows.Forms.SortOrder.Descending; + this.listItemEvents.UseCompatibleStateImageBehavior = false; + this.listItemEvents.View = System.Windows.Forms.View.Details; + this.listItemEvents.SelectedIndexChanged += new System.EventHandler(this.listItemEvents_SelectedIndexChanged); + // + // columnEvents + // + resources.ApplyResources(columnEvents, "columnEvents"); + // // DebugDialog // resources.ApplyResources(this, "$this"); @@ -241,6 +315,8 @@ this._tabWrapperTypes.ResumeLayout(false); this._tabWrapperLocations.ResumeLayout(false); this._layoutLocations.ResumeLayout(false); + this._tabItemEvents.ResumeLayout(false); + this._layoutItemEvents.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -267,5 +343,9 @@ private System.Windows.Forms.ListView listWrapperLocations; private System.Windows.Forms.ColumnHeader columnHeader3; private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.TabPage _tabItemEvents; + private System.Windows.Forms.TableLayoutPanel _layoutItemEvents; + private System.Windows.Forms.ListView listItemEventDetails; + private System.Windows.Forms.ListView listItemEvents; } } \ No newline at end of file diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.cs index d6b6aaa..7c03ed8 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.cs @@ -51,9 +51,11 @@ namespace Acacia.Features.DebugSupport } else { - listWrapperTypes.ListViewItemSorter = new WrapperCountSorter(); - listWrapperLocations.ListViewItemSorter = new WrapperCountSorter(); + listWrapperTypes.ListViewItemSorter = new WrapperCountSorter(1); + listWrapperLocations.ListViewItemSorter = new WrapperCountSorter(1); + listItemEvents.ListViewItemSorter = new WrapperCountSorter(0); RefreshWrappers(); + RefreshItemEvents(); // Make it a bit bigger Width = Width + 400; @@ -65,6 +67,7 @@ namespace Acacia.Features.DebugSupport { Properties.Refresh(); RefreshWrappers(); + RefreshItemEvents(); } #region Wrappers @@ -104,10 +107,17 @@ namespace Acacia.Features.DebugSupport private class WrapperCountSorter : IComparer { + private readonly int _index; + + public WrapperCountSorter(int index) + { + this._index = index; + } + public int Compare(object x, object y) { - int ix = int.Parse(((ListViewItem)x).SubItems[1].Text); - int iy = int.Parse(((ListViewItem)y).SubItems[1].Text); + int ix = int.Parse(((ListViewItem)x).SubItems[_index].Text); + int iy = int.Parse(((ListViewItem)y).SubItems[_index].Text); return iy - ix; } } @@ -132,6 +142,42 @@ namespace Acacia.Features.DebugSupport #endregion + #region Item events + + private void RefreshItemEvents() + { + listItemEvents.Items.Clear(); + foreach(MailEvents.MailEventDebug events in MailEvents.MailEventsDebug) + { + ListViewItem item = new ListViewItem(events.Id); + item.Tag = events; + item.SubItems.Add(string.Join(", ", events.GetEvents())); + listItemEvents.Items.Add(item); + } + + foreach (ColumnHeader header in listItemEvents.Columns) + header.Width = -2; + } + + private void listItemEvents_SelectedIndexChanged(object sender, EventArgs e) + { + listItemEventDetails.Items.Clear(); + if (listItemEvents.SelectedItems.Count > 0) + { + MailEvents.MailEventDebug debug = (MailEvents.MailEventDebug)listItemEvents.SelectedItems[0].Tag; + foreach (MailEvents.DebugEvent evt in typeof(MailEvents.DebugEvent).GetEnumValues()) + { + ListViewItem item = new ListViewItem(evt.ToString()); + item.SubItems.Add(debug.GetEventCount(evt).ToString()); + listItemEventDetails.Items.Add(item); + } + } + foreach (ColumnHeader header in listItemEventDetails.Columns) + header.Width = -2; + } + + #endregion + #region Cycling private class DebugCycleInfo diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.resx b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.resx index e04e14b..940093e 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.resx +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Features/DebugSupport/DebugDialog.resx @@ -142,6 +142,30 @@ Line + + False + + + Event + + + 44 + + + False + + + Count + + + False + + + Id + + + 44 + Top, Bottom, Left, Right @@ -161,325 +185,10 @@ True - - buttonGC - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flowButtons - - - 0 - - - buttonRefresh - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flowButtons - - - 1 - - - buttonClose - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flowButtons - - - 2 - - - buttonLog - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - flowButtons - - - 3 - - - RightToLeft - - - - 4, 703 - - - 4, 3, 4, 3 - - - 615, 64 - - - 1 - - - flowButtons - - - System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tableMain - - - 0 - - - Properties - - - System.Windows.Forms.PropertyGrid, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _tabProperties - - - 0 - - - 4, 33 - - - 3, 3, 3, 3 - - - 609, 657 - - - 0 - - - General - - - _tabProperties - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _tabs - - - 0 - - - listWrapperTypes - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _tabWrapperTypes - - - 0 - - - 4, 33 - - - 3, 3, 3, 3 - - - 609, 657 - - - 1 - - - Wrapper types - - - _tabWrapperTypes - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _tabs - - - 1 - - - 1 - - - Fill - - - 3, 328 - - - 597, 320 - - - 3 - - - listStackTrace - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _layoutLocations - - - 0 - - - Fill - - - 3, 3 - - - 597, 319 - - - 2 - - - listWrapperLocations - - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _layoutLocations - - - 1 - - - Fill - - - 3, 3 - - - 2 - - - 603, 651 - - - 2 - - - _layoutLocations - - - System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _tabWrapperLocations - - - 0 - - - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="listStackTrace" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listWrapperLocations" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100,Absolute,20" /><Rows Styles="Percent,50,Percent,50" /></TableLayoutSettings> - - - 4, 33 - - - 3, 3, 3, 3 - - - 609, 657 - - - 2 - - - Wrapper locations - - - _tabWrapperLocations - - - System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - _tabs - - - 2 - - - Fill - - - 3, 3 - - - 617, 694 - - - 3 - - - _tabs - - - System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - tableMain - - - 1 - - - 0, 0 - - - 4, 3, 4, 3 - - - 2 - - - 623, 770 - - - 0 - - - tableMain - - - System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 0 - - - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="flowButtons" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="_tabs" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,AutoSize,0,Absolute,20" /></TableLayoutSettings> - True + 483, 6 @@ -597,6 +306,33 @@ 3 + + RightToLeft + + + 4, 703 + + + 4, 3, 4, 3 + + + 615, 64 + + + 1 + + + flowButtons + + + System.Windows.Forms.FlowLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableMain + + + 0 + Fill @@ -627,6 +363,45 @@ 0 + + 4, 33 + + + 3, 3, 3, 3 + + + 609, 657 + + + 0 + + + General + + + _tabProperties + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _tabs + + + 0 + + + Type + + + 44 + + + Count + + + 44 + Fill @@ -651,17 +426,59 @@ 0 - - Type + + 4, 33 - - 44 + + 3, 3, 3, 3 - - Count + + 609, 657 - - 44 + + 1 + + + Wrapper types + + + _tabWrapperTypes + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _tabs + + + 1 + + + 1 + + + Fill + + + 3, 328 + + + 597, 320 + + + 3 + + + listStackTrace + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _layoutLocations + + + 0 Type @@ -675,6 +492,255 @@ 44 + + Fill + + + 3, 3 + + + 597, 319 + + + 2 + + + listWrapperLocations + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _layoutLocations + + + 1 + + + Fill + + + 3, 3 + + + 2 + + + 603, 651 + + + 2 + + + _layoutLocations + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _tabWrapperLocations + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="listStackTrace" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listWrapperLocations" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100,Absolute,20" /><Rows Styles="Percent,50,Percent,50" /></TableLayoutSettings> + + + 4, 33 + + + 3, 3, 3, 3 + + + 609, 657 + + + 2 + + + Wrapper locations + + + _tabWrapperLocations + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _tabs + + + 2 + + + 1 + + + Fill + + + 3, 328 + + + 597, 320 + + + 3 + + + listItemEventDetails + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _layoutItemEvents + + + 0 + + + False + + + Events + + + Fill + + + 3, 3 + + + 597, 319 + + + 2 + + + listItemEvents + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _layoutItemEvents + + + 1 + + + Fill + + + 3, 3 + + + 2 + + + 603, 651 + + + 3 + + + _layoutItemEvents + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _tabItemEvents + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="listItemEventDetails" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="listItemEvents" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100,Absolute,20" /><Rows Styles="Percent,50,Percent,50" /></TableLayoutSettings> + + + 4, 33 + + + 3, 3, 3, 3 + + + 609, 657 + + + 3 + + + Item events + + + _tabItemEvents + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _tabs + + + 3 + + + Fill + + + 3, 3 + + + 617, 694 + + + 3 + + + _tabs + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableMain + + + 1 + + + 0, 0 + + + 4, 3, 4, 3 + + + 2 + + + 623, 770 + + + 0 + + + tableMain + + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="flowButtons" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="_tabs" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,100" /><Rows Styles="Percent,100,AutoSize,0,Absolute,20" /></TableLayoutSettings> + True @@ -714,6 +780,24 @@ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + columnEvent + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + columnCount + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + columnId + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + columnHeader1 @@ -738,6 +822,12 @@ System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + columnEvents + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + DebugDialog diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs index b3b0a2d..634eac1 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/OutlookWrappers/OutlookWrapper.cs @@ -41,37 +41,10 @@ namespace Acacia.Stubs.OutlookWrappers { } - protected override void DoRelease() - { - // Always release props, as we allocated that - if (_props != null) - { - ComRelease.Release(_props); - _props = null; - } - - base.DoRelease(); - } - #endregion #region Properties implementation - // Assigned in Props, released in DoRelease - private NSOutlook.PropertyAccessor _props; - - private NSOutlook.PropertyAccessor Props - { - get - { - if (_props == null) - { - _props = GetPropertyAccessor(); - } - return _props; - } - } - /// /// Returns the wrapped item's property accessor. /// @@ -145,11 +118,11 @@ namespace Acacia.Stubs.OutlookWrappers // into a string which must be parsed again. get { - return Props.GetProperty(OutlookConstants.PR_CATEGORIES); + return (string[])GetProperty(OutlookConstants.PR_CATEGORIES); } set { - Props.SetProperty(OutlookConstants.PR_CATEGORIES, value); + SetProperty(OutlookConstants.PR_CATEGORIES, value); } } @@ -159,7 +132,7 @@ namespace Acacia.Stubs.OutlookWrappers { try { - return Props.GetProperty(OutlookConstants.PR_ATTR_HIDDEN); + return (bool)GetProperty(OutlookConstants.PR_ATTR_HIDDEN); } catch(System.Exception) { @@ -168,30 +141,51 @@ namespace Acacia.Stubs.OutlookWrappers } set { - Props.SetProperty(OutlookConstants.PR_ATTR_HIDDEN, value); + SetProperty(OutlookConstants.PR_ATTR_HIDDEN, value); } } public object GetProperty(string property) { + NSOutlook.PropertyAccessor props = GetPropertyAccessor(); try { - object val = Props.GetProperty(property); + object val = props.GetProperty(property); if (val is DBNull) return null; return val; } catch(System.Exception) { return null; } + finally + { + ComRelease.Release(props); + } } public void SetProperty(string property, object value) { - Props.SetProperty(property, value); + NSOutlook.PropertyAccessor props = GetPropertyAccessor(); + try + { + props.SetProperty(property, value); + } + finally + { + ComRelease.Release(props); + } } public void SetProperties(string[] properties, object[] values) { - Props.SetProperties(properties, values); + NSOutlook.PropertyAccessor props = GetPropertyAccessor(); + try + { + props.SetProperties(properties, values); + } + finally + { + ComRelease.Release(props); + } } #endregion diff --git a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs index 8e7d799..bc79f4a 100644 --- a/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs +++ b/src/AcaciaZPushPlugin/AcaciaZPushPlugin/Utils/MailEvents.cs @@ -22,6 +22,8 @@ using System.Threading.Tasks; using Acacia.Stubs; using Acacia.Stubs.OutlookWrappers; using System.Reflection; +using System.Threading; +using System.Collections.Concurrent; namespace Acacia.Utils { @@ -360,13 +362,47 @@ namespace Acacia.Utils } } + public enum DebugEvent + { + BeforeDelete, + Forward, + PropertyChange, + Read, + Reply, + ReplyAll, + Unload, + Write, + + Dispose, + GC + } + + public interface MailEventDebug + { + string Id { get; } + int GetEventCount(DebugEvent which); + IEnumerable GetEvents(); + } + + public static IEnumerable MailEventsDebug + { + get { return _hookers.Values; } + } + + private static readonly ConcurrentDictionary _hookers = new ConcurrentDictionary(); + private static int _nextHookerId; + private class MailEventHooker : DisposableWrapper { + private readonly MailEventDebugImpl _debug; private IItem _item; private readonly MailEvents _events; public MailEventHooker(IItem item, MailEvents events) { + _debug = new MailEventDebugImpl(Interlocked.Increment(ref _nextHookerId)); + _hookers.TryAdd(_debug._id, _debug); + this._item = item; this._events = events; HookEvents(true); @@ -374,7 +410,19 @@ namespace Acacia.Utils protected override void DoRelease() { - _item.Dispose(); + if (_item != null) + { + _debug.RecordEvent(DebugEvent.Dispose); + _item.Dispose(); + _item = null; + } + MailEventDebugImpl dummy; + _hookers.TryRemove(_debug._id, out dummy); + } + + ~MailEventHooker() + { + _debug.RecordEvent(DebugEvent.GC); } private void HookEvents(bool add) @@ -383,11 +431,10 @@ namespace Acacia.Utils { if (add) { - + events.Read += HandleRead; events.BeforeDelete += HandleBeforeDelete; events.Forward += HandleForward; events.PropertyChange += HandlePropertyChange; - events.Read += HandleRead; events.Reply += HandleReply; events.ReplyAll += HandleReplyAll; events.Unload += HandleUnload; @@ -395,10 +442,10 @@ namespace Acacia.Utils } else { + events.Read -= HandleRead; events.BeforeDelete -= HandleBeforeDelete; events.Forward -= HandleForward; events.PropertyChange -= HandlePropertyChange; - events.Read -= HandleRead; events.Reply -= HandleReply; events.ReplyAll -= HandleReplyAll; events.Unload -= HandleUnload; @@ -409,41 +456,52 @@ namespace Acacia.Utils private void HandleBeforeDelete(object item, ref bool cancel) { - using (IItem wrapped = item.WrapOrDefault(false)) - _events.OnBeforeDelete(wrapped, ref cancel); + _debug.RecordEvent(DebugEvent.BeforeDelete); + //using (IItem wrapped = item.WrapOrDefault(false)) + // _events.OnBeforeDelete(wrapped, ref cancel); } private void HandleForward(object response, ref bool cancel) { - using (IItem wrapped = response.WrapOrDefault(false)) - _events.OnForward(_item as IMailItem, wrapped as IMailItem); + _debug.RecordEvent(DebugEvent.Forward); + //using (IItem wrapped = response.WrapOrDefault(false)) + // _events.OnForward(_item as IMailItem, wrapped as IMailItem); } private void HandlePropertyChange(string name) { - _events.OnPropertyChange(_item, name); + _debug.RecordEvent(DebugEvent.PropertyChange); + //_events.OnPropertyChange(_item, name); } private void HandleRead() { + _debug.RecordEvent(DebugEvent.Read); // TODO: should this not be simply an IItem? - _events.OnRead(_item as IMailItem); + IMailItem mail = _item as IMailItem; + if (mail != null) + { + _events.OnRead(mail); + } } private void HandleReply(object response, ref bool cancel) { - using (IItem wrapped = response.WrapOrDefault(false)) - _events.OnReply(_item as IMailItem, wrapped as IMailItem); + _debug.RecordEvent(DebugEvent.Reply); + //using (IItem wrapped = response.WrapOrDefault(false)) + // _events.OnReply(_item as IMailItem, wrapped as IMailItem); } private void HandleReplyAll(object response, ref bool cancel) { - using (IItem wrapped = response.WrapOrDefault(false)) - _events.OnReplyAll(_item as IMailItem, wrapped as IMailItem); + _debug.RecordEvent(DebugEvent.ReplyAll); + //using (IItem wrapped = response.WrapOrDefault(false)) + // _events.OnReplyAll(_item as IMailItem, wrapped as IMailItem); } private void HandleUnload() { + _debug.RecordEvent(DebugEvent.Unload); // All events must be unhooked on unload, otherwise a resource leak is created. HookEvents(false); Dispose(); @@ -451,10 +509,42 @@ namespace Acacia.Utils private void HandleWrite(ref bool cancel) { - _events.OnWrite(_item, ref cancel); + _debug.RecordEvent(DebugEvent.Write); + //_events.OnWrite(_item, ref cancel); } } + private class MailEventDebugImpl : MailEventDebug + { + private readonly ConcurrentDictionary _eventCounts = new ConcurrentDictionary(); + + public readonly int _id; + + public MailEventDebugImpl(int id) + { + this._id = id; + } + + public int GetEventCount(DebugEvent which) + { + int count; + _eventCounts.TryGetValue(which, out count); + return count; + } + + public void RecordEvent(DebugEvent which) + { + _eventCounts.AddOrUpdate(which, 1, (i, value) => value + 1); + } + + public IEnumerable GetEvents() + { + return _eventCounts.Keys; + } + + public string Id { get { return _id.ToString(); } } + } + #endregion } }