1
0
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:
Patrick Simpson 2017-02-23 10:20:48 +01:00
parent 2f0e46f18d
commit 629bfd371b
5 changed files with 27 additions and 267 deletions

View File

@ -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)
}; };
} }

View File

@ -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)

View File

@ -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();
}
} }
} }

View File

@ -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);

View File

@ -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)