Made Search manage returned items, like Folder.Items

This commit is contained in:
Patrick Simpson 2017-02-15 10:53:24 +01:00
parent 10d2bd4d65
commit f687ee9f22
3 changed files with 17 additions and 19 deletions

View File

@ -274,12 +274,8 @@ namespace Acacia.Features.GAB
search.AddField(PROP_CHUNK, true).SetOperation(SearchOperation.Equal, index.chunk); search.AddField(PROP_CHUNK, true).SetOperation(SearchOperation.Equal, index.chunk);
foreach (IItem oldItem in search.Search()) foreach (IItem oldItem in search.Search())
{ {
// TODO: Search should handle this, like folder enumeration Logger.Instance.Trace(this, "Deleting GAB entry: {0}", oldItem.Subject);
using (oldItem) oldItem.Delete();
{
Logger.Instance.Trace(this, "Deleting GAB entry: {0}", oldItem.Subject);
oldItem.Delete();
}
} }
} }
} }

View File

@ -176,19 +176,26 @@ namespace Acacia.Stubs.OutlookWrappers
public IEnumerable<ItemType> Search(int maxResults) public IEnumerable<ItemType> Search(int maxResults)
{ {
List<ItemType> values = new List<ItemType>();
string filter = MakeFilter(); string filter = MakeFilter();
int count = 0;
object value = _item.Find(filter); object value = _item.Find(filter);
while(value != null) while(value != null)
{ {
if (values.Count < maxResults) if (count < maxResults)
{ {
// Wrap and add if it returns an object. If not, WrapOrDefault will release it // 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)
{ {
values.Add(wrapped); try
{
yield return wrapped;
}
finally
{
wrapped.Dispose();
}
} }
} }
else else
@ -197,8 +204,8 @@ namespace Acacia.Stubs.OutlookWrappers
ComRelease.Release(value); ComRelease.Release(value);
} }
value = _item.FindNext(); value = _item.FindNext();
++count;
} }
return values;
} }
public ItemType SearchOne() public ItemType SearchOne()

View File

@ -231,14 +231,11 @@ namespace Acacia.UI
oper.AddField("urn:schemas:contacts:customerid").SetOperation(SearchOperation.Like, text + "%"); oper.AddField("urn:schemas:contacts:customerid").SetOperation(SearchOperation.Like, text + "%");
// Fetch the results up to the limit. // Fetch the results up to the limit.
// TODO: make limit a property // TODO: make limit a property?
List<GABUser> users = new List<GABUser>(); List<GABUser> users = new List<GABUser>();
foreach (IContactItem result in search.Search(max)) foreach (IContactItem result in search.Search(max))
{ {
using (result) users.Add(new GABUser(result.FullName, result.CustomerID));
{
users.Add(new GABUser(result.FullName, result.CustomerID));
}
} }
return users; return users;
@ -254,13 +251,11 @@ namespace Acacia.UI
search.AddField("urn:schemas:contacts:customerid").SetOperation(SearchOperation.Equal, username); search.AddField("urn:schemas:contacts:customerid").SetOperation(SearchOperation.Equal, username);
// Fetch the result, if any. // Fetch the result, if any.
// TODO: make a SearchOne method?
List<GABUser> users = new List<GABUser>(); List<GABUser> users = new List<GABUser>();
foreach (IContactItem result in search.Search(1)) foreach (IContactItem result in search.Search(1))
{ {
using (result) return new GABUser(result.FullName, result.CustomerID);
{
return new GABUser(result.FullName, result.CustomerID);
}
} }
} }