mirror of
https://github.com/Kopano-dev/kopano-ol-extension.git
synced 2023-10-10 13:37:40 +02:00
Fallback commit, some files were missed
This commit is contained in:
parent
2f0e46f18d
commit
629bfd371b
@ -35,6 +35,7 @@ namespace Acacia.Features
|
|||||||
typeof(Notes.FeatureNotes),
|
typeof(Notes.FeatureNotes),
|
||||||
typeof(SecondaryContacts.FeatureSecondaryContacts),
|
typeof(SecondaryContacts.FeatureSecondaryContacts),
|
||||||
typeof(SendAs.FeatureSendAs),
|
typeof(SendAs.FeatureSendAs),
|
||||||
|
typeof(Signatures.FeatureSignatures),
|
||||||
typeof(DebugSupport.FeatureDebugSupport)
|
typeof(DebugSupport.FeatureDebugSupport)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
using Acacia.Native.MAPI;
|
using Acacia.Native.MAPI;
|
||||||
using Acacia.Stubs;
|
|
||||||
/// Copyright 2016 Kopano b.v.
|
/// Copyright 2016 Kopano b.v.
|
||||||
///
|
///
|
||||||
/// This program is free software: you can redistribute it and/or modify
|
/// This program is free software: you can redistribute it and/or modify
|
||||||
@ -81,21 +80,13 @@ namespace Acacia.Features.WebApp
|
|||||||
if (account == null)
|
if (account == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
using (IFolder reminders = account.Account.Store.GetSpecialFolder(SpecialFolder.Reminders))
|
|
||||||
{
|
|
||||||
Logger.Instance.Trace(this, "REMINDERS:\n{0}", reminders.SearchCriteria);
|
|
||||||
using (RestrictionEncoder res = reminders.SearchCriteria.ToRestriction())
|
|
||||||
Logger.Instance.Trace(this, "REMINDERS2:\n{0}", res.Restriction);
|
|
||||||
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
// Get the url
|
// Get the url
|
||||||
string url = AutoDiscover(account);
|
string url = AutoDiscover(account);
|
||||||
if (url == null)
|
if (url == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Open the browser
|
// Open the browser
|
||||||
System.Diagnostics.Process.Start(url);*/
|
System.Diagnostics.Process.Start(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string AutoDiscover(ZPushAccount account)
|
private string AutoDiscover(ZPushAccount account)
|
||||||
|
@ -52,7 +52,7 @@ namespace Acacia.Native.MAPI
|
|||||||
|
|
||||||
public SearchQuery.PropertyIdentifier ToPropertyIdentifier()
|
public SearchQuery.PropertyIdentifier ToPropertyIdentifier()
|
||||||
{
|
{
|
||||||
return new SearchQuery.PropertyIdentifier(this);
|
return SearchQuery.PropertyIdentifier.FromTag(prop, (ushort)type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,10 +131,5 @@ namespace Acacia.Native.MAPI
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static PropValue* FromObject(NativeEncoder encoder, object value)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
|
|
||||||
using Acacia.Stubs;
|
using Acacia.Stubs;
|
||||||
using Acacia.Utils;
|
|
||||||
/// Copyright 2017 Kopano b.v.
|
/// Copyright 2017 Kopano b.v.
|
||||||
///
|
///
|
||||||
/// This program is free software: you can redistribute it and/or modify
|
/// This program is free software: you can redistribute it and/or modify
|
||||||
@ -70,14 +69,14 @@ namespace Acacia.Native.MAPI
|
|||||||
|
|
||||||
unsafe public struct ContentRestriction
|
unsafe public struct ContentRestriction
|
||||||
{
|
{
|
||||||
public FuzzyLevel ulFuzzyLevel;
|
public FuzzyLevel fuzzy;
|
||||||
public PropTag ulPropTag;
|
public PropTag ulPropTag;
|
||||||
public PropValue* prop;
|
public PropValue* prop;
|
||||||
|
|
||||||
public string ToString(int depth)
|
public string ToString(int depth)
|
||||||
{
|
{
|
||||||
string indent = new string(' ', depth);
|
string indent = new string(' ', depth);
|
||||||
string s = indent + ulFuzzyLevel + ":" + ulPropTag.ToString();
|
string s = indent + fuzzy + ":" + ulPropTag.ToString();
|
||||||
s += ":" + prop->ToString();
|
s += ":" + prop->ToString();
|
||||||
s += "\n";
|
s += "\n";
|
||||||
return s;
|
return s;
|
||||||
@ -86,8 +85,7 @@ namespace Acacia.Native.MAPI
|
|||||||
public SearchQuery ToSearchQuery()
|
public SearchQuery ToSearchQuery()
|
||||||
{
|
{
|
||||||
return new SearchQuery.PropertyContent(ulPropTag.ToPropertyIdentifier(),
|
return new SearchQuery.PropertyContent(ulPropTag.ToPropertyIdentifier(),
|
||||||
(SearchQuery.ContentMatchOperation)((uint)ulFuzzyLevel & 0xF),
|
(uint)fuzzy, // TODO
|
||||||
(SearchQuery.ContentMatchModifiers)(((uint)ulFuzzyLevel & 0xF0000) >> 16),
|
|
||||||
prop->ToObject());
|
prop->ToObject());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,7 +174,7 @@ namespace Acacia.Native.MAPI
|
|||||||
|
|
||||||
public SearchQuery ToSearchQuery()
|
public SearchQuery ToSearchQuery()
|
||||||
{
|
{
|
||||||
return new SearchQuery.PropertyBitMask(prop.ToPropertyIdentifier(), (SearchQuery.BitMaskOperation)(int)bmr, mask);
|
return new SearchQuery.PropertyBitMask(prop.ToPropertyIdentifier(), bmr == BMR.EQZ, mask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,145 +304,6 @@ namespace Acacia.Native.MAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Encodes a search as an SRestriction. Note that as memory needs to be managed for the miscellaneous structures,
|
|
||||||
/// the SRestriction is only valid until RestrictionEncoder is disposed.
|
|
||||||
/// </summary>
|
|
||||||
unsafe public class RestrictionEncoder : NativeEncoder, ISearchEncoder
|
|
||||||
{
|
|
||||||
private class EncodingStack
|
|
||||||
{
|
|
||||||
public SRestriction[] array;
|
|
||||||
public int index;
|
|
||||||
public SRestriction* ptr;
|
|
||||||
|
|
||||||
public EncodingStack(int count, Allocation<SRestriction[]> alloc)
|
|
||||||
{
|
|
||||||
array = alloc.Object;
|
|
||||||
index = 0;
|
|
||||||
ptr = (SRestriction*)alloc.Pointer;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private readonly Stack<EncodingStack> _current = new Stack<EncodingStack>();
|
|
||||||
private readonly EncodingStack _root;
|
|
||||||
|
|
||||||
public RestrictionEncoder()
|
|
||||||
{
|
|
||||||
// Create an object for the root element
|
|
||||||
_root = Begin(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void DoRelease()
|
|
||||||
{
|
|
||||||
// TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
public SRestriction Restriction
|
|
||||||
{
|
|
||||||
get { return _root.array[0]; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private SRestriction* Current
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
EncodingStack top = _current.Peek();
|
|
||||||
return top.ptr + top.index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyExists part)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.Or part)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyIdentifier part)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.Not part)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.And part)
|
|
||||||
{
|
|
||||||
Current->rt = RestrictionType.AND;
|
|
||||||
Current->sub.cb = (uint)part.Operands.Count;
|
|
||||||
Current->sub.ptr = EncodePointer(part.Operands);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SRestriction* EncodePointer(IEnumerable<SearchQuery> operands)
|
|
||||||
{
|
|
||||||
EncodingStack alloc = Begin(operands.Count());
|
|
||||||
try
|
|
||||||
{
|
|
||||||
foreach (SearchQuery operand in operands)
|
|
||||||
{
|
|
||||||
operand.Encode(this);
|
|
||||||
++alloc.index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
End();
|
|
||||||
}
|
|
||||||
return alloc.ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private EncodingStack Begin(int count)
|
|
||||||
{
|
|
||||||
// Allocate and push the array
|
|
||||||
EncodingStack alloc = new EncodingStack(count, Allocate(new SRestriction[count]));
|
|
||||||
_current.Push(alloc);
|
|
||||||
|
|
||||||
return alloc;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void End()
|
|
||||||
{
|
|
||||||
_current.Pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyContent part)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyCompare part)
|
|
||||||
{
|
|
||||||
Current->rt = RestrictionType.PROPERTY;
|
|
||||||
Current->prop.relop = (SearchOperation)part.Operation;
|
|
||||||
Current->prop.ulPropTag = part.Property.Tag;
|
|
||||||
Current->prop.prop = PropValue.FromObject(this, part.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyBitMask part)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class RestrictionExensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Encodes the search as an SRestriction.
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>The encoder containing the restriction. The caller is responsible for disposing.</returns>
|
|
||||||
public static RestrictionEncoder ToRestriction(this SearchQuery search)
|
|
||||||
{
|
|
||||||
RestrictionEncoder encoder = new RestrictionEncoder();
|
|
||||||
search.Encode(encoder);
|
|
||||||
return encoder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Example search code
|
/* Example search code
|
||||||
{
|
{
|
||||||
MAPIFolder folder = (MAPIFolder)account.Store.GetSpecialFolder(Microsoft.Office.Interop.Outlook.OlSpecialFolders.olSpecialFolderReminders);
|
MAPIFolder folder = (MAPIFolder)account.Store.GetSpecialFolder(Microsoft.Office.Interop.Outlook.OlSpecialFolders.olSpecialFolderReminders);
|
||||||
|
@ -32,7 +32,6 @@ namespace Acacia
|
|||||||
void Encode(SearchQuery.And part);
|
void Encode(SearchQuery.And part);
|
||||||
void Encode(SearchQuery.Or part);
|
void Encode(SearchQuery.Or part);
|
||||||
void Encode(SearchQuery.Not part);
|
void Encode(SearchQuery.Not part);
|
||||||
void Encode(SearchQuery.PropertyIdentifier part);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ToStringEncoder : ISearchEncoder
|
public class ToStringEncoder : ISearchEncoder
|
||||||
@ -47,20 +46,21 @@ namespace Acacia
|
|||||||
|
|
||||||
public void Encode(SearchQuery.And part)
|
public void Encode(SearchQuery.And part)
|
||||||
{
|
{
|
||||||
EncodeMulti("AND", part.Operands);
|
EncodeMulti(part, "AND");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Encode(SearchQuery.Or part)
|
public void Encode(SearchQuery.Or part)
|
||||||
{
|
{
|
||||||
EncodeMulti("OR", part.Operands);
|
EncodeMulti(part, "OR");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Encode(SearchQuery.Not part)
|
public void Encode(SearchQuery.Not part)
|
||||||
{
|
{
|
||||||
EncodeMulti("NOT", new[] { part.Operand });
|
_builder.Append("NOT ");
|
||||||
|
part.Operand.Encode(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void EncodeMulti(string oper, IEnumerable<SearchQuery> parts)
|
private void EncodeMulti(SearchQuery.MultiOperator part, string oper)
|
||||||
{
|
{
|
||||||
Indent();
|
Indent();
|
||||||
_builder.Append(oper).Append("\n");
|
_builder.Append(oper).Append("\n");
|
||||||
@ -69,7 +69,7 @@ namespace Acacia
|
|||||||
|
|
||||||
++_indent;
|
++_indent;
|
||||||
|
|
||||||
foreach (SearchQuery operand in parts)
|
foreach (SearchQuery operand in part.Operands)
|
||||||
operand.Encode(this);
|
operand.Encode(this);
|
||||||
|
|
||||||
--_indent;
|
--_indent;
|
||||||
@ -80,59 +80,22 @@ namespace Acacia
|
|||||||
|
|
||||||
public void Encode(SearchQuery.PropertyBitMask part)
|
public void Encode(SearchQuery.PropertyBitMask part)
|
||||||
{
|
{
|
||||||
Indent();
|
_builder.Append("BITMASK:").Append(part.Property); // TODO: operator/value
|
||||||
_builder.Append("BITMASK{");
|
|
||||||
part.Property.Encode(this);
|
|
||||||
_builder.Append(" ").Append(part.Operation).Append(" ");
|
|
||||||
_builder.Append(part.Mask.ToString("X8"));
|
|
||||||
_builder.Append("}\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static readonly string[] COMPARISON_OPERATORS = {"<", "<=", ">", ">=", "==", "!=", "LIKE"};
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyCompare part)
|
public void Encode(SearchQuery.PropertyCompare part)
|
||||||
{
|
{
|
||||||
Indent();
|
_builder.Append("COMPARE:").Append(part.Property); // TODO: operator/value
|
||||||
_builder.Append("COMPARE{");
|
|
||||||
part.Property.Encode(this);
|
|
||||||
_builder.Append(" ").Append(COMPARISON_OPERATORS[(int)part.Operation]).Append(" ");
|
|
||||||
_builder.Append(part.Value);
|
|
||||||
_builder.Append("}\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyContent part)
|
public void Encode(SearchQuery.PropertyContent part)
|
||||||
{
|
{
|
||||||
Indent();
|
_builder.Append("CONTENT:").Append(part.Property); // TODO: operator/value
|
||||||
_builder.Append("CONTENT{");
|
|
||||||
part.Property.Encode(this);
|
|
||||||
|
|
||||||
List<string> options = new List<string>();
|
|
||||||
if (part.Operation != SearchQuery.ContentMatchOperation.Full)
|
|
||||||
options.Add(part.Operation.ToString());
|
|
||||||
|
|
||||||
if (part.Modifiers != SearchQuery.ContentMatchModifiers.None)
|
|
||||||
{
|
|
||||||
options.Add(part.Modifiers.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
string optionsString = options.Count == 0 ? "" : ("(" + string.Join(",", options) + ")");
|
|
||||||
|
|
||||||
_builder.Append(" ==").Append(optionsString).Append(" ");
|
|
||||||
_builder.Append(part.Content);
|
|
||||||
_builder.Append("}\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyExists part)
|
public void Encode(SearchQuery.PropertyExists part)
|
||||||
{
|
{
|
||||||
Indent();
|
_builder.Append("EXISTS:").Append(part.Property);
|
||||||
_builder.Append("EXISTS{");
|
|
||||||
part.Property.Encode(this);
|
|
||||||
_builder.Append("}\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Encode(SearchQuery.PropertyIdentifier part)
|
|
||||||
{
|
|
||||||
_builder.Append(part.Id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetValue()
|
public string GetValue()
|
||||||
@ -170,7 +133,7 @@ namespace Acacia
|
|||||||
_operands.Add(operand);
|
_operands.Add(operand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICollection<SearchQuery> Operands
|
public IEnumerable<SearchQuery> Operands
|
||||||
{
|
{
|
||||||
get { return _operands; }
|
get { return _operands; }
|
||||||
}
|
}
|
||||||
@ -217,23 +180,16 @@ namespace Acacia
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class PropertyIdentifier
|
public class PropertyIdentifier
|
||||||
{
|
{
|
||||||
public string Id { get; private set; }
|
private string _id;
|
||||||
public PropTag Tag { get; private set; }
|
|
||||||
|
|
||||||
public PropertyIdentifier(PropTag tag)
|
public PropertyIdentifier(string id)
|
||||||
{
|
{
|
||||||
this.Tag = tag;
|
this._id = id;
|
||||||
Id = string.Format("{0:X4}{1:X4}", tag.prop, (int)tag.type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Encode(ISearchEncoder encoder)
|
public static PropertyIdentifier FromTag(ushort prop, ushort type)
|
||||||
{
|
{
|
||||||
encoder.Encode(this);
|
return new PropertyIdentifier(string.Format("{0:4X}{1:4X}", prop, type));
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
|
||||||
{
|
|
||||||
return Id;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,44 +247,11 @@ namespace Acacia
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ContentMatchOperation
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Match full content
|
|
||||||
/// </summary>
|
|
||||||
Full,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Match part of the content
|
|
||||||
/// </summary>
|
|
||||||
SubString,
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Match the start of the content
|
|
||||||
/// </summary>
|
|
||||||
Prefix
|
|
||||||
}
|
|
||||||
|
|
||||||
[Flags]
|
|
||||||
public enum ContentMatchModifiers
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
CaseInsensitive = 1,
|
|
||||||
IgnoreNonSpace = 2,
|
|
||||||
Loose = 4
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PropertyContent : PropertyQuery
|
public class PropertyContent : PropertyQuery
|
||||||
{
|
{
|
||||||
public ContentMatchOperation Operation { get; set; }
|
public PropertyContent(PropertyIdentifier property, uint options, object content) : base(property)
|
||||||
public ContentMatchModifiers Modifiers { get; set; }
|
|
||||||
public object Content { get; set; }
|
|
||||||
|
|
||||||
public PropertyContent(PropertyIdentifier property, ContentMatchOperation operation, ContentMatchModifiers modifiers, object content) : base(property)
|
|
||||||
{
|
{
|
||||||
this.Operation = operation;
|
// TODO
|
||||||
this.Modifiers = modifiers;
|
|
||||||
this.Content = content;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Encode(ISearchEncoder encoder)
|
public override void Encode(ISearchEncoder encoder)
|
||||||
@ -337,20 +260,11 @@ namespace Acacia
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum BitMaskOperation
|
|
||||||
{
|
|
||||||
EQZ, NEZ
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PropertyBitMask : PropertyQuery
|
public class PropertyBitMask : PropertyQuery
|
||||||
{
|
{
|
||||||
public BitMaskOperation Operation { get; set; }
|
public PropertyBitMask(PropertyIdentifier property, bool wantZero, uint mask) : base(property)
|
||||||
public uint Mask { get; set; }
|
|
||||||
|
|
||||||
public PropertyBitMask(PropertyIdentifier property, BitMaskOperation operation, uint mask) : base(property)
|
|
||||||
{
|
{
|
||||||
this.Operation = operation;
|
// TODO
|
||||||
this.Mask = mask;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Encode(ISearchEncoder encoder)
|
public override void Encode(ISearchEncoder encoder)
|
||||||
|
Loading…
Reference in New Issue
Block a user