1
0
mirror of https://github.com/Kopano-dev/kopano-ol-extension.git synced 2023-10-10 13:37:40 +02:00

[KOE-147] Iteration of stores now handles exceptions to prevent single broken store from affecting correct stores.

This commit is contained in:
Patrick Simpson 2017-10-25 11:22:50 +02:00
parent c2b0dc6e26
commit 9c10ac93dd

View File

@ -62,11 +62,34 @@ namespace Acacia.Stubs.OutlookWrappers
#region Implementation #region Implementation
/// <summary>
/// When iterating stores, an exception in any of the stores terminates the iteration.
/// This checks each entry.
/// </summary>
private IEnumerable<NSOutlook.Store> IteratorStoresSafe(bool logException = false)
{
for (int i = 0; i < _item.Count; ++i)
{
NSOutlook.Store store;
try
{
store = _item[i + 1];
}
catch (Exception e)
{
if (logException)
Logger.Instance.Error(this, "Unable to open store at index {0}: {1}", i, e);
continue;
}
yield return store;
}
}
public void Start() public void Start()
{ {
// Check existing stores // Check existing stores
foreach(NSOutlook.Store store in _item) foreach(NSOutlook.Store store in IteratorStoresSafe(true))
{ {
Tasks.Task(null, null, "AddStore", () => Tasks.Task(null, null, "AddStore", () =>
{ {
StoreAdded(store); StoreAdded(store);
@ -93,7 +116,7 @@ namespace Acacia.Stubs.OutlookWrappers
{ {
// Accessing the store object causes random crashes, simply iterate to find new stores // Accessing the store object causes random crashes, simply iterate to find new stores
Logger.Instance.Trace(this, "StoreAdded"); Logger.Instance.Trace(this, "StoreAdded");
foreach (NSOutlook.Store rawStore in _item) foreach (NSOutlook.Store rawStore in IteratorStoresSafe())
{ {
if (!_accountsByStoreId.ContainsKey(rawStore.StoreID)) if (!_accountsByStoreId.ContainsKey(rawStore.StoreID))
{ {
@ -149,7 +172,7 @@ namespace Acacia.Stubs.OutlookWrappers
{ {
// Collect all the store ids // Collect all the store ids
HashSet<string> stores = new HashSet<string>(); HashSet<string> stores = new HashSet<string>();
foreach (NSOutlook.Store store in _item) foreach (NSOutlook.Store store in IteratorStoresSafe())
{ {
try try
{ {
@ -210,7 +233,7 @@ namespace Acacia.Stubs.OutlookWrappers
public IEnumerator<IStore> GetEnumerator() public IEnumerator<IStore> GetEnumerator()
{ {
foreach (NSOutlook.Store store in _item) foreach (NSOutlook.Store store in IteratorStoresSafe())
{ {
yield return Mapping.Wrap(store); yield return Mapping.Wrap(store);
} }
@ -218,7 +241,7 @@ namespace Acacia.Stubs.OutlookWrappers
IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator()
{ {
foreach (NSOutlook.Store store in _item) foreach (NSOutlook.Store store in IteratorStoresSafe())
{ {
yield return Mapping.Wrap(store); yield return Mapping.Wrap(store);
} }