mirror of
https://github.com/Kopano-dev/kopano-ol-extension.git
synced 2023-10-10 13:37:40 +02:00
First batch of Com verification update
This commit is contained in:
parent
ac56b301b4
commit
a450f6e616
@ -279,7 +279,9 @@
|
|||||||
<Compile Include="Native\MAPI.cs" />
|
<Compile Include="Native\MAPI.cs" />
|
||||||
<Compile Include="Native\IOleWindow.cs" />
|
<Compile Include="Native\IOleWindow.cs" />
|
||||||
<Compile Include="OutlookConstants.cs" />
|
<Compile Include="OutlookConstants.cs" />
|
||||||
|
<Compile Include="Stubs\IAddIn.cs" />
|
||||||
<Compile Include="Stubs\IComWrapper.cs" />
|
<Compile Include="Stubs\IComWrapper.cs" />
|
||||||
|
<Compile Include="Stubs\OutlookWrappers\AddInWrapper.cs" />
|
||||||
<Compile Include="Stubs\OutlookWrappers\OutlookItemWrapper.cs" />
|
<Compile Include="Stubs\OutlookWrappers\OutlookItemWrapper.cs" />
|
||||||
<Compile Include="UI\Outlook\OutlookImageList.cs" />
|
<Compile Include="UI\Outlook\OutlookImageList.cs" />
|
||||||
<Compile Include="UI\Outlook\RibbonToggleButton.cs" />
|
<Compile Include="UI\Outlook\RibbonToggleButton.cs" />
|
||||||
|
@ -101,9 +101,9 @@ namespace Acacia.Features.DebugSupport
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add Add-ins
|
// Add Add-ins
|
||||||
foreach (COMAddIn addin in ThisAddIn.Instance.Application.COMAddIns)
|
foreach (KeyValuePair<string,string> addin in ThisAddIn.Instance.COMAddIns)
|
||||||
{
|
{
|
||||||
PropertyDescriptor p = new CustomPropertyDescriptor<string, DebugInfo>(addin.ProgId, DebugCategory.AddIns, addin.Description);
|
PropertyDescriptor p = new CustomPropertyDescriptor<string, DebugInfo>(addin.Key, DebugCategory.AddIns, addin.Value);
|
||||||
properties.Add(p);
|
properties.Add(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -234,7 +234,7 @@ namespace Acacia.Features.DebugSupport
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return ThisAddIn.Instance.Application.Version;
|
return ThisAddIn.Instance.Version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
/// along with this program.If not, see<http://www.gnu.org/licenses/>.
|
/// along with this program.If not, see<http://www.gnu.org/licenses/>.
|
||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Acacia.Features.ReplyFlags;
|
using Acacia.Features.ReplyFlags;
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -58,11 +57,6 @@ namespace Acacia.Features
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static Microsoft.Office.Interop.Outlook.Application App
|
|
||||||
{
|
|
||||||
get { return ThisAddIn.Instance.Application; }
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual public void GetCapabilities(ZPushCapabilities caps)
|
virtual public void GetCapabilities(ZPushCapabilities caps)
|
||||||
{
|
{
|
||||||
caps.Add(Name.ToLower());
|
caps.Add(Name.ToLower());
|
||||||
@ -206,7 +200,7 @@ namespace Acacia.Features
|
|||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_mailEvents == null)
|
if (_mailEvents == null)
|
||||||
_mailEvents = new MailEvents(App);
|
_mailEvents = new MailEvents(ThisAddIn.Instance);
|
||||||
return _mailEvents;
|
return _mailEvents;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -190,12 +190,14 @@ namespace Acacia.Features.FreeBusy
|
|||||||
if (account != null && handler.Contacts != null)
|
if (account != null && handler.Contacts != null)
|
||||||
{
|
{
|
||||||
// Look for the email address. If found, use the account associated with the GAB
|
// Look for the email address. If found, use the account associated with the GAB
|
||||||
ISearch<IContactItem> search = handler.Contacts.Search<IContactItem>();
|
using (ISearch<IContactItem> search = handler.Contacts.Search<IContactItem>())
|
||||||
search.AddField("urn:schemas:contacts:email1").SetOperation(SearchOperation.Equal, username);
|
|
||||||
using (IItem result = search.SearchOne())
|
|
||||||
{
|
{
|
||||||
if (result != null)
|
search.AddField("urn:schemas:contacts:email1").SetOperation(SearchOperation.Equal, username);
|
||||||
return account;
|
using (IItem result = search.SearchOne())
|
||||||
|
{
|
||||||
|
if (result != null)
|
||||||
|
return account;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -30,6 +29,7 @@ using System.ComponentModel;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Acacia.UI;
|
using Acacia.UI;
|
||||||
using static Acacia.DebugOptions;
|
using static Acacia.DebugOptions;
|
||||||
|
using Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Features.GAB
|
namespace Acacia.Features.GAB
|
||||||
{
|
{
|
||||||
@ -233,7 +233,7 @@ namespace Acacia.Features.GAB
|
|||||||
/// <param name="cancel"></param>
|
/// <param name="cancel"></param>
|
||||||
private void DoSuppressEvent(IItem item, ref bool cancel)
|
private void DoSuppressEvent(IItem item, ref bool cancel)
|
||||||
{
|
{
|
||||||
if (item != null)
|
/*if (item != null)
|
||||||
{
|
{
|
||||||
foreach (Inspector inspector in App.Inspectors)
|
foreach (Inspector inspector in App.Inspectors)
|
||||||
{
|
{
|
||||||
@ -248,7 +248,8 @@ namespace Acacia.Features.GAB
|
|||||||
MessageBoxButtons.OK,
|
MessageBoxButtons.OK,
|
||||||
MessageBoxIcon.Warning
|
MessageBoxIcon.Warning
|
||||||
);
|
);
|
||||||
cancel = true;
|
cancel = true;*/
|
||||||
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -263,7 +264,7 @@ namespace Acacia.Features.GAB
|
|||||||
BeginProcessing();
|
BeginProcessing();
|
||||||
|
|
||||||
// Delete any contacts folders in the local store
|
// Delete any contacts folders in the local store
|
||||||
using (ZPushLocalStore store = ZPushLocalStore.GetInstance(App))
|
using (ZPushLocalStore store = ZPushLocalStore.GetInstance(ThisAddIn.Instance))
|
||||||
{
|
{
|
||||||
if (store != null)
|
if (store != null)
|
||||||
{
|
{
|
||||||
@ -353,7 +354,7 @@ namespace Acacia.Features.GAB
|
|||||||
_store.Dispose();
|
_store.Dispose();
|
||||||
_store = null;
|
_store = null;
|
||||||
}
|
}
|
||||||
_store = ZPushLocalStore.GetInstance(App);
|
_store = ZPushLocalStore.GetInstance(ThisAddIn.Instance);
|
||||||
if (_store == null)
|
if (_store == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@ -469,7 +470,7 @@ namespace Acacia.Features.GAB
|
|||||||
_store.Dispose();
|
_store.Dispose();
|
||||||
_store = null;
|
_store = null;
|
||||||
}
|
}
|
||||||
_store = ZPushLocalStore.GetInstance(App);
|
_store = ZPushLocalStore.GetInstance(ThisAddIn.Instance);
|
||||||
if (_store == null)
|
if (_store == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -262,16 +262,18 @@ namespace Acacia.Features.GAB
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Delete the old contacts from this chunk
|
// Delete the old contacts from this chunk
|
||||||
ISearch<IItem> search = Contacts.Search<IItem>();
|
using (ISearch<IItem> search = Contacts.Search<IItem>())
|
||||||
search.AddField(PROP_SEQUENCE, true).SetOperation(SearchOperation.Equal, index.numberOfChunks);
|
|
||||||
search.AddField(PROP_CHUNK, true).SetOperation(SearchOperation.Equal, index.chunk);
|
|
||||||
foreach (IItem oldItem in search.Search())
|
|
||||||
{
|
{
|
||||||
// TODO: Search should handle this, like folder enumeration
|
search.AddField(PROP_SEQUENCE, true).SetOperation(SearchOperation.Equal, index.numberOfChunks);
|
||||||
using (oldItem)
|
search.AddField(PROP_CHUNK, true).SetOperation(SearchOperation.Equal, index.chunk);
|
||||||
|
foreach (IItem oldItem in search.Search())
|
||||||
{
|
{
|
||||||
Logger.Instance.Trace(this, "Deleting GAB entry: {0}", oldItem.Subject);
|
// TODO: Search should handle this, like folder enumeration
|
||||||
oldItem.Delete();
|
using (oldItem)
|
||||||
|
{
|
||||||
|
Logger.Instance.Trace(this, "Deleting GAB entry: {0}", oldItem.Subject);
|
||||||
|
oldItem.Delete();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -616,9 +618,11 @@ namespace Acacia.Features.GAB
|
|||||||
|
|
||||||
private IItem FindItemById(string id)
|
private IItem FindItemById(string id)
|
||||||
{
|
{
|
||||||
ISearch<IItem> search = Contacts.Search<IItem>();
|
using (ISearch<IItem> search = Contacts.Search<IItem>())
|
||||||
search.AddField(PROP_GAB_ID, true).SetOperation(SearchOperation.Equal, id);
|
{
|
||||||
return search.SearchOne();
|
search.AddField(PROP_GAB_ID, true).SetOperation(SearchOperation.Equal, id);
|
||||||
|
return search.SearchOne();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetItemStandard(IItem item, string id, Dictionary<string, object> value, ChunkIndex index)
|
private void SetItemStandard(IItem item, string id, Dictionary<string, object> value, ChunkIndex index)
|
||||||
|
@ -18,7 +18,6 @@ using Acacia.Stubs;
|
|||||||
using Acacia.Stubs.OutlookWrappers;
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
@ -122,7 +121,7 @@ namespace Acacia.Features.Notes
|
|||||||
Logger.Instance.Trace(this, "PatchFolder: {0}", folderId);
|
Logger.Instance.Trace(this, "PatchFolder: {0}", folderId);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (IFolder folder = Mapping.GetFolderFromID(folderId))
|
using (IFolder folder = ThisAddIn.Instance.GetFolderFromID(folderId))
|
||||||
{
|
{
|
||||||
if (folder == null)
|
if (folder == null)
|
||||||
return;
|
return;
|
||||||
@ -168,7 +167,7 @@ namespace Acacia.Features.Notes
|
|||||||
Logger.Instance.Trace(this, "UnpatchFolder: {0}", folderId);
|
Logger.Instance.Trace(this, "UnpatchFolder: {0}", folderId);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (IFolder folder = Mapping.GetFolderFromID(folderId))
|
using (IFolder folder = ThisAddIn.Instance.GetFolderFromID(folderId))
|
||||||
{
|
{
|
||||||
if (folder == null)
|
if (folder == null)
|
||||||
return;
|
return;
|
||||||
|
@ -19,7 +19,6 @@ using Acacia.UI.Outlook;
|
|||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
using Acacia.ZPush.Connect;
|
using Acacia.ZPush.Connect;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -22,7 +22,6 @@ using System.Threading.Tasks;
|
|||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using static Acacia.DebugOptions;
|
using static Acacia.DebugOptions;
|
||||||
|
|
||||||
namespace Acacia.Features.ReplyFlags
|
namespace Acacia.Features.ReplyFlags
|
||||||
|
@ -18,7 +18,6 @@ using Acacia.Stubs;
|
|||||||
using Acacia.Stubs.OutlookWrappers;
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
@ -22,7 +22,6 @@ using System.Threading.Tasks;
|
|||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Acacia.Features.SharedFolders;
|
using Acacia.Features.SharedFolders;
|
||||||
using Acacia.ZPush.API.SharedFolders;
|
using Acacia.ZPush.API.SharedFolders;
|
||||||
using static Acacia.DebugOptions;
|
using static Acacia.DebugOptions;
|
||||||
@ -86,7 +85,8 @@ namespace Acacia.Features.SendAs
|
|||||||
Logger.Instance.Trace(this, "Checking, Shared folder owner: {0}", shared.Store.UserName);
|
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
|
// It's a shared folder, use the owner as the sender if possible
|
||||||
// TODO: make a wrapper for this
|
// TODO: make a wrapper for this
|
||||||
var recip = ThisAddIn.Instance.Application.Session.CreateRecipient(shared.Store.UserName);
|
// 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);
|
Logger.Instance.Trace(this, "Checking, Shared folder owner recipient: {0}", recip.Name);
|
||||||
if (recip != null && recip.Resolve())
|
if (recip != null && recip.Resolve())
|
||||||
{
|
{
|
||||||
|
52
src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IAddIn.cs
Normal file
52
src/AcaciaZPushPlugin/AcaciaZPushPlugin/Stubs/IAddIn.cs
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
using Acacia.Features;
|
||||||
|
using Acacia.UI.Outlook;
|
||||||
|
using Acacia.ZPush;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs
|
||||||
|
{
|
||||||
|
public interface IAddIn
|
||||||
|
{
|
||||||
|
NSOutlook.Application RawApp { get; } // TODO: remove
|
||||||
|
|
||||||
|
ZPushWatcher Watcher { get; }
|
||||||
|
IEnumerable<Feature> Features { get; }
|
||||||
|
IEnumerable<KeyValuePair<string,string>> COMAddIns { get; }
|
||||||
|
string Version { get; }
|
||||||
|
|
||||||
|
IWin32Window Window { get; }
|
||||||
|
|
||||||
|
OutlookUI OutlookUI { get; }
|
||||||
|
|
||||||
|
#region Event handlers
|
||||||
|
|
||||||
|
// TODO: custom event types
|
||||||
|
event NSOutlook.ApplicationEvents_11_ItemLoadEventHandler ItemLoad;
|
||||||
|
event NSOutlook.ApplicationEvents_11_ItemSendEventHandler ItemSend;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends and receives all accounts.
|
||||||
|
/// </summary>
|
||||||
|
void SendReceive();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Restarts the application
|
||||||
|
/// </summary>
|
||||||
|
void Restart();
|
||||||
|
|
||||||
|
void InvokeUI(Action action);
|
||||||
|
|
||||||
|
IFolder GetFolderFromID(string folderId);
|
||||||
|
|
||||||
|
FeatureType GetFeature<FeatureType>()
|
||||||
|
where FeatureType : Feature;
|
||||||
|
}
|
||||||
|
}
|
@ -24,7 +24,7 @@ namespace Acacia.Stubs
|
|||||||
{
|
{
|
||||||
public interface IBase : IComWrapper
|
public interface IBase : IComWrapper
|
||||||
{
|
{
|
||||||
#region MAPI properties
|
#region Properties
|
||||||
|
|
||||||
bool AttrHidden { get; set; }
|
bool AttrHidden { get; set; }
|
||||||
|
|
||||||
@ -34,21 +34,31 @@ namespace Acacia.Stubs
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Ids and hierarchy
|
||||||
|
|
||||||
string EntryId { get; }
|
string EntryId { get; }
|
||||||
IFolder Parent { get; }
|
IFolder Parent { get; }
|
||||||
string ParentEntryId { get; }
|
string ParentEntryId { get; }
|
||||||
|
|
||||||
IStore Store { get; }
|
IStore Store { get; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Quick accessor to Store.Id, to prevent allocation a wrapper for it.
|
/// Quick accessor to Store.Id, to prevent allocating a wrapper for it.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string StoreId { get; }
|
string StoreId { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Quick accessor to Store.DisplayName, to prevent allocation a wrapper for it.
|
/// Quick accessor to Store.DisplayName, to prevent allocating a wrapper for it.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
string StoreDisplayName { get; }
|
string StoreDisplayName { get; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
|
||||||
void Delete();
|
void Delete();
|
||||||
|
|
||||||
string ToString();
|
string ToString();
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,11 @@ namespace Acacia.Stubs
|
|||||||
string DLName { get; set; }
|
string DLName { get; set; }
|
||||||
string SMTPAddress { get; set; }
|
string SMTPAddress { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a member to the distribution list.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The item. This is not disposed or released.</param>
|
||||||
|
/// <exception cref="NotSupportedException">If the item is not a contact or distribution list</exception>
|
||||||
void AddMember(IItem item);
|
void AddMember(IItem item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
|
|
||||||
namespace Acacia.Stubs
|
namespace Acacia.Stubs
|
||||||
{
|
{
|
||||||
@ -34,6 +33,7 @@ namespace Acacia.Stubs
|
|||||||
string SenderEmailAddress { get; }
|
string SenderEmailAddress { get; }
|
||||||
string SenderName { get; }
|
string SenderName { get; }
|
||||||
|
|
||||||
void SetSender(AddressEntry addressEntry);
|
// TODO: make a wrapper for this
|
||||||
|
void SetSender(Microsoft.Office.Interop.Outlook.AddressEntry addressEntry);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ namespace Acacia.Stubs
|
|||||||
ISearchField AddField(string name, bool isUserField = false);
|
ISearchField AddField(string name, bool isUserField = false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface ISearch<ItemType> : ISearchOperator
|
public interface ISearch<ItemType> : ISearchOperator, IDisposable
|
||||||
where ItemType : IItem
|
where ItemType : IItem
|
||||||
{
|
{
|
||||||
ISearchOperator AddOperator(SearchOperator oper);
|
ISearchOperator AddOperator(SearchOperator oper);
|
||||||
|
@ -0,0 +1,188 @@
|
|||||||
|
using Acacia.Features;
|
||||||
|
using Acacia.Native;
|
||||||
|
using Acacia.UI.Outlook;
|
||||||
|
using Acacia.Utils;
|
||||||
|
using Acacia.ZPush;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
|
{
|
||||||
|
public class AddInWrapper : IAddIn
|
||||||
|
{
|
||||||
|
private readonly ThisAddIn _thisAddIn;
|
||||||
|
private NSOutlook.Application _app;
|
||||||
|
|
||||||
|
public AddInWrapper(ThisAddIn thisAddIn)
|
||||||
|
{
|
||||||
|
this._thisAddIn = thisAddIn;
|
||||||
|
this._app = thisAddIn.Application;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendReceive()
|
||||||
|
{
|
||||||
|
NSOutlook.NameSpace session = _app.Session;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
session.SendAndReceive(false);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ComRelease.Release(session);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Restart()
|
||||||
|
{
|
||||||
|
// Can not use the assembly location, as that is in the GAC
|
||||||
|
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
|
||||||
|
UriBuilder uri = new UriBuilder(codeBase);
|
||||||
|
string path = Uri.UnescapeDataString(uri.Path);
|
||||||
|
// Create the path to the restarter
|
||||||
|
path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(path), "OutlookRestarter.exe");
|
||||||
|
|
||||||
|
// Run that
|
||||||
|
Process process = new Process();
|
||||||
|
process.StartInfo = new ProcessStartInfo(path, Environment.CommandLine);
|
||||||
|
process.Start();
|
||||||
|
|
||||||
|
// And close us
|
||||||
|
_app.Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
public event NSOutlook.ApplicationEvents_11_ItemLoadEventHandler ItemLoad
|
||||||
|
{
|
||||||
|
add { _app.ItemLoad += value; }
|
||||||
|
remove { _app.ItemLoad -= value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public event NSOutlook.ApplicationEvents_11_ItemSendEventHandler ItemSend
|
||||||
|
{
|
||||||
|
add { _app.ItemSend += value; }
|
||||||
|
remove { _app.ItemSend -= value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public NSOutlook.Application RawApp
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _app;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public OutlookUI OutlookUI { get { return _thisAddIn.OutlookUI; } }
|
||||||
|
|
||||||
|
public ZPushWatcher Watcher { get { return _thisAddIn.Watcher; } }
|
||||||
|
public IEnumerable<Feature> Features { get { return _thisAddIn.Features; } }
|
||||||
|
public IEnumerable<KeyValuePair<string, string>> COMAddIns
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
Microsoft.Office.Core.COMAddIns addIns = _app.COMAddIns;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
foreach(Microsoft.Office.Core.COMAddIn comAddin in addIns)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
yield return new KeyValuePair<string, string>(comAddin.ProgId, comAddin.Description);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ComRelease.Release(comAddin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ComRelease.Release(addIns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Version
|
||||||
|
{
|
||||||
|
get { return _app.Version; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public FeatureType GetFeature<FeatureType>()
|
||||||
|
where FeatureType : Feature
|
||||||
|
{
|
||||||
|
foreach (Feature feature in Features)
|
||||||
|
{
|
||||||
|
if (feature is FeatureType)
|
||||||
|
return (FeatureType)feature;
|
||||||
|
}
|
||||||
|
return default(FeatureType);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void InvokeUI(Action action)
|
||||||
|
{
|
||||||
|
// [ZP-992] For some reason using the dispatcher causes a deadlock
|
||||||
|
// since switching to UI-chunked tasks. Running directly works.
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
|
||||||
|
public IFolder GetFolderFromID(string folderId)
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.NameSpace nmspace = com.Add(_app.Session);
|
||||||
|
NSOutlook.Folder f = (NSOutlook.Folder)nmspace.GetFolderFromID(folderId);
|
||||||
|
return Mapping.Wrap<IFolder>(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Window handle
|
||||||
|
|
||||||
|
private class WindowHandle : IWin32Window
|
||||||
|
{
|
||||||
|
private IntPtr hWnd;
|
||||||
|
|
||||||
|
public WindowHandle(IntPtr hWnd)
|
||||||
|
{
|
||||||
|
this.hWnd = hWnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntPtr Handle
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return hWnd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IWin32Window Window
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
IOleWindow win = _app.ActiveWindow() as IOleWindow;
|
||||||
|
if (win == null)
|
||||||
|
return null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
IntPtr hWnd;
|
||||||
|
win.GetWindow(out hWnd);
|
||||||
|
return new WindowHandle(hWnd);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
ComRelease.Release(win);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -15,18 +15,18 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
class AddressBookWrapper : FolderWrapper, IAddressBook
|
class AddressBookWrapper : FolderWrapper, IAddressBook
|
||||||
{
|
{
|
||||||
public AddressBookWrapper(Folder folder)
|
public AddressBookWrapper(NSOutlook.MAPIFolder folder)
|
||||||
:
|
:
|
||||||
base(folder)
|
base(folder)
|
||||||
{
|
{
|
||||||
@ -35,10 +35,9 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
foreach(dynamic item in _item.Items)
|
foreach(dynamic item in _item.Items.RawEnum())
|
||||||
{
|
{
|
||||||
item.Delete();
|
item.Delete();
|
||||||
ComRelease.Release(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,27 +19,21 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
class AppointmentItemWrapper : OutlookItemWrapper<AppointmentItem>, IAppointmentItem, IZPushItem
|
class AppointmentItemWrapper : OutlookItemWrapper<NSOutlook.AppointmentItem>, IAppointmentItem, IZPushItem
|
||||||
{
|
{
|
||||||
|
|
||||||
internal AppointmentItemWrapper(AppointmentItem item)
|
internal AppointmentItemWrapper(NSOutlook.AppointmentItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
public override string ToString() { return "Appointment: " + Subject; }
|
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
#region IAppointmentItem implementation
|
||||||
{
|
|
||||||
return _item.PropertyAccessor;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Properties
|
|
||||||
|
|
||||||
public DateTime Start
|
public DateTime Start
|
||||||
{
|
{
|
||||||
@ -58,6 +52,29 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Location = value; }
|
set { _item.Location = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Wrapper methods
|
||||||
|
|
||||||
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
|
{
|
||||||
|
return _item.UserProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
|
{
|
||||||
|
return _item.PropertyAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Appointment:" + Subject;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IItem implementation
|
||||||
|
|
||||||
public string Body
|
public string Body
|
||||||
{
|
{
|
||||||
get { return _item.Body; }
|
get { return _item.Body; }
|
||||||
@ -70,45 +87,75 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Subject = value; }
|
set { _item.Subject = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStore Store { get { return StoreWrapper.Wrap(_item.Parent?.Store); } }
|
|
||||||
// TODO: release needed
|
|
||||||
public string StoreId { get { return _item.Parent?.Store?.StoreID; } }
|
|
||||||
public string StoreDisplayName { get { return _item.Parent?.Store?.DisplayName; } }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
|
||||||
return _item.UserProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
|
||||||
public void Save() { _item.Save(); }
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
public IFolder Parent
|
public IFolder Parent
|
||||||
{
|
{
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
public IStore Store
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreDisplayName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Delete() { _item.Delete(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,9 +43,8 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
if (!_isDisposed)
|
if (!_isDisposed)
|
||||||
{
|
{
|
||||||
Logger.Instance.Warning(this, "Undisposed wrapper: {0}", _createdTrace);
|
Logger.Instance.Warning(this, "Undisposed wrapper: {0}", _createdTrace);
|
||||||
Dispose();
|
// Dispose, but don't count auto disposals, so the stats show it.
|
||||||
// Don't count auto disposals
|
DoRelease();
|
||||||
Interlocked.Decrement(ref Statistics.DisposedWrappers);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,30 +15,23 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
class ContactItemWrapper : OutlookItemWrapper<ContactItem>, IContactItem
|
class ContactItemWrapper : OutlookItemWrapper<NSOutlook.ContactItem>, IContactItem
|
||||||
{
|
{
|
||||||
internal ContactItemWrapper(ContactItem item)
|
internal ContactItemWrapper(NSOutlook.ContactItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
|
||||||
{
|
|
||||||
return _item.PropertyAccessor;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString() { return "Contact: " + Subject; }
|
|
||||||
|
|
||||||
#region IContactItem implementation
|
#region IContactItem implementation
|
||||||
|
|
||||||
public string CustomerID
|
public string CustomerID
|
||||||
@ -179,6 +172,30 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Language = value; }
|
set { _item.Language = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetPicture(string path)
|
||||||
|
{
|
||||||
|
_item.AddPicture(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Wrapper methods
|
||||||
|
|
||||||
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
|
{
|
||||||
|
return _item.UserProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
|
{
|
||||||
|
return _item.PropertyAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Contact:" + Subject;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IItem implementation
|
#region IItem implementation
|
||||||
@ -195,49 +212,74 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Subject = value; }
|
set { _item.Subject = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStore Store { get { return StoreWrapper.Wrap(_item.Parent?.Store); } }
|
|
||||||
// TODO: release needed
|
|
||||||
public string StoreId { get { return _item.Parent?.Store?.StoreID; } }
|
|
||||||
public string StoreDisplayName { get { return _item.Parent?.Store?.DisplayName; } }
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
|
||||||
return _item.UserProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
|
||||||
public void Save() { _item.Save(); }
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
public void SetPicture(string path)
|
|
||||||
{
|
|
||||||
_item.AddPicture(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region IBase implementation
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
public IFolder Parent
|
public IFolder Parent
|
||||||
{
|
{
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
public IStore Store
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreDisplayName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Delete() { _item.Delete(); }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -19,47 +19,35 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
class DistributionListWrapper : OutlookItemWrapper<DistListItem>, IDistributionList
|
class DistributionListWrapper : OutlookItemWrapper<NSOutlook.DistListItem>, IDistributionList
|
||||||
{
|
{
|
||||||
internal DistributionListWrapper(DistListItem item)
|
internal DistributionListWrapper(NSOutlook.DistListItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
#region IDistributionList implementation
|
||||||
{
|
|
||||||
return _item.PropertyAccessor;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Properties
|
|
||||||
|
|
||||||
public string SMTPAddress
|
public string SMTPAddress
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
PropertyAccessor props = _item.PropertyAccessor;
|
return (string)GetProperty(OutlookConstants.PR_EMAIL1EMAILADDRESS);
|
||||||
try
|
|
||||||
{
|
|
||||||
return (string)props.GetProperty(OutlookConstants.PR_EMAIL1EMAILADDRESS);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(props);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
string displayName = DLName + " (" + value + ")";
|
using (ComRelease com = new ComRelease())
|
||||||
byte[] oneOffId = CreateOneOffMemberId(DLName, "SMTP", value);
|
|
||||||
PropertyAccessor props = _item.PropertyAccessor;
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
string displayName = DLName + " (" + value + ")";
|
||||||
|
byte[] oneOffId = CreateOneOffMemberId(DLName, "SMTP", value);
|
||||||
|
|
||||||
|
NSOutlook.PropertyAccessor props = com.Add(_item.PropertyAccessor);
|
||||||
props.SetProperties(
|
props.SetProperties(
|
||||||
new string[]
|
new string[]
|
||||||
{
|
{
|
||||||
@ -79,35 +67,20 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(props);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
public string DLName
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
{
|
||||||
return _item.UserProperties;
|
get { return _item.DLName; }
|
||||||
|
set { _item.DLName = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
|
||||||
public void Save() { _item.Save(); }
|
|
||||||
|
|
||||||
public void AddMember(IItem item)
|
public void AddMember(IItem item)
|
||||||
{
|
{
|
||||||
if (item is IContactItem)
|
if (item is IContactItem)
|
||||||
{
|
{
|
||||||
string email = ((IContactItem)item).Email1Address;
|
AddContactMember((IContactItem)item);
|
||||||
Recipient recipient = ThisAddIn.Instance.Application.Session.CreateRecipient(email);
|
|
||||||
if (recipient.Resolve())
|
|
||||||
_item.AddMember(recipient);
|
|
||||||
else
|
|
||||||
Logger.Instance.Warning(this, "Unable to resolve recipient: {0}", email);
|
|
||||||
}
|
}
|
||||||
else if (item is IDistributionList)
|
else if (item is IDistributionList)
|
||||||
{
|
{
|
||||||
@ -115,8 +88,19 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Logger.Instance.Warning(this, "Unknown item type when adding to distlist: {0}", item);
|
throw new NotSupportedException("Unknown item type when adding to distlist: " + item.GetType());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddDistributionListMember(IDistributionList member)
|
private void AddDistributionListMember(IDistributionList member)
|
||||||
@ -124,9 +108,8 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
// Resolving a distribution list can only be done by name. This fails if the name is in multiple
|
// Resolving a distribution list can only be done by name. This fails if the name is in multiple
|
||||||
// groups (e.g. 'Germany' and 'Sales Germany' fails to find Germany). Patch the member
|
// groups (e.g. 'Germany' and 'Sales Germany' fails to find Germany). Patch the member
|
||||||
// tables explicitly.
|
// tables explicitly.
|
||||||
PropertyAccessor props = _item.PropertyAccessor;
|
object[] members = (object[])GetProperty(OutlookConstants.PR_DISTLIST_MEMBERS);
|
||||||
object[] members = props.GetProperty(OutlookConstants.PR_DISTLIST_MEMBERS);
|
object[] oneOffMembers = (object[])GetProperty(OutlookConstants.PR_DISTLIST_ONEOFFMEMBERS);
|
||||||
object[] oneOffMembers = props.GetProperty(OutlookConstants.PR_DISTLIST_ONEOFFMEMBERS);
|
|
||||||
|
|
||||||
// Create the new member ids
|
// Create the new member ids
|
||||||
byte[] memberId = CreateMemberId(member);
|
byte[] memberId = CreateMemberId(member);
|
||||||
@ -163,7 +146,7 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
newOneOffMembers[existingIndex] = oneOffMemberId;
|
newOneOffMembers[existingIndex] = oneOffMemberId;
|
||||||
|
|
||||||
// Write back
|
// Write back
|
||||||
props.SetProperties(
|
SetProperties(
|
||||||
new string[] { OutlookConstants.PR_DISTLIST_MEMBERS, OutlookConstants.PR_DISTLIST_ONEOFFMEMBERS },
|
new string[] { OutlookConstants.PR_DISTLIST_MEMBERS, OutlookConstants.PR_DISTLIST_ONEOFFMEMBERS },
|
||||||
new object[] { newMembers, newOneOffMembers }
|
new object[] { newMembers, newOneOffMembers }
|
||||||
);
|
);
|
||||||
@ -213,14 +196,27 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public override string ToString() { return "DistributionList: " + DLName; }
|
#region Wrapper methods
|
||||||
|
|
||||||
public string DLName
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
{
|
{
|
||||||
get { return _item.DLName; }
|
return _item.UserProperties;
|
||||||
set { _item.DLName = value; }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
|
{
|
||||||
|
return _item.PropertyAccessor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "DistributionList: " + DLName;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IItem implementation
|
||||||
|
|
||||||
public string Body
|
public string Body
|
||||||
{
|
{
|
||||||
get { return _item.Body; }
|
get { return _item.Body; }
|
||||||
@ -233,40 +229,75 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Subject = value; }
|
set { _item.Subject = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IFolder Parent { get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); } }
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
|
public IFolder Parent
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public IStore Store { get { return StoreWrapper.Wrap(_item.Parent?.Store); } }
|
|
||||||
|
public IStore Store
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string StoreId
|
public string StoreId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
// TODO: release needed
|
using (ComRelease com = new ComRelease())
|
||||||
return _item.Parent?.Store?.StoreID;
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string StoreDisplayName
|
public string StoreDisplayName
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
// TODO: release needed
|
using (ComRelease com = new ComRelease())
|
||||||
return _item.Parent?.Store?.DisplayName;
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
public void Delete() { _item.Delete(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -23,39 +22,41 @@ using System.Threading.Tasks;
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
public class FolderWrapper : OutlookWrapper<Folder>, IFolder
|
public class FolderWrapper : OutlookWrapper<NSOutlook.Folder>, IFolder
|
||||||
{
|
{
|
||||||
public FolderWrapper(Folder folder)
|
public FolderWrapper(NSOutlook.MAPIFolder folder)
|
||||||
:
|
:
|
||||||
base(folder)
|
base((NSOutlook.Folder)folder)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
{
|
{
|
||||||
return _item.PropertyAccessor;
|
return _item.PropertyAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IFolder Parent
|
public IFolder Parent
|
||||||
{
|
{
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,17 +70,20 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
// The parent of the root item is a session, not null. Hence the explicit type checks.
|
// The parent of the root item is a session, not null. Hence the explicit type checks.
|
||||||
Folder current = _item;
|
// _item is managed by this wrapper and does not need to be released.
|
||||||
|
NSOutlook.Folder current = _item;
|
||||||
for (int i = 0; i < depth; ++i)
|
for (int i = 0; i < depth; ++i)
|
||||||
{
|
{
|
||||||
object parent = current.Parent;
|
object parent = com.Add(current.Parent);
|
||||||
com.Add(parent);
|
|
||||||
if (!(parent is Folder))
|
current = parent as NSOutlook.Folder;
|
||||||
|
if (current == null)
|
||||||
return false;
|
return false;
|
||||||
current = (Folder)parent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return !(com.Add(current.Parent) is Folder);
|
// Check if the remaining parent is a folder
|
||||||
|
object finalParent = com.Add(current.Parent);
|
||||||
|
return !(finalParent is NSOutlook.Folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,15 +122,18 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
public ItemType ItemType { get { return (ItemType)(int)_item.DefaultItemType; } }
|
public ItemType ItemType { get { return (ItemType)(int)_item.DefaultItemType; } }
|
||||||
|
|
||||||
public class IItemsEnumerator<ItemType> : IEnumerator<ItemType>
|
#region Enumeration
|
||||||
|
|
||||||
|
public class ItemsEnumerator<ItemType> : ComWrapper, IEnumerator<ItemType>
|
||||||
where ItemType : IItem
|
where ItemType : IItem
|
||||||
{
|
{
|
||||||
private Items _items;
|
private NSOutlook.Items _items;
|
||||||
private IEnumerator _enum;
|
private IEnumerator _enum;
|
||||||
private ItemType _last;
|
private ItemType _last;
|
||||||
|
|
||||||
public IItemsEnumerator(Folder _folder, string field, bool descending)
|
public ItemsEnumerator(NSOutlook.Folder _folder, string field, bool descending)
|
||||||
{
|
{
|
||||||
|
// TODO: can _items be released here already?
|
||||||
this._items = _folder.Items;
|
this._items = _folder.Items;
|
||||||
if (field != null)
|
if (field != null)
|
||||||
{
|
{
|
||||||
@ -135,6 +142,23 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
this._enum = _items.GetEnumerator();
|
this._enum = _items.GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void DoRelease()
|
||||||
|
{
|
||||||
|
CleanLast();
|
||||||
|
if (_enum != null)
|
||||||
|
{
|
||||||
|
if (_enum is IDisposable)
|
||||||
|
((IDisposable)_enum).Dispose();
|
||||||
|
ComRelease.Release(_enum);
|
||||||
|
_enum = null;
|
||||||
|
}
|
||||||
|
if (_items != null)
|
||||||
|
{
|
||||||
|
ComRelease.Release(_items);
|
||||||
|
_items = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ItemType Current
|
public ItemType Current
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -162,23 +186,6 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
CleanLast();
|
|
||||||
if (_enum != null)
|
|
||||||
{
|
|
||||||
if (_enum is IDisposable)
|
|
||||||
((IDisposable)_enum).Dispose();
|
|
||||||
ComRelease.Release(_enum);
|
|
||||||
_enum = null;
|
|
||||||
}
|
|
||||||
if (_items != null)
|
|
||||||
{
|
|
||||||
ComRelease.Release(_items);
|
|
||||||
_items = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool MoveNext()
|
public bool MoveNext()
|
||||||
{
|
{
|
||||||
CleanLast();
|
CleanLast();
|
||||||
@ -192,14 +199,15 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class IItemsEnumerable<ItemType> : IEnumerable<ItemType>
|
public class ItemsEnumerable<ItemType> : IEnumerable<ItemType>
|
||||||
where ItemType : IItem
|
where ItemType : IItem
|
||||||
{
|
{
|
||||||
private readonly Folder _folder;
|
// Managed by the caller, not released here
|
||||||
|
private readonly NSOutlook.Folder _folder;
|
||||||
private readonly string _field;
|
private readonly string _field;
|
||||||
private readonly bool _descending;
|
private readonly bool _descending;
|
||||||
|
|
||||||
public IItemsEnumerable(Folder folder, string field, bool descending)
|
public ItemsEnumerable(NSOutlook.Folder folder, string field, bool descending)
|
||||||
{
|
{
|
||||||
this._folder = folder;
|
this._folder = folder;
|
||||||
this._field = field;
|
this._field = field;
|
||||||
@ -208,7 +216,7 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
public IEnumerator<ItemType> GetEnumerator()
|
public IEnumerator<ItemType> GetEnumerator()
|
||||||
{
|
{
|
||||||
return new IItemsEnumerator<ItemType>(_folder, _field, _descending);
|
return new ItemsEnumerator<ItemType>(_folder, _field, _descending);
|
||||||
}
|
}
|
||||||
|
|
||||||
IEnumerator IEnumerable.GetEnumerator()
|
IEnumerator IEnumerable.GetEnumerator()
|
||||||
@ -221,15 +229,17 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return new IItemsEnumerable<IItem>(_item, null, false);
|
return new ItemsEnumerable<IItem>(_item, null, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<IItem> ItemsSorted(string field, bool descending)
|
public IEnumerable<IItem> ItemsSorted(string field, bool descending)
|
||||||
{
|
{
|
||||||
return new IItemsEnumerable<IItem>(_item, field, descending);
|
return new ItemsEnumerable<IItem>(_item, field, descending);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public IItem GetItemById(string entryId)
|
public IItem GetItemById(string entryId)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -274,10 +284,13 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
return new SearchWrapper<ItemType>(_item.Items);
|
return new SearchWrapper<ItemType>(_item.Items);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region Subfolders
|
||||||
|
|
||||||
public IEnumerable<FolderType> GetSubFolders<FolderType>()
|
public IEnumerable<FolderType> GetSubFolders<FolderType>()
|
||||||
where FolderType : IFolder
|
where FolderType : IFolder
|
||||||
{
|
{
|
||||||
foreach (MAPIFolder folder in _item.Folders)
|
// Don't release the items, the wrapper manages them
|
||||||
|
foreach (NSOutlook.Folder folder in _item.Folders.RawEnum(false))
|
||||||
{
|
{
|
||||||
yield return WrapFolder<FolderType>(folder);
|
yield return WrapFolder<FolderType>(folder);
|
||||||
};
|
};
|
||||||
@ -287,14 +300,19 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
where FolderType : IFolder
|
where FolderType : IFolder
|
||||||
{
|
{
|
||||||
// Fetching the folder by name throws an exception if not found, loop and find
|
// Fetching the folder by name throws an exception if not found, loop and find
|
||||||
// to prevent exceptions in the log
|
// to prevent exceptions in the log.
|
||||||
MAPIFolder sub = null;
|
// Don't release the items in RawEnum, they are release manually or handed to WrapFolders.
|
||||||
foreach(MAPIFolder folder in _item.Folders)
|
NSOutlook.Folder sub = null;
|
||||||
|
foreach(NSOutlook.Folder folder in _item.Folders.RawEnum(false))
|
||||||
{
|
{
|
||||||
if (folder.Name == name)
|
if (folder.Name == name)
|
||||||
{
|
{
|
||||||
sub = folder;
|
sub = folder;
|
||||||
break;
|
break; // TODO: does this prevent the rest of the objects from getting released?
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ComRelease.Release(folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (sub == null)
|
if (sub == null)
|
||||||
@ -305,46 +323,47 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
public FolderType CreateFolder<FolderType>(string name)
|
public FolderType CreateFolder<FolderType>(string name)
|
||||||
where FolderType : IFolder
|
where FolderType : IFolder
|
||||||
{
|
{
|
||||||
Folders folders = _item.Folders;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folders folders = com.Add(_item.Folders);
|
||||||
if (typeof(FolderType) == typeof(IFolder))
|
if (typeof(FolderType) == typeof(IFolder))
|
||||||
{
|
{
|
||||||
return WrapFolder<FolderType>(folders.Add(name));
|
return WrapFolder<FolderType>(folders.Add(name));
|
||||||
}
|
}
|
||||||
else if (typeof(FolderType) == typeof(IAddressBook))
|
else if (typeof(FolderType) == typeof(IAddressBook))
|
||||||
{
|
{
|
||||||
MAPIFolder newFolder = folders.Add(name, OlDefaultFolders.olFolderContacts);
|
NSOutlook.MAPIFolder newFolder = folders.Add(name, NSOutlook.OlDefaultFolders.olFolderContacts);
|
||||||
newFolder.ShowAsOutlookAB = true;
|
newFolder.ShowAsOutlookAB = true;
|
||||||
return WrapFolder<FolderType>(newFolder);
|
return WrapFolder<FolderType>(newFolder);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(folders);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private FolderType WrapFolder<FolderType>(MAPIFolder folder)
|
private FolderType WrapFolder<FolderType>(NSOutlook.MAPIFolder folder)
|
||||||
where FolderType : IFolder
|
where FolderType : IFolder
|
||||||
{
|
{
|
||||||
if (typeof(FolderType) == typeof(IFolder))
|
if (typeof(FolderType) == typeof(IFolder))
|
||||||
{
|
{
|
||||||
return (FolderType)(IFolder)new FolderWrapper((Folder)folder);
|
return (FolderType)(IFolder)new FolderWrapper(folder);
|
||||||
}
|
}
|
||||||
else if (typeof(FolderType) == typeof(IAddressBook))
|
else if (typeof(FolderType) == typeof(IAddressBook))
|
||||||
{
|
{
|
||||||
return (FolderType)(IFolder)new AddressBookWrapper((Folder)folder);
|
return (FolderType)(IFolder)new AddressBookWrapper(folder);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
ComRelease.Release(folder);
|
||||||
throw new NotSupportedException();
|
throw new NotSupportedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
public IStorageItem GetStorageItem(string name)
|
public IStorageItem GetStorageItem(string name)
|
||||||
{
|
{
|
||||||
StorageItem item = _item.GetStorage(name, OlStorageIdentifierType.olIdentifyBySubject);
|
NSOutlook.StorageItem item = _item.GetStorage(name, NSOutlook.OlStorageIdentifierType.olIdentifyBySubject);
|
||||||
if (item == null)
|
if (item == null)
|
||||||
return null;
|
return null;
|
||||||
return new StorageItemWrapper(item);
|
return new StorageItemWrapper(item);
|
||||||
@ -359,16 +378,12 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
public ItemType Create<ItemType>()
|
public ItemType Create<ItemType>()
|
||||||
where ItemType : IItem
|
where ItemType : IItem
|
||||||
{
|
{
|
||||||
Items items = _item.Items;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Items items = com.Add(_item.Items);
|
||||||
object item = items.Add(Mapping.OutlookItemType<ItemType>());
|
object item = items.Add(Mapping.OutlookItemType<ItemType>());
|
||||||
return Mapping.Wrap<ItemType>(item);
|
return Mapping.Wrap<ItemType>(item);
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(items);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -415,12 +430,14 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
_item.BeforeItemMove -= HandleBeforeItemMove;
|
_item.BeforeItemMove -= HandleBeforeItemMove;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleBeforeItemMove(object item, MAPIFolder target, ref bool cancel)
|
private void HandleBeforeItemMove(object item, NSOutlook.MAPIFolder target, ref bool cancel)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (_beforeItemMove != null)
|
if (_beforeItemMove != null)
|
||||||
{
|
{
|
||||||
|
// TODO: there is a tiny potential for a leak here, if there is an exception in the wrap methods. Should
|
||||||
|
// only happen if Outlook sends the wrong type object though
|
||||||
using (IItem itemWrapped = Mapping.Wrap<IItem>(item))
|
using (IItem itemWrapped = Mapping.Wrap<IItem>(item))
|
||||||
using (IFolder targetWrapped = Mapping.Wrap<IFolder>(target))
|
using (IFolder targetWrapped = Mapping.Wrap<IFolder>(target))
|
||||||
{
|
{
|
||||||
@ -430,6 +447,11 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: check this
|
||||||
|
ComRelease.Release(item, target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch(System.Exception e)
|
catch(System.Exception e)
|
||||||
{
|
{
|
||||||
|
@ -19,27 +19,95 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
class MailItemWrapper : OutlookItemWrapper<MailItem>, IMailItem
|
class MailItemWrapper : OutlookItemWrapper<NSOutlook.MailItem>, IMailItem
|
||||||
{
|
{
|
||||||
internal MailItemWrapper(MailItem item)
|
internal MailItemWrapper(NSOutlook.MailItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
#region IMailItem implementation
|
||||||
|
|
||||||
|
public DateTime? AttrLastVerbExecutionTime
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return GetProperty(OutlookConstants.PR_LAST_VERB_EXECUTION_TIME) as DateTime?;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(OutlookConstants.PR_LAST_VERB_EXECUTION_TIME, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int AttrLastVerbExecuted
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (int)GetProperty(OutlookConstants.PR_LAST_VERB_EXECUTED);
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(OutlookConstants.PR_LAST_VERB_EXECUTED, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SenderEmailAddress
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
return com.Add(_item.Sender)?.Address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SenderName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
return com.Add(_item.Sender)?.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SetSender(NSOutlook.AddressEntry addressEntry)
|
||||||
|
{
|
||||||
|
_item.Sender = addressEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Wrapper methods
|
||||||
|
|
||||||
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
|
{
|
||||||
|
return _item.UserProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
{
|
{
|
||||||
return _item.PropertyAccessor;
|
return _item.PropertyAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() { return "Mail: " + Subject; }
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Mail:" + Subject;
|
||||||
|
}
|
||||||
|
|
||||||
#region Properties
|
#endregion
|
||||||
|
|
||||||
|
#region IItem implementation
|
||||||
|
|
||||||
public string Body
|
public string Body
|
||||||
{
|
{
|
||||||
@ -53,19 +121,44 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Subject = value; }
|
set { _item.Subject = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
|
public IFolder Parent
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ParentEntryId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return parent?.EntryID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public IStore Store
|
public IStore Store
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = (Folder)_item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return StoreWrapper.Wrap(parent?.Store);
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,17 +166,11 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = (Folder)_item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
Store store = null;
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
store = parent?.Store;
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return store?.StoreID;
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
}
|
return store.StoreID;
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
ComRelease.Release(store);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,76 +179,17 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = (Folder)_item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
Store store = null;
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
store = parent?.Store;
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return store?.DisplayName;
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
}
|
return store.StoreID;
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
ComRelease.Release(store);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string SenderEmailAddress
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
// TODO: should Sender be released?
|
|
||||||
return _item.Sender?.Address;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SenderName
|
|
||||||
{
|
|
||||||
get { return _item.Sender?.Name; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void SetSender(AddressEntry addressEntry)
|
|
||||||
{
|
|
||||||
_item.Sender = addressEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
|
||||||
return _item.UserProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
public void Delete() { _item.Delete(); }
|
||||||
public void Save() { _item.Save(); }
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
public IFolder Parent
|
|
||||||
{
|
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
|
||||||
}
|
|
||||||
public string ParentEntryId
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
Folder parent = _item.Parent;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return parent?.EntryID;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,12 +15,12 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
@ -32,7 +32,8 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="o">The Outlook object.</param>
|
/// <param name="o">The Outlook object.</param>
|
||||||
/// <returns>The IItem wrapper, or null if the object could not be wrapped</returns>
|
/// <returns>The IItem wrapper, or null if the object could not be wrapped</returns>
|
||||||
public static IBase Wrap(object o, bool mustRelease = true)
|
// TODO: made this private to see if it's still used
|
||||||
|
private static IBase Wrap(object o, bool mustRelease = true)
|
||||||
{
|
{
|
||||||
if (o == null)
|
if (o == null)
|
||||||
return null;
|
return null;
|
||||||
@ -47,25 +48,25 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
private static IBase CreateWrapper(object o)
|
private static IBase CreateWrapper(object o)
|
||||||
{
|
{
|
||||||
// TODO: switch on o.Class
|
// TODO: switch on o.Class
|
||||||
if (o is MailItem)
|
if (o is NSOutlook.MailItem)
|
||||||
return new MailItemWrapper((MailItem)o);
|
return new MailItemWrapper((NSOutlook.MailItem)o);
|
||||||
if (o is AppointmentItem)
|
if (o is NSOutlook.AppointmentItem)
|
||||||
return new AppointmentItemWrapper((AppointmentItem)o);
|
return new AppointmentItemWrapper((NSOutlook.AppointmentItem)o);
|
||||||
if (o is Folder)
|
if (o is NSOutlook.Folder)
|
||||||
return new FolderWrapper((Folder)o);
|
return new FolderWrapper((NSOutlook.Folder)o);
|
||||||
if (o is ContactItem)
|
if (o is NSOutlook.ContactItem)
|
||||||
return new ContactItemWrapper((ContactItem)o);
|
return new ContactItemWrapper((NSOutlook.ContactItem)o);
|
||||||
if (o is DistListItem)
|
if (o is NSOutlook.DistListItem)
|
||||||
return new DistributionListWrapper((DistListItem)o);
|
return new DistributionListWrapper((NSOutlook.DistListItem)o);
|
||||||
if (o is NoteItem)
|
if (o is NSOutlook.NoteItem)
|
||||||
return new NoteItemWrapper((NoteItem)o);
|
return new NoteItemWrapper((NSOutlook.NoteItem)o);
|
||||||
if (o is TaskItem)
|
if (o is NSOutlook.TaskItem)
|
||||||
return new TaskItemWrapper((TaskItem)o);
|
return new TaskItemWrapper((NSOutlook.TaskItem)o);
|
||||||
|
|
||||||
// TODO: support this?
|
|
||||||
if (o is ReportItem)
|
|
||||||
return null;
|
|
||||||
|
|
||||||
|
// TODO: support others?
|
||||||
|
// The caller assumes a wrapper will be returned, so any lingering object here will never be released.
|
||||||
|
// TODO: do this only if caller has mustRelease
|
||||||
|
ComRelease.Release(o);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,60 +75,45 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
return (Type)Wrap(o, mustRelease);
|
return (Type)Wrap(o, mustRelease);
|
||||||
}
|
}
|
||||||
|
// TODO: are these not the same now? Differ only on wrong type?
|
||||||
public static Type WrapOrDefault<Type>(object o, bool mustRelease = true)
|
public static Type WrapOrDefault<Type>(object o, bool mustRelease = true)
|
||||||
where Type : IBase
|
where Type : IBase
|
||||||
{
|
{
|
||||||
IBase wrapped = Wrap(o, mustRelease);
|
IBase wrapped = Wrap(o, mustRelease);
|
||||||
if (wrapped is Type)
|
if (wrapped is Type)
|
||||||
return (Type)wrapped;
|
return (Type)wrapped;
|
||||||
|
|
||||||
|
// TODO: release if required
|
||||||
if (wrapped != null)
|
if (wrapped != null)
|
||||||
wrapped.Dispose();
|
wrapped.Dispose();
|
||||||
return default(Type);
|
return default(Type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OlItemType OutlookItemType<ItemType>()
|
public static NSOutlook.OlItemType OutlookItemType<ItemType>()
|
||||||
where ItemType: IItem
|
where ItemType: IItem
|
||||||
{
|
{
|
||||||
Type type = typeof(ItemType);
|
Type type = typeof(ItemType);
|
||||||
if (type == typeof(IContactItem))
|
if (type == typeof(IContactItem))
|
||||||
return OlItemType.olContactItem;
|
return NSOutlook.OlItemType.olContactItem;
|
||||||
if (type == typeof(IDistributionList))
|
if (type == typeof(IDistributionList))
|
||||||
return OlItemType.olDistributionListItem;
|
return NSOutlook.OlItemType.olDistributionListItem;
|
||||||
throw new NotImplementedException(); // TODO
|
throw new NotImplementedException(); // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
public static OlUserPropertyType OutlookPropertyType<PropType>()
|
public static NSOutlook.OlUserPropertyType OutlookPropertyType<PropType>()
|
||||||
{
|
{
|
||||||
Type type = typeof(PropType);
|
Type type = typeof(PropType);
|
||||||
if (type == typeof(string))
|
if (type == typeof(string))
|
||||||
return OlUserPropertyType.olText;
|
return NSOutlook.OlUserPropertyType.olText;
|
||||||
if (type == typeof(DateTime))
|
if (type == typeof(DateTime))
|
||||||
return OlUserPropertyType.olDateTime;
|
return NSOutlook.OlUserPropertyType.olDateTime;
|
||||||
if (type == typeof(int))
|
if (type == typeof(int))
|
||||||
return OlUserPropertyType.olInteger;
|
return NSOutlook.OlUserPropertyType.olInteger;
|
||||||
if (type.IsEnum)
|
if (type.IsEnum)
|
||||||
return OlUserPropertyType.olInteger;
|
return NSOutlook.OlUserPropertyType.olInteger;
|
||||||
if (type == typeof(string[]))
|
if (type == typeof(string[]))
|
||||||
return OlUserPropertyType.olKeywords;
|
return NSOutlook.OlUserPropertyType.olKeywords;
|
||||||
throw new NotImplementedException(); // TODO
|
throw new NotImplementedException(); // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: this needs to go elsewhere
|
|
||||||
public static IFolder GetFolderFromID(string folderId)
|
|
||||||
{
|
|
||||||
NameSpace nmspace = ThisAddIn.Instance.Application.Session;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Folder f = (Folder)nmspace.GetFolderFromID(folderId);
|
|
||||||
return Wrap<IFolder>(f);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(nmspace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,32 +14,44 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
public class NoteItemWrapper : OutlookItemWrapper<NoteItem>, INoteItem
|
public class NoteItemWrapper : OutlookItemWrapper<NSOutlook.NoteItem>, INoteItem
|
||||||
{
|
{
|
||||||
internal NoteItemWrapper(NoteItem item)
|
internal NoteItemWrapper(NSOutlook.NoteItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
#region Wrapper methods
|
||||||
|
|
||||||
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
|
{
|
||||||
|
throw new NotSupportedException("NoteItem does not support user properties");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
{
|
{
|
||||||
return _item.PropertyAccessor;
|
return _item.PropertyAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() { return "Note: " + Subject; }
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Note:" + Subject;
|
||||||
|
}
|
||||||
|
|
||||||
#region Properties
|
#endregion
|
||||||
|
|
||||||
|
#region IItem implementation
|
||||||
|
|
||||||
public string Body
|
public string Body
|
||||||
{
|
{
|
||||||
@ -50,49 +62,81 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
public string Subject
|
public string Subject
|
||||||
{
|
{
|
||||||
get { return _item.Subject; }
|
get { return _item.Subject; }
|
||||||
set { throw new NotSupportedException(); }
|
set
|
||||||
|
{
|
||||||
|
throw new NotSupportedException("NoteItem does not support setting body");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStore Store { get { return StoreWrapper.Wrap(_item.Parent?.Store); } }
|
|
||||||
// TODO: release needed
|
|
||||||
public string StoreId { get { return _item.Parent?.Store?.StoreID; } }
|
|
||||||
public string StoreDisplayName { get { return _item.Parent?.Store?.DisplayName; } }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
|
||||||
// Note item doesn't have user properties
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
|
||||||
public void Save() { _item.Save(); }
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
public IFolder Parent
|
public IFolder Parent
|
||||||
{
|
{
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
public IStore Store
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreDisplayName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Delete() { _item.Delete(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
@ -20,8 +20,8 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
UserProperties userProperties = com.Add(GetUserProperties());
|
NSOutlook.UserProperties userProperties = com.Add(GetUserProperties());
|
||||||
UserProperty prop = com.Add(userProperties.Find(name, true));
|
NSOutlook.UserProperty prop = com.Add(userProperties.Find(name, true));
|
||||||
if (prop == null)
|
if (prop == null)
|
||||||
return default(Type);
|
return default(Type);
|
||||||
|
|
||||||
@ -35,8 +35,8 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
UserProperties userProperties = com.Add(GetUserProperties());
|
NSOutlook.UserProperties userProperties = com.Add(GetUserProperties());
|
||||||
UserProperty prop = com.Add(userProperties.Find(name, true));
|
NSOutlook.UserProperty prop = com.Add(userProperties.Find(name, true));
|
||||||
if (prop == null)
|
if (prop == null)
|
||||||
prop = userProperties.Add(name, Mapping.OutlookPropertyType<Type>());
|
prop = userProperties.Add(name, Mapping.OutlookPropertyType<Type>());
|
||||||
|
|
||||||
@ -52,6 +52,10 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract protected UserProperties GetUserProperties();
|
/// <summary>
|
||||||
|
/// Returns the UserProperties associated with the current item.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>An unwrapped UserProperties object. The caller is responsible for releasing this.</returns>
|
||||||
|
abstract protected NSOutlook.UserProperties GetUserProperties();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.Features.DebugSupport;
|
using Acacia.Features.DebugSupport;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -23,6 +22,7 @@ using Acacia.Utils;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
@ -70,9 +70,10 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
#region Properties implementation
|
#region Properties implementation
|
||||||
|
|
||||||
private PropertyAccessor _props;
|
// Assigned in Props, released in DoRelease
|
||||||
|
private NSOutlook.PropertyAccessor _props;
|
||||||
|
|
||||||
private PropertyAccessor Props
|
private NSOutlook.PropertyAccessor Props
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -88,7 +89,7 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
/// Returns the wrapped item's property accessor.
|
/// Returns the wrapped item's property accessor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The property accessor. The caller is responsible for disposing this.</returns>
|
/// <returns>The property accessor. The caller is responsible for disposing this.</returns>
|
||||||
abstract protected PropertyAccessor GetPropertyAccessor();
|
abstract protected NSOutlook.PropertyAccessor GetPropertyAccessor();
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -127,30 +128,6 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTime? AttrLastVerbExecutionTime
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Props.GetProperty(OutlookConstants.PR_LAST_VERB_EXECUTION_TIME) as DateTime?;
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Props.SetProperty(OutlookConstants.PR_LAST_VERB_EXECUTION_TIME, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int AttrLastVerbExecuted
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return Props.GetProperty(OutlookConstants.PR_LAST_VERB_EXECUTED);
|
|
||||||
}
|
|
||||||
set
|
|
||||||
{
|
|
||||||
Props.SetProperty(OutlookConstants.PR_LAST_VERB_EXECUTED, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public object GetProperty(string property)
|
public object GetProperty(string property)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -19,12 +19,12 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
class SearchWrapper<ItemType> : ISearch<ItemType>
|
class SearchWrapper<ItemType> : ComWrapper, ISearch<ItemType>
|
||||||
where ItemType : IItem
|
where ItemType : IItem
|
||||||
{
|
{
|
||||||
private interface SearchTerm
|
private interface SearchTerm
|
||||||
@ -151,13 +151,23 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly List<SearchTerm> terms = new List<SearchTerm>();
|
private readonly List<SearchTerm> terms = new List<SearchTerm>();
|
||||||
private readonly Items _items;
|
private NSOutlook.Items _items;
|
||||||
|
|
||||||
public SearchWrapper(Items items)
|
/// <summary>
|
||||||
|
/// Constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">The items to search. The new object takes ownership</param>
|
||||||
|
public SearchWrapper(NSOutlook.Items items)
|
||||||
{
|
{
|
||||||
this._items = items;
|
this._items = items;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void DoRelease()
|
||||||
|
{
|
||||||
|
ComRelease.Release(_items);
|
||||||
|
_items = null;
|
||||||
|
}
|
||||||
|
|
||||||
public ISearchOperator AddOperator(SearchOperator oper)
|
public ISearchOperator AddOperator(SearchOperator oper)
|
||||||
{
|
{
|
||||||
SearchOperatorImpl so = new SearchOperatorImpl(oper);
|
SearchOperatorImpl so = new SearchOperatorImpl(oper);
|
||||||
@ -176,11 +186,13 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
{
|
{
|
||||||
List<ItemType> values = new List<ItemType>();
|
List<ItemType> values = new List<ItemType>();
|
||||||
string filter = MakeFilter();
|
string filter = MakeFilter();
|
||||||
|
|
||||||
object value = _items.Find(filter);
|
object value = _items.Find(filter);
|
||||||
while(value != null)
|
while(value != null)
|
||||||
{
|
{
|
||||||
if (values.Count < maxResults)
|
if (values.Count < maxResults)
|
||||||
{
|
{
|
||||||
|
// Wrap and add if it returns an object. If not, WrapOrDefault will release it
|
||||||
ItemType wrapped = Mapping.WrapOrDefault<ItemType>(value);
|
ItemType wrapped = Mapping.WrapOrDefault<ItemType>(value);
|
||||||
if (wrapped != null)
|
if (wrapped != null)
|
||||||
{
|
{
|
||||||
@ -189,6 +201,7 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Release if not returned. Keep looping to release any others
|
||||||
ComRelease.Release(value);
|
ComRelease.Release(value);
|
||||||
}
|
}
|
||||||
value = _items.FindNext();
|
value = _items.FindNext();
|
||||||
@ -198,6 +211,7 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
public ItemType SearchOne()
|
public ItemType SearchOne()
|
||||||
{
|
{
|
||||||
|
// Wrap manages com object in value
|
||||||
object value = _items.Find(MakeFilter());
|
object value = _items.Find(MakeFilter());
|
||||||
if (value == null)
|
if (value == null)
|
||||||
return default(ItemType);
|
return default(ItemType);
|
||||||
|
@ -15,31 +15,44 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
public class StorageItemWrapper : OutlookItemWrapper<StorageItem>, IStorageItem
|
public class StorageItemWrapper : OutlookItemWrapper<NSOutlook.StorageItem>, IStorageItem
|
||||||
{
|
{
|
||||||
public StorageItemWrapper(StorageItem item)
|
public StorageItemWrapper(NSOutlook.StorageItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
#region Wrapper methods
|
||||||
|
|
||||||
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
|
{
|
||||||
|
return _item.UserProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
{
|
{
|
||||||
return _item.PropertyAccessor;
|
return _item.PropertyAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() { return "StorageItem"; }
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "StorageItem";
|
||||||
|
}
|
||||||
|
|
||||||
#region Properties
|
#endregion
|
||||||
|
|
||||||
|
#region IItem implementation
|
||||||
|
|
||||||
public string Body
|
public string Body
|
||||||
{
|
{
|
||||||
@ -53,45 +66,75 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
set { _item.Subject = value; }
|
set { _item.Subject = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStore Store { get { return StoreWrapper.Wrap(_item.Parent?.Store); } }
|
|
||||||
// TODO: release needed
|
|
||||||
public string StoreId { get { return _item.Parent?.Store?.StoreID; } }
|
|
||||||
public string StoreDisplayName { get { return _item.Parent?.Store?.DisplayName; } }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
|
||||||
return _item.UserProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
|
||||||
public void Save() { _item.Save(); }
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
public IFolder Parent
|
public IFolder Parent
|
||||||
{
|
{
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
public IStore Store
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreDisplayName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Delete() { _item.Delete(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,21 +19,21 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
public class StoreWrapper : ComWrapper, IStore
|
public class StoreWrapper : ComWrapper, IStore
|
||||||
{
|
{
|
||||||
public static IStore Wrap(Store store)
|
public static IStore Wrap(NSOutlook.Store store)
|
||||||
{
|
{
|
||||||
return store == null ? null : new StoreWrapper(store);
|
return store == null ? null : new StoreWrapper(store);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Store _store;
|
private NSOutlook.Store _store;
|
||||||
|
|
||||||
private StoreWrapper(Store store)
|
private StoreWrapper(NSOutlook.Store store)
|
||||||
{
|
{
|
||||||
this._store = store;
|
this._store = store;
|
||||||
}
|
}
|
||||||
@ -46,21 +46,20 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
|
|
||||||
public IFolder GetRootFolder()
|
public IFolder GetRootFolder()
|
||||||
{
|
{
|
||||||
return new FolderWrapper((Folder)_store.GetRootFolder());
|
// FolderWrapper manages the returned Folder
|
||||||
|
return new FolderWrapper((NSOutlook.Folder)_store.GetRootFolder());
|
||||||
}
|
}
|
||||||
|
|
||||||
public IItem GetItemFromID(string id)
|
public IItem GetItemFromID(string id)
|
||||||
{
|
{
|
||||||
NameSpace nmspace = _store.Session;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
{
|
||||||
{
|
NSOutlook.NameSpace nmspace = com.Add(_store.Session);
|
||||||
|
|
||||||
|
// Get the item; the wrapper manages it
|
||||||
object o = nmspace.GetItemFromID(id);
|
object o = nmspace.GetItemFromID(id);
|
||||||
return Mapping.Wrap<IItem>(o);
|
return Mapping.Wrap<IItem>(o);
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(nmspace);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string DisplayName { get { return _store.DisplayName; } }
|
public string DisplayName { get { return _store.DisplayName; } }
|
||||||
|
@ -15,31 +15,44 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
|
|
||||||
namespace Acacia.Stubs.OutlookWrappers
|
namespace Acacia.Stubs.OutlookWrappers
|
||||||
{
|
{
|
||||||
public class TaskItemWrapper : OutlookItemWrapper<TaskItem>, ITaskItem
|
public class TaskItemWrapper : OutlookItemWrapper<NSOutlook.TaskItem>, ITaskItem
|
||||||
{
|
{
|
||||||
internal TaskItemWrapper(TaskItem item)
|
internal TaskItemWrapper(NSOutlook.TaskItem item)
|
||||||
:
|
:
|
||||||
base(item)
|
base(item)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override PropertyAccessor GetPropertyAccessor()
|
#region Wrapper methods
|
||||||
|
|
||||||
|
protected override NSOutlook.UserProperties GetUserProperties()
|
||||||
|
{
|
||||||
|
return _item.UserProperties;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override NSOutlook.PropertyAccessor GetPropertyAccessor()
|
||||||
{
|
{
|
||||||
return _item.PropertyAccessor;
|
return _item.PropertyAccessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString() { return "Task: " + Subject; }
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Task:" + Subject;
|
||||||
|
}
|
||||||
|
|
||||||
#region Properties
|
#endregion
|
||||||
|
|
||||||
|
#region IItem implementation
|
||||||
|
|
||||||
public string Body
|
public string Body
|
||||||
{
|
{
|
||||||
@ -50,48 +63,78 @@ namespace Acacia.Stubs.OutlookWrappers
|
|||||||
public string Subject
|
public string Subject
|
||||||
{
|
{
|
||||||
get { return _item.Subject; }
|
get { return _item.Subject; }
|
||||||
set { throw new NotSupportedException(); }
|
set { _item.Subject = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IStore Store { get { return StoreWrapper.Wrap(_item.Parent?.Store); } }
|
|
||||||
// TODO: release needed
|
|
||||||
public string StoreId { get { return _item.Parent?.Store?.StoreID; } }
|
|
||||||
public string StoreDisplayName { get { return _item.Parent?.Store?.DisplayName; } }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
protected override UserProperties GetUserProperties()
|
|
||||||
{
|
|
||||||
return _item.UserProperties;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Delete() { _item.Delete(); }
|
|
||||||
public void Save() { _item.Save(); }
|
public void Save() { _item.Save(); }
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region IBase implementation
|
||||||
|
|
||||||
|
public string EntryId { get { return _item.EntryID; } }
|
||||||
|
|
||||||
public IFolder Parent
|
public IFolder Parent
|
||||||
{
|
{
|
||||||
get { return (IFolder)Mapping.Wrap(_item.Parent as Folder); }
|
get
|
||||||
|
{
|
||||||
|
// The wrapper manages the returned folder
|
||||||
|
return Mapping.Wrap<IFolder>(_item.Parent as NSOutlook.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string ParentEntryId
|
public string ParentEntryId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
Folder parent = _item.Parent;
|
using (ComRelease com = new ComRelease())
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
return parent?.EntryID;
|
return parent?.EntryID;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(parent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string EntryId { get { return _item.EntryID; } }
|
public IStore Store
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
return StoreWrapper.Wrap(parent?.Store);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string StoreDisplayName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
using (ComRelease com = new ComRelease())
|
||||||
|
{
|
||||||
|
NSOutlook.Folder parent = com.Add(_item.Parent);
|
||||||
|
NSOutlook.Store store = com.Add(parent?.Store);
|
||||||
|
return store.StoreID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Delete() { _item.Delete(); }
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,6 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
using Outlook = Microsoft.Office.Interop.Outlook;
|
|
||||||
using Office = Microsoft.Office.Core;
|
|
||||||
using Acacia.Features;
|
using Acacia.Features;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@ -33,27 +31,22 @@ using System.Diagnostics;
|
|||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Acacia.Native;
|
using Acacia.Native;
|
||||||
|
using Acacia.Stubs;
|
||||||
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
|
|
||||||
namespace Acacia
|
namespace Acacia
|
||||||
{
|
{
|
||||||
public partial class ThisAddIn
|
public partial class ThisAddIn
|
||||||
{
|
{
|
||||||
|
public static IAddIn Instance
|
||||||
public static ThisAddIn Instance
|
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove?
|
||||||
private Control _dispatcher;
|
private Control _dispatcher;
|
||||||
|
|
||||||
public void InvokeUI(Action action)
|
|
||||||
{
|
|
||||||
// [ZP-992] For some reason using the dispatcher causes a deadlock
|
|
||||||
// since switching to UI-chunked tasks. Running directly works.
|
|
||||||
action();
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Features
|
#region Features
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -73,17 +66,6 @@ namespace Acacia
|
|||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FeatureType GetFeature<FeatureType>()
|
|
||||||
where FeatureType : Feature
|
|
||||||
{
|
|
||||||
foreach(Feature feature in Features)
|
|
||||||
{
|
|
||||||
if (feature is FeatureType)
|
|
||||||
return (FeatureType)feature;
|
|
||||||
}
|
|
||||||
return default(FeatureType);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Startup / Shutdown
|
#region Startup / Shutdown
|
||||||
|
|
||||||
private void ThisAddIn_Startup(object sender, System.EventArgs args)
|
private void ThisAddIn_Startup(object sender, System.EventArgs args)
|
||||||
@ -104,10 +86,10 @@ namespace Acacia
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = this;
|
Instance = new AddInWrapper(this);
|
||||||
|
|
||||||
// Set the culture info from Outlook's language setting rather than the OS setting
|
// Set the culture info from Outlook's language setting rather than the OS setting
|
||||||
int lcid = Application.LanguageSettings.get_LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI);
|
int lcid = Application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI);
|
||||||
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lcid);
|
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lcid);
|
||||||
|
|
||||||
// Create a dispatcher
|
// Create a dispatcher
|
||||||
@ -122,7 +104,7 @@ namespace Acacia
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the watcher
|
// Create the watcher
|
||||||
Watcher = new ZPushWatcher(Application);
|
Watcher = new ZPushWatcher(Instance);
|
||||||
OutlookUI.Watcher = Watcher;
|
OutlookUI.Watcher = Watcher;
|
||||||
|
|
||||||
// Allow to features to register whatever they need
|
// Allow to features to register whatever they need
|
||||||
@ -176,6 +158,7 @@ namespace Acacia
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// TODO: is any management of Pages needed here?
|
||||||
Pages.Add(new SettingsPage(Features.ToArray()), Properties.Resources.ThisAddIn_Title);
|
Pages.Add(new SettingsPage(Features.ToArray()), Properties.Resources.ThisAddIn_Title);
|
||||||
}
|
}
|
||||||
catch(System.Exception e)
|
catch(System.Exception e)
|
||||||
@ -192,35 +175,6 @@ namespace Acacia
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Misc helpers
|
|
||||||
|
|
||||||
public void SendReceive()
|
|
||||||
{
|
|
||||||
Outlook.NameSpace session = Application.Session;
|
|
||||||
session.SendAndReceive(false);
|
|
||||||
ComRelease.Release(session);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Restart()
|
|
||||||
{
|
|
||||||
// Can not use the assembly location, as that is in the GAC
|
|
||||||
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
|
|
||||||
UriBuilder uri = new UriBuilder(codeBase);
|
|
||||||
string path = Uri.UnescapeDataString(uri.Path);
|
|
||||||
// Create the path to the restarter
|
|
||||||
path = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(path), "OutlookRestarter.exe");
|
|
||||||
|
|
||||||
// Run that
|
|
||||||
Process process = new Process();
|
|
||||||
process.StartInfo = new ProcessStartInfo(path, Environment.CommandLine);
|
|
||||||
process.Start();
|
|
||||||
|
|
||||||
// And close us
|
|
||||||
Application.Quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Ribbons
|
#region Ribbons
|
||||||
|
|
||||||
private OutlookUI _outlookUI;
|
private OutlookUI _outlookUI;
|
||||||
@ -245,41 +199,6 @@ namespace Acacia
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Window handle
|
|
||||||
|
|
||||||
private class WindowHandle : IWin32Window
|
|
||||||
{
|
|
||||||
private IntPtr hWnd;
|
|
||||||
|
|
||||||
public WindowHandle(IntPtr hWnd)
|
|
||||||
{
|
|
||||||
this.hWnd = hWnd;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IntPtr Handle
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return hWnd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IWin32Window Window
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
var win = Application.ActiveWindow() as IOleWindow;
|
|
||||||
if (win == null)
|
|
||||||
return null;
|
|
||||||
IntPtr hWnd;
|
|
||||||
win.GetWindow(out hWnd);
|
|
||||||
return new WindowHandle(hWnd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
|
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
|
||||||
{
|
{
|
||||||
return OutlookUI;
|
return OutlookUI;
|
||||||
|
@ -224,23 +224,25 @@ namespace Acacia.UI
|
|||||||
public List<GABUser> Lookup(string text, int max)
|
public List<GABUser> Lookup(string text, int max)
|
||||||
{
|
{
|
||||||
// Begin GAB lookup, search on full name or username
|
// Begin GAB lookup, search on full name or username
|
||||||
ISearch<IContactItem> search = _gab.Contacts.Search<IContactItem>();
|
using (ISearch<IContactItem> search = _gab.Contacts.Search<IContactItem>())
|
||||||
ISearchOperator oper = search.AddOperator(SearchOperator.Or);
|
|
||||||
oper.AddField("urn:schemas:contacts:cn").SetOperation(SearchOperation.Like, text + "%");
|
|
||||||
oper.AddField("urn:schemas:contacts:customerid").SetOperation(SearchOperation.Like, text + "%");
|
|
||||||
|
|
||||||
// Fetch the results up to the limit.
|
|
||||||
// TODO: make limit a property
|
|
||||||
List<GABUser> users = new List<GABUser>();
|
|
||||||
foreach (IContactItem result in search.Search(max))
|
|
||||||
{
|
{
|
||||||
using (result)
|
ISearchOperator oper = search.AddOperator(SearchOperator.Or);
|
||||||
{
|
oper.AddField("urn:schemas:contacts:cn").SetOperation(SearchOperation.Like, text + "%");
|
||||||
users.Add(new GABUser(result.FullName, result.CustomerID));
|
oper.AddField("urn:schemas:contacts:customerid").SetOperation(SearchOperation.Like, text + "%");
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return users;
|
// Fetch the results up to the limit.
|
||||||
|
// TODO: make limit a property
|
||||||
|
List<GABUser> users = new List<GABUser>();
|
||||||
|
foreach (IContactItem result in search.Search(max))
|
||||||
|
{
|
||||||
|
using (result)
|
||||||
|
{
|
||||||
|
users.Add(new GABUser(result.FullName, result.CustomerID));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return users;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GABUser LookupExact(string username)
|
public GABUser LookupExact(string username)
|
||||||
|
@ -128,7 +128,8 @@ namespace Acacia.UI.Outlook
|
|||||||
Images.ColorDepth = ColorDepth.Depth32Bit;
|
Images.ColorDepth = ColorDepth.Depth32Bit;
|
||||||
Images.ImageSize = new Size(16, 16);
|
Images.ImageSize = new Size(16, 16);
|
||||||
|
|
||||||
CommandBars cmdBars = ThisAddIn.Instance.Application.ActiveWindow().CommandBars;
|
// TODO: memory management
|
||||||
|
CommandBars cmdBars = ThisAddIn.Instance.RawApp.ActiveWindow().CommandBars;
|
||||||
foreach (string id in icons)
|
foreach (string id in icons)
|
||||||
{
|
{
|
||||||
IPictureDisp pict = cmdBars.GetImageMso(id, Images.ImageSize.Width, Images.ImageSize.Height);
|
IPictureDisp pict = cmdBars.GetImageMso(id, Images.ImageSize.Width, Images.ImageSize.Height);
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
@ -23,7 +23,6 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
|
|
||||||
namespace Acacia.UI
|
namespace Acacia.UI
|
||||||
{
|
{
|
||||||
@ -48,19 +47,20 @@ namespace Acacia.UI
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return ThisAddIn.Instance.Application;
|
return null;
|
||||||
|
// TODO return ThisAddIn.Instance.Application;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public OlObjectClass Class
|
public Microsoft.Office.Interop.Outlook.OlObjectClass Class
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return OlObjectClass.olApplication;
|
return Microsoft.Office.Interop.Outlook.OlObjectClass.olApplication;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public NameSpace Session
|
public Microsoft.Office.Interop.Outlook.NameSpace Session
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -68,7 +68,7 @@ namespace Acacia.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dynamic PropertyPageSite.Parent
|
dynamic Microsoft.Office.Interop.Outlook.PropertyPageSite.Parent
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -25,11 +25,12 @@ using System.Threading.Tasks;
|
|||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using Acacia.Features;
|
using Acacia.Features;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.UI
|
namespace Acacia.UI
|
||||||
{
|
{
|
||||||
[ComVisible(true)]
|
[ComVisible(true)]
|
||||||
public partial class SettingsPage : UserControl, Microsoft.Office.Interop.Outlook.PropertyPage
|
public partial class SettingsPage : UserControl, NSOutlook.PropertyPage
|
||||||
{
|
{
|
||||||
private readonly Dictionary<FeatureSettings, bool> _featuresDirty = new Dictionary<FeatureSettings, bool>();
|
private readonly Dictionary<FeatureSettings, bool> _featuresDirty = new Dictionary<FeatureSettings, bool>();
|
||||||
|
|
||||||
@ -78,8 +79,8 @@ namespace Acacia.UI
|
|||||||
Dirty = _featuresDirty.Values.Aggregate((a, b) => a | b);
|
Dirty = _featuresDirty.Values.Aggregate((a, b) => a | b);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Microsoft.Office.Interop.Outlook.PropertyPageSite _propertyPageSite;
|
private NSOutlook.PropertyPageSite _propertyPageSite;
|
||||||
public Microsoft.Office.Interop.Outlook.PropertyPageSite PropertyPageSite
|
public NSOutlook.PropertyPageSite PropertyPageSite
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
@ -96,7 +97,8 @@ namespace Acacia.UI
|
|||||||
System.Reflection.MethodInfo methodInfo = oleObjectType.GetMethod("GetClientSite");
|
System.Reflection.MethodInfo methodInfo = oleObjectType.GetMethod("GetClientSite");
|
||||||
Object propertyPageSite = methodInfo.Invoke(this, null);
|
Object propertyPageSite = methodInfo.Invoke(this, null);
|
||||||
|
|
||||||
_propertyPageSite = (Microsoft.Office.Interop.Outlook.PropertyPageSite)propertyPageSite;
|
// TODO: does this need to be released?
|
||||||
|
_propertyPageSite = (NSOutlook.PropertyPageSite)propertyPageSite;
|
||||||
}
|
}
|
||||||
return _propertyPageSite;
|
return _propertyPageSite;
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,12 @@ namespace Acacia.Utils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void Release(params object[] objs)
|
||||||
|
{
|
||||||
|
foreach (object o in objs)
|
||||||
|
Release(o);
|
||||||
|
}
|
||||||
|
|
||||||
public static void Release(object o)
|
public static void Release(object o)
|
||||||
{
|
{
|
||||||
if (!Enabled)
|
if (!Enabled)
|
||||||
@ -67,7 +73,7 @@ namespace Acacia.Utils
|
|||||||
Logger.Instance.TraceExtra(typeof(ComRelease), "Releasing object: {0:X} @ {1}", GetObjAddress(o),
|
Logger.Instance.TraceExtra(typeof(ComRelease), "Releasing object: {0:X} @ {1}", GetObjAddress(o),
|
||||||
new System.Diagnostics.StackTrace());
|
new System.Diagnostics.StackTrace());
|
||||||
}
|
}
|
||||||
Marshal.FinalReleaseComObject(o);
|
Marshal.ReleaseComObject(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static long GetObjAddress(object o)
|
private static long GetObjAddress(object o)
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -22,6 +21,7 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Stubs.OutlookWrappers;
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.Utils
|
namespace Acacia.Utils
|
||||||
{
|
{
|
||||||
@ -47,8 +47,10 @@ namespace Acacia.Utils
|
|||||||
public event MailResponseEventHandler Respond;
|
public event MailResponseEventHandler Respond;
|
||||||
|
|
||||||
public event MailResponseEventHandler Reply;
|
public event MailResponseEventHandler Reply;
|
||||||
private void OnReply(MailItem mail, MailItem response)
|
private void OnReply(NSOutlook.MailItem mail, NSOutlook.MailItem response)
|
||||||
{
|
{
|
||||||
|
// TODO: check release of first item
|
||||||
|
// TODO: release if not sending event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if ((Reply != null || Respond != null) && mail != null)
|
if ((Reply != null || Respond != null) && mail != null)
|
||||||
@ -70,8 +72,10 @@ namespace Acacia.Utils
|
|||||||
}
|
}
|
||||||
|
|
||||||
public event MailResponseEventHandler ReplyAll;
|
public event MailResponseEventHandler ReplyAll;
|
||||||
private void OnReplyAll(MailItem mail, MailItem response)
|
private void OnReplyAll(NSOutlook.MailItem mail, NSOutlook.MailItem response)
|
||||||
{
|
{
|
||||||
|
// TODO: check release of first item
|
||||||
|
// TODO: release if not sending event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if ((ReplyAll != null || Respond != null) && mail != null)
|
if ((ReplyAll != null || Respond != null) && mail != null)
|
||||||
@ -93,8 +97,10 @@ namespace Acacia.Utils
|
|||||||
}
|
}
|
||||||
|
|
||||||
public event MailResponseEventHandler Forward;
|
public event MailResponseEventHandler Forward;
|
||||||
private void OnForward(MailItem mail, MailItem response)
|
private void OnForward(NSOutlook.MailItem mail, NSOutlook.MailItem response)
|
||||||
{
|
{
|
||||||
|
// TODO: check release of first item
|
||||||
|
// TODO: release if not sending event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if ((Forward != null || Respond != null) && mail != null)
|
if ((Forward != null || Respond != null) && mail != null)
|
||||||
@ -116,8 +122,10 @@ namespace Acacia.Utils
|
|||||||
}
|
}
|
||||||
|
|
||||||
public event MailEventHandler Read;
|
public event MailEventHandler Read;
|
||||||
private void OnRead(MailItem mail)
|
private void OnRead(NSOutlook.MailItem mail)
|
||||||
{
|
{
|
||||||
|
// TODO: check release of first item
|
||||||
|
// TODO: release if not sending event
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (Read != null && mail != null)
|
if (Read != null && mail != null)
|
||||||
@ -180,6 +188,7 @@ namespace Acacia.Utils
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
// TODO: release item if event not sent
|
||||||
if (ItemSend != null && item != null)
|
if (ItemSend != null && item != null)
|
||||||
{
|
{
|
||||||
using (IMailItem wrapped = Mapping.WrapOrDefault<IMailItem>(item, false))
|
using (IMailItem wrapped = Mapping.WrapOrDefault<IMailItem>(item, false))
|
||||||
@ -199,93 +208,104 @@ namespace Acacia.Utils
|
|||||||
|
|
||||||
#region Implementation
|
#region Implementation
|
||||||
|
|
||||||
public MailEvents(Application app)
|
public MailEvents(IAddIn app)
|
||||||
{
|
{
|
||||||
app.ItemLoad += OnItemLoad;
|
app.ItemLoad += OnItemLoad;
|
||||||
app.ItemSend += OnItemSend;
|
app.ItemSend += OnItemSend;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnItemLoad(object item)
|
private void OnItemLoad(object item)
|
||||||
{
|
{
|
||||||
ItemEvents_10_Event hasEvents = item as ItemEvents_10_Event;
|
NSOutlook.ItemEvents_10_Event hasEvents = item as NSOutlook.ItemEvents_10_Event;
|
||||||
if (hasEvents != null)
|
if (hasEvents != null)
|
||||||
{
|
{
|
||||||
new MailEventHooker(hasEvents, this);
|
new MailEventHooker(hasEvents, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class MailEventHooker
|
private class MailEventHooker : ComWrapper
|
||||||
{
|
{
|
||||||
private readonly ItemEvents_10_Event item;
|
private NSOutlook.ItemEvents_10_Event _item;
|
||||||
private readonly MailEvents events;
|
private readonly MailEvents _events;
|
||||||
|
private int _id;
|
||||||
|
private static int nextId;
|
||||||
|
|
||||||
public MailEventHooker(ItemEvents_10_Event item, MailEvents events)
|
public MailEventHooker(NSOutlook.ItemEvents_10_Event item, MailEvents events)
|
||||||
{
|
{
|
||||||
this.item = item;
|
this._id = ++nextId;
|
||||||
this.events = events;
|
this._item = item;
|
||||||
|
this._events = events;
|
||||||
HookEvents(true);
|
HookEvents(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void DoRelease()
|
||||||
|
{
|
||||||
|
Logger.Instance.Debug(this, "DoRelease: {0}", _id);
|
||||||
|
ComRelease.Release(_item);
|
||||||
|
_item = null;
|
||||||
|
}
|
||||||
|
|
||||||
private void HookEvents(bool add)
|
private void HookEvents(bool add)
|
||||||
{
|
{
|
||||||
ItemEvents_10_Event events = this.item;
|
|
||||||
|
|
||||||
if (add)
|
if (add)
|
||||||
{
|
{
|
||||||
events.BeforeDelete += HandleBeforeDelete;
|
_item.BeforeDelete += HandleBeforeDelete;
|
||||||
events.Forward += HandleForward;
|
_item.Forward += HandleForward;
|
||||||
events.Read += HandleRead;
|
_item.Read += HandleRead;
|
||||||
events.Reply += HandleReply;
|
_item.Reply += HandleReply;
|
||||||
events.ReplyAll += HandleReplyAll;
|
_item.ReplyAll += HandleReplyAll;
|
||||||
events.Unload += HandleUnload;
|
_item.Unload += HandleUnload;
|
||||||
events.Write += HandleWrite;
|
_item.Write += HandleWrite;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
events.BeforeDelete -= HandleBeforeDelete;
|
_item.BeforeDelete -= HandleBeforeDelete;
|
||||||
events.Forward -= HandleForward;
|
_item.Forward -= HandleForward;
|
||||||
events.Read -= HandleRead;
|
_item.Read -= HandleRead;
|
||||||
events.Reply -= HandleReply;
|
_item.Reply -= HandleReply;
|
||||||
events.ReplyAll -= HandleReplyAll;
|
_item.ReplyAll -= HandleReplyAll;
|
||||||
events.Unload -= HandleUnload;
|
_item.Unload -= HandleUnload;
|
||||||
events.Write -= HandleWrite;
|
_item.Write -= HandleWrite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleBeforeDelete(object item, ref bool cancel)
|
private void HandleBeforeDelete(object item, ref bool cancel)
|
||||||
{
|
{
|
||||||
events.OnBeforeDelete(item, ref cancel);
|
_events.OnBeforeDelete(item, ref cancel);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleForward(object response, ref bool cancel)
|
private void HandleForward(object response, ref bool cancel)
|
||||||
{
|
{
|
||||||
events.OnForward(item as MailItem, response as MailItem);
|
_events.OnForward(_item as NSOutlook.MailItem, response as NSOutlook.MailItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleRead()
|
private void HandleRead()
|
||||||
{
|
{
|
||||||
events.OnRead(item as MailItem);
|
_events.OnRead(_item as NSOutlook.MailItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleReply(object response, ref bool cancel)
|
private void HandleReply(object response, ref bool cancel)
|
||||||
{
|
{
|
||||||
events.OnReply(item as MailItem, response as MailItem);
|
_events.OnReply(_item as NSOutlook.MailItem, response as NSOutlook.MailItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleReplyAll(object response, ref bool cancel)
|
private void HandleReplyAll(object response, ref bool cancel)
|
||||||
{
|
{
|
||||||
events.OnReplyAll(item as MailItem, response as MailItem);
|
_events.OnReplyAll(_item as NSOutlook.MailItem, response as NSOutlook.MailItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleUnload()
|
private void HandleUnload()
|
||||||
{
|
{
|
||||||
|
Logger.Instance.Debug(this, "HandleUnload: {0}", _id);
|
||||||
// All events must be unhooked on unload, otherwise a resource leak is created.
|
// All events must be unhooked on unload, otherwise a resource leak is created.
|
||||||
HookEvents(false);
|
HookEvents(false);
|
||||||
|
Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HandleWrite(ref bool cancel)
|
private void HandleWrite(ref bool cancel)
|
||||||
{
|
{
|
||||||
events.OnWrite(item, ref cancel);
|
Logger.Instance.Debug(this, "HandleWrite: {0}", _id);
|
||||||
|
_events.OnWrite(_item, ref cancel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ namespace Acacia.Utils
|
|||||||
public static RegistryKey OpenOutlookKey(string suffix = null, RegistryKeyPermissionCheck permissions = RegistryKeyPermissionCheck.Default)
|
public static RegistryKey OpenOutlookKey(string suffix = null, RegistryKeyPermissionCheck permissions = RegistryKeyPermissionCheck.Default)
|
||||||
{
|
{
|
||||||
// Determine the base path
|
// Determine the base path
|
||||||
string[] versionParts = ThisAddIn.Instance.Application.Version.Split('.');
|
string[] versionParts = ThisAddIn.Instance.Version.Split('.');
|
||||||
string versionString = versionParts[0] + "." + versionParts[1];
|
string versionString = versionParts[0] + "." + versionParts[1];
|
||||||
string baseKeyPath = string.Format(OutlookConstants.REG_KEY_BASE, versionString);
|
string baseKeyPath = string.Format(OutlookConstants.REG_KEY_BASE, versionString);
|
||||||
return RegistryUtil.OpenKeyImpl(baseKeyPath, suffix, false, permissions);
|
return RegistryUtil.OpenKeyImpl(baseKeyPath, suffix, false, permissions);
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Acacia.ZPush;
|
using Acacia.ZPush;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@ -44,5 +44,40 @@ namespace Acacia.Utils
|
|||||||
|
|
||||||
return a.Equals(b);
|
return a.Equals(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<T> RawEnum<T>(this IEnumerable<T> source, bool releaseItems = true)
|
||||||
|
{
|
||||||
|
foreach (T item in source)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
yield return item;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (releaseItems)
|
||||||
|
ComRelease.Release(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ComRelease.Release(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: check this
|
||||||
|
public static IEnumerable RawEnum(this IEnumerable source, bool releaseItems = true)
|
||||||
|
{
|
||||||
|
foreach (object item in source)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
yield return item;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (releaseItems)
|
||||||
|
ComRelease.Release(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ComRelease.Release(source);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
using Acacia.Features;
|
using Acacia.Features;
|
||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush.Connect;
|
using Acacia.ZPush.Connect;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
@ -28,6 +27,7 @@ using System.Security;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.ZPush
|
namespace Acacia.ZPush
|
||||||
{
|
{
|
||||||
@ -37,14 +37,16 @@ namespace Acacia.ZPush
|
|||||||
#region Miscellaneous
|
#region Miscellaneous
|
||||||
|
|
||||||
private readonly string _regPath;
|
private readonly string _regPath;
|
||||||
private readonly Store _store;
|
|
||||||
|
// TODO: this should probably be wrapped. Make ZPushAccount ComWrapper?
|
||||||
|
private readonly NSOutlook.Store _store;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Constructor.
|
/// Constructor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="regPath">They registry key containing the account settings.</param>
|
/// <param name="regPath">They registry key containing the account settings.</param>
|
||||||
/// <param name="store">The store this account represents.</param>
|
/// <param name="store">The store this account represents.</param>
|
||||||
internal ZPushAccount(string regPath, Store store)
|
internal ZPushAccount(string regPath, NSOutlook.Store store)
|
||||||
{
|
{
|
||||||
this._regPath = regPath;
|
this._regPath = regPath;
|
||||||
this._store = store;
|
this._store = store;
|
||||||
@ -72,7 +74,8 @@ namespace Acacia.ZPush
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public void SendReceive()
|
public void SendReceive()
|
||||||
{
|
{
|
||||||
ThisAddIn.Instance.SendReceive();
|
// TODO: ThisAddIn.Instance.SendReceive();
|
||||||
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@ -80,7 +83,8 @@ namespace Acacia.ZPush
|
|||||||
#region Properties
|
#region Properties
|
||||||
|
|
||||||
[Browsable(false)]
|
[Browsable(false)]
|
||||||
public Store Store
|
// TODO: remove this
|
||||||
|
public NSOutlook.Store Store
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
|
@ -16,13 +16,13 @@
|
|||||||
|
|
||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.ZPush
|
namespace Acacia.ZPush
|
||||||
{
|
{
|
||||||
@ -33,9 +33,10 @@ namespace Acacia.ZPush
|
|||||||
public class ZPushAccounts
|
public class ZPushAccounts
|
||||||
{
|
{
|
||||||
private readonly ZPushWatcher _watcher;
|
private readonly ZPushWatcher _watcher;
|
||||||
private readonly Application _app;
|
// TODO: wrap these
|
||||||
private readonly NameSpace _session;
|
private readonly NSOutlook.Application _app;
|
||||||
private readonly Stores _stores;
|
private readonly NSOutlook.NameSpace _session;
|
||||||
|
private readonly NSOutlook.Stores _stores;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ZPushAccounts indexed by SMTPAddress. Null values are not allowed.
|
/// ZPushAccounts indexed by SMTPAddress. Null values are not allowed.
|
||||||
@ -48,7 +49,7 @@ namespace Acacia.ZPush
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly Dictionary<string, ZPushAccount> _accountsByStoreId = new Dictionary<string, ZPushAccount>();
|
private readonly Dictionary<string, ZPushAccount> _accountsByStoreId = new Dictionary<string, ZPushAccount>();
|
||||||
|
|
||||||
public ZPushAccounts(ZPushWatcher watcher, Application app)
|
public ZPushAccounts(ZPushWatcher watcher, NSOutlook.Application app)
|
||||||
{
|
{
|
||||||
this._watcher = watcher;
|
this._watcher = watcher;
|
||||||
this._app = app;
|
this._app = app;
|
||||||
@ -66,7 +67,7 @@ namespace Acacia.ZPush
|
|||||||
{
|
{
|
||||||
// Process existing accounts
|
// Process existing accounts
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
foreach (Account account in com.Add(_session.Accounts))
|
foreach (NSOutlook.Account account in com.Add(_session.Accounts))
|
||||||
{
|
{
|
||||||
Tasks.Task(null, "AccountCheck", () =>
|
Tasks.Task(null, "AccountCheck", () =>
|
||||||
{
|
{
|
||||||
@ -113,7 +114,7 @@ namespace Acacia.ZPush
|
|||||||
{
|
{
|
||||||
// Collect all the store ids
|
// Collect all the store ids
|
||||||
HashSet<string> stores = new HashSet<string>();
|
HashSet<string> stores = new HashSet<string>();
|
||||||
foreach (Store store in _stores)
|
foreach (NSOutlook.Store store in _stores)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -184,22 +185,18 @@ namespace Acacia.ZPush
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZPushAccount GetAccount(MAPIFolder folder)
|
public ZPushAccount GetAccount(NSOutlook.MAPIFolder folder)
|
||||||
{
|
{
|
||||||
ZPushAccount zpush = null;
|
using (ComRelease com = new ComRelease())
|
||||||
Store store = folder.Store;
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
|
ZPushAccount zpush = null;
|
||||||
|
NSOutlook.Store store = com.Add(folder.Store);
|
||||||
string storeId = store?.StoreID;
|
string storeId = store?.StoreID;
|
||||||
if (storeId == null)
|
if (storeId == null)
|
||||||
return null;
|
return null;
|
||||||
_accountsByStoreId.TryGetValue(storeId, out zpush);
|
_accountsByStoreId.TryGetValue(storeId, out zpush);
|
||||||
return zpush;
|
return zpush;
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
{
|
|
||||||
ComRelease.Release(store);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZPushAccount GetAccount(string smtpAddress)
|
public ZPushAccount GetAccount(string smtpAddress)
|
||||||
@ -214,12 +211,12 @@ namespace Acacia.ZPush
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="account">The account. This function will release the handle</param>
|
/// <param name="account">The account. This function will release the handle</param>
|
||||||
/// <returns>The ZPushAccount, or null if not a ZPush account.</returns>
|
/// <returns>The ZPushAccount, or null if not a ZPush account.</returns>
|
||||||
private ZPushAccount GetAccount(Account account)
|
private ZPushAccount GetAccount(NSOutlook.Account account)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Only EAS accounts can be zpush accounts
|
// Only EAS accounts can be zpush accounts
|
||||||
if (account.AccountType != OlAccountType.olEas)
|
if (account.AccountType != NSOutlook.OlAccountType.olEas)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// Check for a cached value
|
// Check for a cached value
|
||||||
@ -239,14 +236,14 @@ namespace Acacia.ZPush
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event handler for Stores.StoreAdded event.
|
/// Event handler for Stores.StoreAdded event.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal void StoreAdded(Store s)
|
private void StoreAdded(NSOutlook.Store s)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
Logger.Instance.Trace(this, "StoreAdded: {0}", s.StoreID);
|
Logger.Instance.Trace(this, "StoreAdded: {0}", s.StoreID);
|
||||||
foreach (Store store in com.Add(com.Add(_app.Session).Stores))
|
foreach (NSOutlook.Store store in com.Add(com.Add(_app.Session).Stores))
|
||||||
{
|
{
|
||||||
if (!_accountsByStoreId.ContainsKey(store.StoreID))
|
if (!_accountsByStoreId.ContainsKey(store.StoreID))
|
||||||
{
|
{
|
||||||
@ -287,11 +284,12 @@ namespace Acacia.ZPush
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates the ZPushAccount for the account, from the registry values.
|
/// Creates the ZPushAccount for the account, from the registry values.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="account">The account.</param>
|
/// <param name="account">The account. The caller is responsible for releasing this.</param>
|
||||||
/// <returns>The associated ZPushAccount</returns>
|
/// <returns>The associated ZPushAccount</returns>
|
||||||
/// <exception cref="Exception">If the registry key cannot be found</exception>
|
/// <exception cref="Exception">If the registry key cannot be found</exception>
|
||||||
private ZPushAccount CreateFromRegistry(Account account)
|
private ZPushAccount CreateFromRegistry(NSOutlook.Account account)
|
||||||
{
|
{
|
||||||
|
// TODO: check that caller releases account everywhere
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
using (RegistryKey baseKey = FindRegistryKey(account))
|
using (RegistryKey baseKey = FindRegistryKey(account))
|
||||||
{
|
{
|
||||||
@ -302,7 +300,7 @@ namespace Acacia.ZPush
|
|||||||
string storeId = ZPushAccount.GetStoreId(baseKey.Name);
|
string storeId = ZPushAccount.GetStoreId(baseKey.Name);
|
||||||
|
|
||||||
// Find the store
|
// Find the store
|
||||||
Store store = _app.Session.GetStoreFromID(storeId);
|
NSOutlook.Store store = _app.Session.GetStoreFromID(storeId);
|
||||||
|
|
||||||
// Done, create and register
|
// Done, create and register
|
||||||
ZPushAccount zpush = new ZPushAccount(baseKey.Name, store);
|
ZPushAccount zpush = new ZPushAccount(baseKey.Name, store);
|
||||||
@ -316,7 +314,7 @@ namespace Acacia.ZPush
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="store">The store</param>
|
/// <param name="store">The store</param>
|
||||||
/// <returns>The ZPushAccount, or null if no account is associated with the store</returns>
|
/// <returns>The ZPushAccount, or null if no account is associated with the store</returns>
|
||||||
private ZPushAccount TryCreateFromRegistry(Store store)
|
private ZPushAccount TryCreateFromRegistry(NSOutlook.Store store)
|
||||||
{
|
{
|
||||||
using (RegistryKey baseKey = FindRegistryKey(store))
|
using (RegistryKey baseKey = FindRegistryKey(store))
|
||||||
{
|
{
|
||||||
@ -330,7 +328,7 @@ namespace Acacia.ZPush
|
|||||||
|
|
||||||
private RegistryKey OpenBaseKey()
|
private RegistryKey OpenBaseKey()
|
||||||
{
|
{
|
||||||
NameSpace session = _app.Session;
|
NSOutlook.NameSpace session = _app.Session;
|
||||||
string path = string.Format(OutlookConstants.REG_SUBKEY_ACCOUNTS, session.CurrentProfileName);
|
string path = string.Format(OutlookConstants.REG_SUBKEY_ACCOUNTS, session.CurrentProfileName);
|
||||||
ComRelease.Release(session);
|
ComRelease.Release(session);
|
||||||
return OutlookRegistryUtils.OpenOutlookKey(path);
|
return OutlookRegistryUtils.OpenOutlookKey(path);
|
||||||
@ -340,7 +338,7 @@ namespace Acacia.ZPush
|
|||||||
/// Finds the registry key for the account.
|
/// Finds the registry key for the account.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The registry key, or null if it cannot be found</returns>
|
/// <returns>The registry key, or null if it cannot be found</returns>
|
||||||
private RegistryKey FindRegistryKey(Account account)
|
private RegistryKey FindRegistryKey(NSOutlook.Account account)
|
||||||
{
|
{
|
||||||
// Find the registry key by email adddress
|
// Find the registry key by email adddress
|
||||||
using (RegistryKey key = OpenBaseKey())
|
using (RegistryKey key = OpenBaseKey())
|
||||||
@ -365,7 +363,7 @@ namespace Acacia.ZPush
|
|||||||
/// Finds the registry key for the account associated with the store.
|
/// Finds the registry key for the account associated with the store.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns>The registry key, or null if it cannot be found</returns>
|
/// <returns>The registry key, or null if it cannot be found</returns>
|
||||||
private RegistryKey FindRegistryKey(Store store)
|
private RegistryKey FindRegistryKey(NSOutlook.Store store)
|
||||||
{
|
{
|
||||||
// Find the registry key by store id
|
// Find the registry key by store id
|
||||||
using (RegistryKey key = OpenBaseKey())
|
using (RegistryKey key = OpenBaseKey())
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
///
|
///
|
||||||
/// Consult LICENSE file for details
|
/// Consult LICENSE file for details
|
||||||
|
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -16,20 +16,20 @@
|
|||||||
|
|
||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Stubs.OutlookWrappers;
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.ZPush
|
namespace Acacia.ZPush
|
||||||
{
|
{
|
||||||
public class ZPushFolder : FolderWrapper
|
public class ZPushFolder : FolderWrapper
|
||||||
{
|
{
|
||||||
private readonly Items _items;
|
private readonly NSOutlook.Items _items;
|
||||||
private readonly Folders _subFolders;
|
private readonly NSOutlook.Folders _subFolders;
|
||||||
private ZPushFolder _parent;
|
private ZPushFolder _parent;
|
||||||
private readonly ZPushWatcher _watcher;
|
private readonly ZPushWatcher _watcher;
|
||||||
private List<ItemsWatcher> _itemsWatchers = new List<ItemsWatcher>();
|
private List<ItemsWatcher> _itemsWatchers = new List<ItemsWatcher>();
|
||||||
@ -39,14 +39,14 @@ namespace Acacia.ZPush
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
protected readonly Dictionary<string, ZPushFolder> _children = new Dictionary<string, ZPushFolder>();
|
protected readonly Dictionary<string, ZPushFolder> _children = new Dictionary<string, ZPushFolder>();
|
||||||
|
|
||||||
internal ZPushFolder(ZPushWatcher watcher, Folder folder)
|
internal ZPushFolder(ZPushWatcher watcher, NSOutlook.Folder folder)
|
||||||
:
|
:
|
||||||
this(watcher, null, folder)
|
this(watcher, null, folder)
|
||||||
{
|
{
|
||||||
Initialise();
|
Initialise();
|
||||||
}
|
}
|
||||||
|
|
||||||
private ZPushFolder(ZPushWatcher watcher, ZPushFolder parent, Folder folder)
|
private ZPushFolder(ZPushWatcher watcher, ZPushFolder parent, NSOutlook.Folder folder)
|
||||||
:
|
:
|
||||||
base(folder)
|
base(folder)
|
||||||
{
|
{
|
||||||
@ -66,7 +66,7 @@ namespace Acacia.ZPush
|
|||||||
_watcher.OnFolderDiscovered(this);
|
_watcher.OnFolderDiscovered(this);
|
||||||
|
|
||||||
// Recurse the children
|
// Recurse the children
|
||||||
foreach (Folder subfolder in this._subFolders)
|
foreach (NSOutlook.Folder subfolder in this._subFolders)
|
||||||
{
|
{
|
||||||
Tasks.Task(null, "WatchChild", () => WatchChild(subfolder));
|
Tasks.Task(null, "WatchChild", () => WatchChild(subfolder));
|
||||||
}
|
}
|
||||||
@ -140,7 +140,7 @@ namespace Acacia.ZPush
|
|||||||
/// Watches the child folder.
|
/// Watches the child folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="child">The child folder. Ownership will be taken.</param>
|
/// <param name="child">The child folder. Ownership will be taken.</param>
|
||||||
private void WatchChild(Folder child)
|
private void WatchChild(NSOutlook.Folder child)
|
||||||
{
|
{
|
||||||
if (!_children.ContainsKey(child.EntryID))
|
if (!_children.ContainsKey(child.EntryID))
|
||||||
{
|
{
|
||||||
@ -167,12 +167,12 @@ namespace Acacia.ZPush
|
|||||||
|
|
||||||
#region Event handlers
|
#region Event handlers
|
||||||
|
|
||||||
private void SubFolders_FolderAdd(MAPIFolder folder)
|
private void SubFolders_FolderAdd(NSOutlook.MAPIFolder folder)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Logger.Instance.Debug(this, "Folder added in {0}: {1}", this._item.Name, folder.Name);
|
Logger.Instance.Debug(this, "Folder added in {0}: {1}", this._item.Name, folder.Name);
|
||||||
WatchChild((Folder)folder);
|
WatchChild((NSOutlook.Folder)folder);
|
||||||
}
|
}
|
||||||
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderAdd: {0}: {1}", Name, e); }
|
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderAdd: {0}: {1}", Name, e); }
|
||||||
}
|
}
|
||||||
@ -187,7 +187,7 @@ namespace Acacia.ZPush
|
|||||||
// but that doesn't fire if a folder was removed on the server.
|
// but that doesn't fire if a folder was removed on the server.
|
||||||
// Hence, fetch all the remaining folder ids, and remove any folder that no longer exists.
|
// Hence, fetch all the remaining folder ids, and remove any folder that no longer exists.
|
||||||
HashSet<string> remaining = new HashSet<string>();
|
HashSet<string> remaining = new HashSet<string>();
|
||||||
foreach (Folder child in _subFolders)
|
foreach (NSOutlook.Folder child in _subFolders)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -219,7 +219,7 @@ namespace Acacia.ZPush
|
|||||||
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderRemove: {0}: {1}", Name, e); }
|
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderRemove: {0}: {1}", Name, e); }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SubFolders_FolderChange(MAPIFolder folder)
|
private void SubFolders_FolderChange(NSOutlook.MAPIFolder folder)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -236,7 +236,7 @@ namespace Acacia.ZPush
|
|||||||
// Create it now
|
// Create it now
|
||||||
// This will send a discover notification if required, which is just as good as a change notification
|
// This will send a discover notification if required, which is just as good as a change notification
|
||||||
Logger.Instance.Debug(this, "Folder change on unreported folder in {0}: {1}, {2}, {3}", this._item.Name, folder.Name, folder.EntryID, folder.Store.DisplayName);
|
Logger.Instance.Debug(this, "Folder change on unreported folder in {0}: {1}, {2}, {3}", this._item.Name, folder.Name, folder.EntryID, folder.Store.DisplayName);
|
||||||
WatchChild((Folder)folder);
|
WatchChild((NSOutlook.Folder)folder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderChange: {0}: {1}", Name, e); }
|
catch (System.Exception e) { Logger.Instance.Error(this, "Exception in SubFolders_FolderChange: {0}: {1}", Name, e); }
|
||||||
|
@ -17,13 +17,13 @@
|
|||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Stubs.OutlookWrappers;
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.ZPush
|
namespace Acacia.ZPush
|
||||||
{
|
{
|
||||||
@ -33,7 +33,7 @@ namespace Acacia.ZPush
|
|||||||
/// TODO: merge with Store where possible
|
/// TODO: merge with Store where possible
|
||||||
public class ZPushLocalStore : ComWrapper
|
public class ZPushLocalStore : ComWrapper
|
||||||
{
|
{
|
||||||
private Store _store;
|
private NSOutlook.Store _store;
|
||||||
|
|
||||||
public IFolder RootFolder
|
public IFolder RootFolder
|
||||||
{
|
{
|
||||||
@ -45,7 +45,7 @@ namespace Acacia.ZPush
|
|||||||
|
|
||||||
public string StoreId { get { return _store.StoreID; } }
|
public string StoreId { get { return _store.StoreID; } }
|
||||||
|
|
||||||
private ZPushLocalStore(Store store)
|
private ZPushLocalStore(NSOutlook.Store store)
|
||||||
{
|
{
|
||||||
this._store = store;
|
this._store = store;
|
||||||
HideAllFolders();
|
HideAllFolders();
|
||||||
@ -69,7 +69,7 @@ namespace Acacia.ZPush
|
|||||||
// Hide the folders that are not custom folders
|
// Hide the folders that are not custom folders
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
foreach (Folder sub in com.Add(com.Add(_store.GetRootFolder()).Folders))
|
foreach (NSOutlook.Folder sub in com.Add(com.Add(_store.GetRootFolder()).Folders))
|
||||||
{
|
{
|
||||||
using (IFolder wrapped = Mapping.Wrap<IFolder>(sub))
|
using (IFolder wrapped = Mapping.Wrap<IFolder>(sub))
|
||||||
{
|
{
|
||||||
@ -80,7 +80,7 @@ namespace Acacia.ZPush
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ZPushLocalStore GetInstance(Application App)
|
public static ZPushLocalStore GetInstance(IAddIn addIn)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@ -94,7 +94,7 @@ namespace Acacia.ZPush
|
|||||||
Logger.Instance.Debug(typeof(ZPushLocalStore), "Opening store with prefix {0}", prefix);
|
Logger.Instance.Debug(typeof(ZPushLocalStore), "Opening store with prefix {0}", prefix);
|
||||||
|
|
||||||
// See if a store with this prefix exists
|
// See if a store with this prefix exists
|
||||||
Store store = FindInstance(App, prefix);
|
NSOutlook.Store store = FindInstance(addIn, prefix);
|
||||||
if (store != null)
|
if (store != null)
|
||||||
return new ZPushLocalStore(store);
|
return new ZPushLocalStore(store);
|
||||||
|
|
||||||
@ -114,8 +114,8 @@ namespace Acacia.ZPush
|
|||||||
|
|
||||||
// Path found, create the store
|
// Path found, create the store
|
||||||
Logger.Instance.Info(typeof(ZPushLocalStore), "Creating new store: {0}", path);
|
Logger.Instance.Info(typeof(ZPushLocalStore), "Creating new store: {0}", path);
|
||||||
App.Session.AddStore(path);
|
addIn.RawApp.Session.AddStore(path);
|
||||||
store = App.Session.Stores[App.Session.Stores.Count];
|
store = addIn.RawApp.Session.Stores[addIn.RawApp.Session.Stores.Count];
|
||||||
Logger.Instance.Debug(typeof(ZPushLocalStore), "Created new store: {0}", store.FilePath);
|
Logger.Instance.Debug(typeof(ZPushLocalStore), "Created new store: {0}", store.FilePath);
|
||||||
|
|
||||||
// Set the display name
|
// Set the display name
|
||||||
@ -134,9 +134,9 @@ namespace Acacia.ZPush
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Store FindInstance(Application app, string prefix)
|
private static NSOutlook.Store FindInstance(IAddIn addIn, string prefix)
|
||||||
{
|
{
|
||||||
foreach (Store store in app.Session.Stores)
|
foreach (NSOutlook.Store store in addIn.RawApp.Session.Stores)
|
||||||
{
|
{
|
||||||
if (store.IsDataFileStore && store.FilePath.StartsWith(prefix))
|
if (store.IsDataFileStore && store.FilePath.StartsWith(prefix))
|
||||||
{
|
{
|
||||||
@ -151,17 +151,17 @@ namespace Acacia.ZPush
|
|||||||
{
|
{
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
MAPIFolder f = _store.GetDefaultFolder(OlDefaultFolders.olFolderDeletedItems);
|
NSOutlook.MAPIFolder f = _store.GetDefaultFolder(NSOutlook.OlDefaultFolders.olFolderDeletedItems);
|
||||||
if (f != null)
|
if (f != null)
|
||||||
{
|
{
|
||||||
com.Add(f);
|
com.Add(f);
|
||||||
|
|
||||||
// Normal enumeration fails when deleting. Do it like this.
|
// Normal enumeration fails when deleting. Do it like this.
|
||||||
Folders folders = com.Add(f.Folders);
|
NSOutlook.Folders folders = com.Add(f.Folders);
|
||||||
for (int i = folders.Count; i > 0; --i)
|
for (int i = folders.Count; i > 0; --i)
|
||||||
com.Add(folders[i]).Delete();
|
com.Add(folders[i]).Delete();
|
||||||
|
|
||||||
Items items = com.Add(f.Items);
|
NSOutlook.Items items = com.Add(f.Items);
|
||||||
for (int i = items.Count; i > 0; --i)
|
for (int i = items.Count; i > 0; --i)
|
||||||
com.Add(items[i]).Delete();
|
com.Add(items[i]).Delete();
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.ZPush
|
namespace Acacia.ZPush
|
||||||
{
|
{
|
||||||
@ -76,7 +77,7 @@ namespace Acacia.ZPush
|
|||||||
|
|
||||||
#region Setup
|
#region Setup
|
||||||
|
|
||||||
private readonly Microsoft.Office.Interop.Outlook.SyncObject _syncObject;
|
private readonly NSOutlook.SyncObject _syncObject;
|
||||||
private readonly Timer _timer;
|
private readonly Timer _timer;
|
||||||
private ZPushWatcher _watcher;
|
private ZPushWatcher _watcher;
|
||||||
private bool _started;
|
private bool _started;
|
||||||
@ -85,7 +86,7 @@ namespace Acacia.ZPush
|
|||||||
public readonly bool Enabled;
|
public readonly bool Enabled;
|
||||||
public readonly TimeSpan Period;
|
public readonly TimeSpan Period;
|
||||||
|
|
||||||
public ZPushSync(ZPushWatcher watcher, Microsoft.Office.Interop.Outlook.Application app)
|
public ZPushSync(ZPushWatcher watcher, NSOutlook.Application app)
|
||||||
{
|
{
|
||||||
// Get the settings
|
// Get the settings
|
||||||
Enabled = GlobalOptions.INSTANCE.ZPushSync;
|
Enabled = GlobalOptions.INSTANCE.ZPushSync;
|
||||||
|
@ -19,7 +19,6 @@ using Acacia.Stubs;
|
|||||||
using Acacia.Stubs.OutlookWrappers;
|
using Acacia.Stubs.OutlookWrappers;
|
||||||
using Acacia.Utils;
|
using Acacia.Utils;
|
||||||
using Acacia.ZPush.Connect;
|
using Acacia.ZPush.Connect;
|
||||||
using Microsoft.Office.Interop.Outlook;
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -27,6 +26,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NSOutlook = Microsoft.Office.Interop.Outlook;
|
||||||
|
|
||||||
namespace Acacia.ZPush
|
namespace Acacia.ZPush
|
||||||
{
|
{
|
||||||
@ -37,22 +37,22 @@ namespace Acacia.ZPush
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class ZPushWatcher
|
public class ZPushWatcher
|
||||||
{
|
{
|
||||||
private readonly Application _app;
|
private readonly NSOutlook.Application _app;
|
||||||
public readonly ZPushAccounts Accounts;
|
public readonly ZPushAccounts Accounts;
|
||||||
public readonly ZPushSync Sync;
|
public readonly ZPushSync Sync;
|
||||||
private Explorer _explorer;
|
private NSOutlook.Explorer _explorer;
|
||||||
|
|
||||||
|
|
||||||
#region Setup
|
#region Setup
|
||||||
|
|
||||||
public ZPushWatcher(Application app)
|
public ZPushWatcher(IAddIn addIn)
|
||||||
{
|
{
|
||||||
this._app = app;
|
this._app = addIn.RawApp;
|
||||||
Sync = new ZPushSync(this, app);
|
Sync = new ZPushSync(this, _app);
|
||||||
Accounts = new ZPushAccounts(this, app);
|
Accounts = new ZPushAccounts(this, _app);
|
||||||
|
|
||||||
// Need to keep a link to keep receiving events
|
// Need to keep a link to keep receiving events
|
||||||
_explorer = app.ActiveExplorer();
|
_explorer = _app.ActiveExplorer();
|
||||||
_explorer.SelectionChange += Explorer_SelectionChange;
|
_explorer.SelectionChange += Explorer_SelectionChange;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -164,6 +164,7 @@ namespace Acacia.ZPush
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// TODO
|
||||||
ThisAddIn.Instance.InvokeUI(() =>
|
ThisAddIn.Instance.InvokeUI(() =>
|
||||||
{
|
{
|
||||||
Logger.Instance.Warning(this, "Password not available for account: {0}", account);
|
Logger.Instance.Warning(this, "Password not available for account: {0}", account);
|
||||||
@ -206,7 +207,7 @@ namespace Acacia.ZPush
|
|||||||
{
|
{
|
||||||
if (ActiveFolderChange != null)
|
if (ActiveFolderChange != null)
|
||||||
{
|
{
|
||||||
MAPIFolder active = _explorer.CurrentFolder;
|
NSOutlook.MAPIFolder active = _explorer.CurrentFolder;
|
||||||
if (active != null)
|
if (active != null)
|
||||||
{
|
{
|
||||||
using (IFolder folder = Mapping.Wrap<IFolder>(active))
|
using (IFolder folder = Mapping.Wrap<IFolder>(active))
|
||||||
@ -237,7 +238,7 @@ namespace Acacia.ZPush
|
|||||||
if (_explorer.CurrentFolder == null)
|
if (_explorer.CurrentFolder == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
MAPIFolder folder = _explorer.CurrentFolder;
|
NSOutlook.MAPIFolder folder = _explorer.CurrentFolder;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return Accounts.GetAccount(folder);
|
return Accounts.GetAccount(folder);
|
||||||
@ -276,7 +277,7 @@ namespace Acacia.ZPush
|
|||||||
private void HandleFolderWatchers(ZPushAccount account)
|
private void HandleFolderWatchers(ZPushAccount account)
|
||||||
{
|
{
|
||||||
// We need to keep the object alive to keep receiving events
|
// We need to keep the object alive to keep receiving events
|
||||||
_rootFolder = new ZPushFolder(this, (Folder)account.Store.GetRootFolder());
|
_rootFolder = new ZPushFolder(this, (NSOutlook.Folder)account.Store.GetRootFolder());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WatchFolder(FolderRegistration folder, FolderEventHandler handler, FolderEventHandler changedHandler = null)
|
public void WatchFolder(FolderRegistration folder, FolderEventHandler handler, FolderEventHandler changedHandler = null)
|
||||||
@ -341,12 +342,12 @@ namespace Acacia.ZPush
|
|||||||
watcher.OnChanged(folder);
|
watcher.OnChanged(folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool ShouldFolderBeWatched(ZPushFolder parent, Folder child)
|
internal bool ShouldFolderBeWatched(ZPushFolder parent, NSOutlook.Folder child)
|
||||||
{
|
{
|
||||||
if (parent.IsAtDepth(0))
|
if (parent.IsAtDepth(0))
|
||||||
{
|
{
|
||||||
// Special mail folders cause issues, they are disallowed
|
// Special mail folders cause issues, they are disallowed
|
||||||
if (child.DefaultItemType != OlItemType.olMailItem)
|
if (child.DefaultItemType != NSOutlook.OlItemType.olMailItem)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return !IsBlackListedMailFolder(child);
|
return !IsBlackListedMailFolder(child);
|
||||||
@ -354,23 +355,23 @@ namespace Acacia.ZPush
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly OlDefaultFolders[] BLACKLISTED_MAIL_FOLDERS =
|
private static readonly NSOutlook.OlDefaultFolders[] BLACKLISTED_MAIL_FOLDERS =
|
||||||
{
|
{
|
||||||
OlDefaultFolders.olFolderOutbox,
|
NSOutlook.OlDefaultFolders.olFolderOutbox,
|
||||||
OlDefaultFolders.olFolderDrafts,
|
NSOutlook.OlDefaultFolders.olFolderDrafts,
|
||||||
OlDefaultFolders.olFolderConflicts,
|
NSOutlook.OlDefaultFolders.olFolderConflicts,
|
||||||
OlDefaultFolders.olFolderSyncIssues,
|
NSOutlook.OlDefaultFolders.olFolderSyncIssues,
|
||||||
OlDefaultFolders.olFolderRssFeeds,
|
NSOutlook.OlDefaultFolders.olFolderRssFeeds,
|
||||||
OlDefaultFolders.olFolderManagedEmail
|
NSOutlook.OlDefaultFolders.olFolderManagedEmail
|
||||||
};
|
};
|
||||||
|
|
||||||
private static bool IsBlackListedMailFolder(Folder folder)
|
private static bool IsBlackListedMailFolder(NSOutlook.Folder folder)
|
||||||
{
|
{
|
||||||
string entryId = folder.EntryID;
|
string entryId = folder.EntryID;
|
||||||
using (ComRelease com = new ComRelease())
|
using (ComRelease com = new ComRelease())
|
||||||
{
|
{
|
||||||
Store store = com.Add(folder.Store);
|
NSOutlook.Store store = com.Add(folder.Store);
|
||||||
foreach(OlDefaultFolders defaultFolder in BLACKLISTED_MAIL_FOLDERS)
|
foreach(NSOutlook.OlDefaultFolders defaultFolder in BLACKLISTED_MAIL_FOLDERS)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user