dictionary done
This commit is contained in:
@@ -120,6 +120,8 @@
|
||||
<Compile Include="Pages\TimeTable\TimeTableDay.xaml.cs">
|
||||
<DependentUpon>TimeTableDay.xaml</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Utility\ICSObject.cs" />
|
||||
<Compile Include="Utility\ICSObjectConst.cs" />
|
||||
<Compile Include="Utility\NDEF\NDEFMessage.cs" />
|
||||
<Compile Include="Utility\NDEF\NDEFRecord.cs" />
|
||||
<Compile Include="Utility\NDEF\NDEFShortRecord.cs" />
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace CampusAppWP8.Model.TimeTable
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Windows.Shapes;
|
||||
using System.Xml.Serialization;
|
||||
using CampusAppWP8.Utility;
|
||||
|
||||
/// <summary>
|
||||
/// Model for appointments.
|
||||
@@ -23,31 +24,17 @@ namespace CampusAppWP8.Model.TimeTable
|
||||
/// <summary>The Visual object.</summary>
|
||||
private Rectangle rect = null;
|
||||
|
||||
private IcsVEvent data;
|
||||
|
||||
private struct IcsVEvent
|
||||
{
|
||||
public DateTime created;
|
||||
public string uid;
|
||||
public DateTime lastModified;
|
||||
public DateTime stamp;
|
||||
public string summary;
|
||||
public DateTime start;
|
||||
public DateTime end;
|
||||
public string accessClass;
|
||||
public string location;
|
||||
public string description;
|
||||
public string categories;
|
||||
}
|
||||
private ICSObject icsObj;
|
||||
|
||||
/// <summary>Initializes a new instance of the <see cref="AppointmentModel" /> class. </summary>
|
||||
public AppointmentModel()
|
||||
{
|
||||
this.icsObj = new ICSObject();
|
||||
}
|
||||
|
||||
public AppointmentModel(string icsData) : this()
|
||||
{
|
||||
this.ImportFromICS(icsData);
|
||||
this.icsObj.ImportFromICS(icsData);
|
||||
}
|
||||
|
||||
public Rectangle GetRectangle()
|
||||
@@ -55,97 +42,9 @@ namespace CampusAppWP8.Model.TimeTable
|
||||
return this.rect;
|
||||
}
|
||||
|
||||
public void ImportFromICS(string icsData)
|
||||
{
|
||||
string[] elems = Regex.Split(icsData, "\r\n");
|
||||
|
||||
foreach (string e in elems)
|
||||
{
|
||||
string[] parts = e.Split(':');
|
||||
|
||||
if (parts.Length != 2)
|
||||
{
|
||||
throw new NotImplementedException("error in ics string");
|
||||
}
|
||||
|
||||
if (parts[0].Contains(";"))
|
||||
{
|
||||
parts[0] = parts[0].Split(';')[0];
|
||||
}
|
||||
|
||||
switch (parts[0])
|
||||
{
|
||||
case "BEGIN":
|
||||
break;
|
||||
case "CREATED":
|
||||
this.data.created = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "UID":
|
||||
this.data.uid = parts[1];
|
||||
break;
|
||||
case "LAST-MODIFIED":
|
||||
this.data.lastModified = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "DTSTAMP":
|
||||
this.data.stamp = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "SUMMARY":
|
||||
this.data.summary = parts[1];
|
||||
break;
|
||||
case "DTSTART":
|
||||
this.data.start = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "DTEND":
|
||||
this.data.end = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "CLASS":
|
||||
this.data.accessClass = parts[1];
|
||||
break;
|
||||
case "LOCATION":
|
||||
this.data.location = parts[1];
|
||||
break;
|
||||
case "DESCRIPTION":
|
||||
this.data.description = parts[1];
|
||||
break;
|
||||
case "CATEGORIES":
|
||||
this.data.categories = parts[1];
|
||||
break;
|
||||
case "END":
|
||||
break;
|
||||
case "VERSION":
|
||||
break;
|
||||
case "PRODID":
|
||||
break;
|
||||
case "X-WR-CALNAME":
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new NotImplementedException("unknown tag in ics: " + parts[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string ExportToICS()
|
||||
{
|
||||
string retValue = string.Empty;
|
||||
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
private void CreateRect()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private DateTime ParseUTC(string datetime)
|
||||
{
|
||||
datetime = datetime.Insert(4, "-");
|
||||
datetime = datetime.Insert(7, "-");
|
||||
datetime = datetime.Insert(13, ":");
|
||||
datetime = datetime.Insert(16, ":");
|
||||
|
||||
return DateTime.Parse(datetime);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace CampusAppWP8.Pages.TimeTable
|
||||
public TimeTableDay()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.testMod = new AppointmentModel("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ownCloud Calendar 0.6.3\r\nX-WR-CALNAME:MyTestAppointment\r\nBEGIN:VEVENT\r\nCREATED;VALUE=DATE-TIME:20130826T142318Z\r\nUID:617332baab\r\nLAST-MODIFIED;VALUE=DATE-TIME:20130826T142318Z\r\nDTSTAMP;VALUE=DATE-TIME:20130826T142318Z\r\nSUMMARY:MyTestAppointment\r\nDTSTART;VALUE=DATE-TIME:20130730T130000Z\r\nDTEND;VALUE=DATE-TIME:20130730T133000Z\r\nCLASS:PUBLIC\r\nLOCATION:BTU Campus\r\nDESCRIPTION:bla\r\nCATEGORIES:Arbeit\r\nEND:VEVENT\r\nEND:VCALENDAR");
|
||||
this.testMod = new AppointmentModel("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:ownCloud Calendar 0.6.3\r\nX-WR-CALNAME:Das is der Titel\r\nBEGIN:VEVENT\r\nCREATED;VALUE=DATE-TIME:20130827T113216Z\r\nUID:c9904ea73c\r\nLAST-MODIFIED;VALUE=DATE-TIME:20130827T113216Z\r\nDTSTAMP;VALUE=DATE-TIME:20130827T113216Z\r\nSUMMARY:Das is der Titel\r\nDTSTART;VALUE=DATE:20130828\r\nDTEND;VALUE=DATE:20130829\r\nCLASS:PUBLIC\r\nLOCATION:BTU Campus\r\nDESCRIPTION:For Outlook 2003, the behavior is peculiar. It can save the sa\r\n me calendar entry in both .ics and .vcs format, but it only read & displa\r\n y .vcs file correctly. It can read .ics file but it omits some fields and \r\n does not display it in calendar mode. My guess is that back then Microsoft\r\n wanted to provide .ics to be compatible with Mac's iCal but not quite com\r\n mitted to v2.0 yet.\r\nCATEGORIES:Projekte\r\nEND:VEVENT\r\nEND:VCALENDAR");
|
||||
}
|
||||
}
|
||||
}
|
||||
249
CampusAppWP8/CampusAppWP8/Utility/ICSObject.cs
Normal file
249
CampusAppWP8/CampusAppWP8/Utility/ICSObject.cs
Normal file
@@ -0,0 +1,249 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// <copyright file="ICSObject.cs" company="BTU/IIT">
|
||||
// Company copyright tag.
|
||||
// </copyright>
|
||||
// <author>fiedlchr</author>
|
||||
// <sience>27.08.2013</sience>
|
||||
//-----------------------------------------------------------------------------
|
||||
namespace CampusAppWP8.Utility
|
||||
{
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Shapes;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
/// <summary>Ics object. </summary>
|
||||
public class ICSObject
|
||||
{
|
||||
private VCalendar data;
|
||||
|
||||
private struct VCalendar
|
||||
{
|
||||
public string version;
|
||||
public VEvent vevent;
|
||||
}
|
||||
|
||||
private struct VEvent
|
||||
{
|
||||
public DateTime created;
|
||||
public string uid;
|
||||
public DateTime lastModified;
|
||||
public DateTime stamp;
|
||||
public string summary;
|
||||
public DateTime start;
|
||||
public DateTime end;
|
||||
public string accessClass;
|
||||
public string location;
|
||||
public string description;
|
||||
public string categories;
|
||||
}
|
||||
|
||||
private struct ContentLine
|
||||
{
|
||||
public string name;
|
||||
public List<string> paramList;
|
||||
public List<string> valueList;
|
||||
}
|
||||
|
||||
/// <summary>Default constructor. </summary>
|
||||
/// <remarks>Fiedler, 27.08.2013. </remarks>
|
||||
public ICSObject()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ICSObject(string icsData) : this()
|
||||
{
|
||||
this.ImportFromICS(icsData);
|
||||
}
|
||||
|
||||
public void ImportFromICS(string icsData)
|
||||
{
|
||||
string[] elems = Regex.Split(this.Unfold(icsData), "\r\n");
|
||||
|
||||
ICSDict.ICSValueDesc tempRoot = ICSDict.Root;
|
||||
|
||||
foreach (string e in elems)
|
||||
{
|
||||
ContentLine obj = this.ToContentLine(e);
|
||||
ICSDict.ICSElemDesc tempElem = null;
|
||||
|
||||
if ((tempElem = tempRoot.GetValue(obj.name)) != null)
|
||||
{
|
||||
ICSDict.ICSValueDesc va = null;
|
||||
|
||||
if (obj.name.Equals(ICSTag.BEGIN))
|
||||
{
|
||||
if ((va = tempElem.GetValue(obj.valueList[0])) != null)
|
||||
{
|
||||
tempRoot = va;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotSupportedException("unsupported BEGIN value (" + obj.valueList[0] + ")");
|
||||
}
|
||||
}
|
||||
else if (obj.name.Equals(ICSTag.END))
|
||||
{
|
||||
if ((va = tempElem.GetValue(obj.valueList[0])) != null)
|
||||
{
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotSupportedException("unsupported END value (" + obj.valueList[0] + ")");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (obj.name.IndexOf("X-") == 0)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotSupportedException("Tag (" + obj.name + ") was not found in (" + tempRoot.Name + ")");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
switch (obj.name)
|
||||
{
|
||||
case ICSTag.BEGIN:
|
||||
break;
|
||||
case ICSTag.DT_CREATED:
|
||||
//this.data.vevent.created = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case ICSTag.USER_ID:
|
||||
//this.data.vevent.uid = parts[1];
|
||||
break;
|
||||
case "LAST-MODIFIED":
|
||||
//this.data.vevent.lastModified = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "DTSTAMP":
|
||||
//this.data.vevent.stamp = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "SUMMARY":
|
||||
//this.data.vevent.summary = parts[1];
|
||||
break;
|
||||
case "DTSTART":
|
||||
//this.data.vevent.start = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "DTEND":
|
||||
//this.data.vevent.end = this.ParseUTC(parts[1]);
|
||||
break;
|
||||
case "CLASS":
|
||||
//this.data.vevent.accessClass = parts[1];
|
||||
break;
|
||||
case "LOCATION":
|
||||
//this.data.vevent.location = parts[1];
|
||||
break;
|
||||
case "DESCRIPTION":
|
||||
//this.data.vevent.description = parts[1];
|
||||
break;
|
||||
case "CATEGORIES":
|
||||
//this.data.vevent.categories = parts[1];
|
||||
break;
|
||||
case "END":
|
||||
break;
|
||||
case "VERSION":
|
||||
//this.data.version = parts[1];
|
||||
break;
|
||||
case "PRODID":
|
||||
break;
|
||||
case "X-WR-CALNAME":
|
||||
break;
|
||||
|
||||
//default:
|
||||
// throw new NotImplementedException("unknown tag in ics: " + parts[0]);
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
public string ExportToICS()
|
||||
{
|
||||
string retValue = string.Empty;
|
||||
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
// TOOLS
|
||||
|
||||
private DateTime ParseUTCDateTime(string datetime)
|
||||
{
|
||||
// see http://tools.ietf.org/html/rfc5545 3.3.5.
|
||||
|
||||
datetime = datetime.Insert(4, "-");
|
||||
datetime = datetime.Insert(7, "-");
|
||||
datetime = datetime.Insert(13, ":");
|
||||
datetime = datetime.Insert(16, ":");
|
||||
|
||||
return DateTime.Parse(datetime);
|
||||
}
|
||||
|
||||
private DateTime ParseUTCDate(string date)
|
||||
{
|
||||
date = date.Insert(4, "-");
|
||||
date = date.Insert(7, "-");
|
||||
|
||||
return DateTime.Parse(date);
|
||||
}
|
||||
|
||||
private string Unfold(string icsData)
|
||||
{
|
||||
return icsData.Replace("\r\n ", "").Replace("\r\n\x09", "");
|
||||
}
|
||||
|
||||
/// <summary>Converts an icsLine to a content line.</summary>
|
||||
/// <remarks>Fiedler, 27.08.2013. </remarks>
|
||||
/// <exception cref="NotImplementedException">Thrown when the requested operation is unimplemented.</exception>
|
||||
/// <param name="icsLine">The ics line.</param>
|
||||
/// <returns>icsLine as a ContentLine. </returns>
|
||||
private ContentLine ToContentLine(string icsLine)
|
||||
{
|
||||
ContentLine retValue;
|
||||
|
||||
string[] valueSplit = icsLine.Split(':');
|
||||
|
||||
if (valueSplit.Length != 2)
|
||||
{
|
||||
throw new NotImplementedException("ics string has no value");
|
||||
}
|
||||
|
||||
// values
|
||||
retValue.valueList = new List<string>();
|
||||
retValue.valueList.AddRange(valueSplit[1].Split(','));
|
||||
|
||||
// params
|
||||
int paramNum = StringManager.CountChar(valueSplit[0], ';');
|
||||
|
||||
if (paramNum > 0)
|
||||
{
|
||||
retValue.paramList = new List<string>();
|
||||
|
||||
string[] paramSplit = valueSplit[0].Split(';');
|
||||
|
||||
retValue.name = paramSplit[0].ToUpper();
|
||||
|
||||
for (int i = 1; i < paramSplit.Length; i++)
|
||||
{
|
||||
retValue.paramList.Add(paramSplit[i].ToUpper());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
retValue.paramList = null;
|
||||
retValue.name = valueSplit[0].ToUpper();
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
653
CampusAppWP8/CampusAppWP8/Utility/ICSObjectConst.cs
Normal file
653
CampusAppWP8/CampusAppWP8/Utility/ICSObjectConst.cs
Normal file
@@ -0,0 +1,653 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// <copyright file="ICSObjectConst.cs" company="BTU/IIT">
|
||||
// Company copyright tag.
|
||||
// </copyright>
|
||||
// <author>fiedlchr</author>
|
||||
// <sience>27.08.2013</sience>
|
||||
//-----------------------------------------------------------------------------
|
||||
namespace CampusAppWP8.Utility
|
||||
{
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class ICSDict
|
||||
{
|
||||
public class ICSDesc
|
||||
{
|
||||
private string name = string.Empty;
|
||||
|
||||
public ICSDesc()
|
||||
{
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.name;
|
||||
}
|
||||
protected set
|
||||
{
|
||||
this.name = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Is(string tag)
|
||||
{
|
||||
return this.name.Equals(tag);
|
||||
}
|
||||
}
|
||||
|
||||
public class ICSParamDesc : ICSDesc
|
||||
{
|
||||
private List<string> types = null;
|
||||
|
||||
public ICSParamDesc(string name, string[] typeList) : base()
|
||||
{
|
||||
this.Name = name;
|
||||
|
||||
if((typeList != null) && (typeList.Length > 0))
|
||||
{
|
||||
this.types = new List<string>();
|
||||
this.types.AddRange(types);
|
||||
}
|
||||
}
|
||||
|
||||
public List<string> List
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.types;
|
||||
}
|
||||
private set
|
||||
{
|
||||
this.types = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasList()
|
||||
{
|
||||
return ((this.types != null) && (this.types.Count > 0));
|
||||
}
|
||||
}
|
||||
|
||||
public class ICSValueDesc : ICSDesc
|
||||
{
|
||||
private List<ICSElemDesc> subs = null;
|
||||
|
||||
public ICSValueDesc(string name, ICSElemDesc[] elemList) : base()
|
||||
{
|
||||
this.Name = name;
|
||||
|
||||
if((elemList != null) && (elemList.Length > 0))
|
||||
{
|
||||
this.subs = new List<ICSElemDesc>();
|
||||
this.subs.AddRange(elemList);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ICSElemDesc> List
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.subs;
|
||||
}
|
||||
private set
|
||||
{
|
||||
this.subs = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasList()
|
||||
{
|
||||
return ((this.subs != null) && (this.subs.Count > 0));
|
||||
}
|
||||
|
||||
public bool IsInList(string tagName)
|
||||
{
|
||||
bool retValue = false;
|
||||
|
||||
if (this.HasList() == true)
|
||||
{
|
||||
foreach (ICSElemDesc e in this.subs)
|
||||
{
|
||||
if (e.Is(tagName) == true)
|
||||
{
|
||||
retValue = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
public ICSElemDesc GetValue(string tagName)
|
||||
{
|
||||
ICSElemDesc retValue = null;
|
||||
|
||||
if (this.HasList() == true)
|
||||
{
|
||||
foreach (ICSElemDesc e in this.subs)
|
||||
{
|
||||
if (e.Is(tagName) == true)
|
||||
{
|
||||
retValue = e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class ICSElemDesc : ICSDesc
|
||||
{
|
||||
private List<ICSParamDesc> param = null;
|
||||
private List<ICSValueDesc> value = null;
|
||||
|
||||
public ICSElemDesc(string name, ICSParamDesc[] paramList, ICSValueDesc[] valueList) : base()
|
||||
{
|
||||
this.Name = name;
|
||||
|
||||
if ((paramList != null) && (paramList.Length > 0))
|
||||
{
|
||||
this.param = new List<ICSParamDesc>();
|
||||
this.param.AddRange(paramList);
|
||||
}
|
||||
|
||||
if ((valueList != null) && (valueList.Length > 0))
|
||||
{
|
||||
this.value = new List<ICSValueDesc>();
|
||||
this.value.AddRange(valueList);
|
||||
}
|
||||
}
|
||||
|
||||
public List<ICSParamDesc> ParamList
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.param;
|
||||
}
|
||||
private set
|
||||
{
|
||||
this.param = value;
|
||||
}
|
||||
}
|
||||
|
||||
public List<ICSValueDesc> ValueList
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.value;
|
||||
}
|
||||
private set
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
public bool HasParams()
|
||||
{
|
||||
return ((this.param != null) && (this.param.Count > 0));
|
||||
}
|
||||
|
||||
public bool HasValues()
|
||||
{
|
||||
return ((this.value != null) && (this.value.Count > 0));
|
||||
}
|
||||
|
||||
public ICSValueDesc GetValue(string tagName)
|
||||
{
|
||||
ICSValueDesc retValue = null;
|
||||
|
||||
if (this.HasValues() == true)
|
||||
{
|
||||
foreach (ICSValueDesc e in this.value)
|
||||
{
|
||||
if (e.Is(tagName) == true)
|
||||
{
|
||||
retValue = e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
}
|
||||
|
||||
public static ICSValueDesc Root = new ICSValueDesc("ROOT", new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.BEGIN, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VCALENDAR, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.VERSION, null, null),
|
||||
new ICSElemDesc(ICSTag.PRODUCT_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.CAL_SCALE, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSValue.GREGORIAN, null)
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.METHOD, null, null),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VCALENDAR, null)
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.BEGIN, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VEVENT, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.DT_STAMP, null, null),
|
||||
new ICSElemDesc(ICSTag.USER_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_START, null, null),
|
||||
new ICSElemDesc(ICSTag.ACCESS_CLASS, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_CREATED, null, null),
|
||||
new ICSElemDesc(ICSTag.DESCRIPTION, null, null),
|
||||
new ICSElemDesc(ICSTag.GEO, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_MODIFIED, null, null),
|
||||
new ICSElemDesc(ICSTag.LOCATION, null, null),
|
||||
new ICSElemDesc(ICSTag.ORGANIZER, null, null),
|
||||
new ICSElemDesc(ICSTag.PRIORITY, null, null),
|
||||
new ICSElemDesc(ICSTag.SEQ, null, null),
|
||||
new ICSElemDesc(ICSTag.STATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.TITLE, null, null),
|
||||
new ICSElemDesc(ICSTag.TRANSP, null, null),
|
||||
new ICSElemDesc(ICSTag.URL, null, null),
|
||||
new ICSElemDesc(ICSTag.RECURRENCE_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.RRULE, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_END, null, null),
|
||||
new ICSElemDesc(ICSTag.DURATION, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTACHMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTENDEE, null, null),
|
||||
new ICSElemDesc(ICSTag.CATEGORIES, null, null),
|
||||
new ICSElemDesc(ICSTag.COMMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.CONTACT, null, null),
|
||||
new ICSElemDesc(ICSTag.EXDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.RSTATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.RELATED, null, null),
|
||||
new ICSElemDesc(ICSTag.RESOURCES, null, null),
|
||||
new ICSElemDesc(ICSTag.RDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.BEGIN, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VALARM, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.ACTION, null, new ICSValueDesc[] { // audio, display, email
|
||||
new ICSValueDesc(ICSValue.AUDIO, null),
|
||||
new ICSValueDesc(ICSValue.DISP, null),
|
||||
new ICSValueDesc(ICSValue.EMAIL, null)
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.TRIGGER, null, null), // audio, display, email
|
||||
new ICSElemDesc(ICSTag.DURATION, null, null), // audio, display, email
|
||||
new ICSElemDesc(ICSTag.REPEAT, null, null), // audio, display, email
|
||||
new ICSElemDesc(ICSTag.ATTACHMENT, null, null), // audio, email
|
||||
new ICSElemDesc(ICSTag.DESCRIPTION, null, null),// display, eamil
|
||||
new ICSElemDesc(ICSTag.TITLE, null, null), // email
|
||||
new ICSElemDesc(ICSTag.ATTENDEE, null, null), // email
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] { // audio, display, email
|
||||
new ICSValueDesc(ICSTag.VALARM, null)
|
||||
})
|
||||
})
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VEVENT, null)
|
||||
})
|
||||
}),
|
||||
new ICSValueDesc(ICSTag.VTODO, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.DT_STAMP, null, null),
|
||||
new ICSElemDesc(ICSTag.USER_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.ACCESS_CLASS, null, null),
|
||||
new ICSElemDesc(ICSTag.COMPLETED, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_CREATED, null, null),
|
||||
new ICSElemDesc(ICSTag.DESCRIPTION, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_START, null, null),
|
||||
new ICSElemDesc(ICSTag.GEO, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_MODIFIED, null, null),
|
||||
new ICSElemDesc(ICSTag.LOCATION, null, null),
|
||||
new ICSElemDesc(ICSTag.ORGANIZER, null, null),
|
||||
new ICSElemDesc(ICSTag.PERCENT, null, null),
|
||||
new ICSElemDesc(ICSTag.PRIORITY, null, null),
|
||||
new ICSElemDesc(ICSTag.RECURRENCE_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.SEQ, null, null),
|
||||
new ICSElemDesc(ICSTag.STATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.TITLE, null, null),
|
||||
new ICSElemDesc(ICSTag.URL, null, null),
|
||||
new ICSElemDesc(ICSTag.RRULE, null, null),
|
||||
new ICSElemDesc(ICSTag.DUE, null, null),
|
||||
new ICSElemDesc(ICSTag.DURATION, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTACHMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTENDEE, null, null),
|
||||
new ICSElemDesc(ICSTag.CATEGORIES, null, null),
|
||||
new ICSElemDesc(ICSTag.COMMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.CONTACT, null, null),
|
||||
new ICSElemDesc(ICSTag.EXDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.RSTATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.RELATED, null, null),
|
||||
new ICSElemDesc(ICSTag.RESOURCES, null, null),
|
||||
new ICSElemDesc(ICSTag.RDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.BEGIN, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VALARM, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.ACTION, null, new ICSValueDesc[] { // audio, display, email
|
||||
new ICSValueDesc(ICSValue.AUDIO, null),
|
||||
new ICSValueDesc(ICSValue.DISP, null),
|
||||
new ICSValueDesc(ICSValue.EMAIL, null)
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.TRIGGER, null, null), // audio, display, email
|
||||
new ICSElemDesc(ICSTag.DURATION, null, null), // audio, display, email
|
||||
new ICSElemDesc(ICSTag.REPEAT, null, null), // audio, display, email
|
||||
new ICSElemDesc(ICSTag.ATTACHMENT, null, null), // audio, email
|
||||
new ICSElemDesc(ICSTag.DESCRIPTION, null, null),// display, eamil
|
||||
new ICSElemDesc(ICSTag.TITLE, null, null), // email
|
||||
new ICSElemDesc(ICSTag.ATTENDEE, null, null), // email
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] { // audio, display, email
|
||||
new ICSValueDesc(ICSTag.VALARM, null)
|
||||
})
|
||||
})
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VTODO, null)
|
||||
})
|
||||
}),
|
||||
new ICSValueDesc(ICSTag.VJOURNAL, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.DT_STAMP, null, null),
|
||||
new ICSElemDesc(ICSTag.USER_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.ACCESS_CLASS, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_CREATED, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_START, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_MODIFIED, null, null),
|
||||
new ICSElemDesc(ICSTag.ORGANIZER, null, null),
|
||||
new ICSElemDesc(ICSTag.RECURRENCE_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.SEQ, null, null),
|
||||
new ICSElemDesc(ICSTag.STATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.TITLE, null, null),
|
||||
new ICSElemDesc(ICSTag.URL, null, null),
|
||||
new ICSElemDesc(ICSTag.RRULE, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTACHMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTENDEE, null, null),
|
||||
new ICSElemDesc(ICSTag.CATEGORIES, null, null),
|
||||
new ICSElemDesc(ICSTag.COMMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.CONTACT, null, null),
|
||||
new ICSElemDesc(ICSTag.DESCRIPTION, null, null),
|
||||
new ICSElemDesc(ICSTag.EXDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.RELATED, null, null),
|
||||
new ICSElemDesc(ICSTag.RDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.RSTATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VJOURNAL, null)
|
||||
})
|
||||
}),
|
||||
new ICSValueDesc(ICSTag.VFREEBUSY, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.DT_STAMP, null, null),
|
||||
new ICSElemDesc(ICSTag.USER_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.CONTACT, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_START, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_END, null, null),
|
||||
new ICSElemDesc(ICSTag.ORGANIZER, null, null),
|
||||
new ICSElemDesc(ICSTag.URL, null, null),
|
||||
new ICSElemDesc(ICSTag.ATTENDEE, null, null),
|
||||
new ICSElemDesc(ICSTag.COMMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.FREEBUSY, null, null),
|
||||
new ICSElemDesc(ICSTag.RSTATUS, null, null),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VFREEBUSY, null)
|
||||
})
|
||||
}),
|
||||
new ICSValueDesc(ICSTag.VTIMEZONE, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_ID, null, null),
|
||||
new ICSElemDesc(ICSTag.DT_MODIFIED, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_URL, null, null),
|
||||
new ICSElemDesc(ICSTag.BEGIN, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.STANDARD, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.DT_START, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_OFFSET_TO, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_OFFSET_FROM, null, null),
|
||||
new ICSElemDesc(ICSTag.RRULE, null, null),
|
||||
new ICSElemDesc(ICSTag.COMMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.RDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_NAME, null, null),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.STANDARD, null)
|
||||
})
|
||||
}),
|
||||
new ICSValueDesc(ICSTag.DAYLIGHT, new ICSElemDesc[] {
|
||||
new ICSElemDesc(ICSTag.DT_START, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_OFFSET_TO, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_OFFSET_FROM, null, null),
|
||||
new ICSElemDesc(ICSTag.RRULE, null, null),
|
||||
new ICSElemDesc(ICSTag.COMMENT, null, null),
|
||||
new ICSElemDesc(ICSTag.RDATE, null, null),
|
||||
new ICSElemDesc(ICSTag.TIME_ZONE_NAME, null, null),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.STANDARD, null)
|
||||
})
|
||||
})
|
||||
}),
|
||||
new ICSElemDesc(ICSTag.END, null, new ICSValueDesc[] {
|
||||
new ICSValueDesc(ICSTag.VTIMEZONE, null)
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
public class ICSTag
|
||||
{
|
||||
|
||||
public const string BEGIN = "BEGIN";
|
||||
public const string END = "END";
|
||||
|
||||
// Calendar Components
|
||||
public const string VCALENDAR = "VCALENDAR";
|
||||
// 1-*
|
||||
public const string VERSION = "VERSION";
|
||||
public const string PRODUCT_ID = "PRODID";
|
||||
// 0-1
|
||||
public const string CAL_SCALE = "CALSCALE";
|
||||
public const string METHOD = "METHOD";
|
||||
// 0-*
|
||||
public const string X_WR_CALNAME = "X-WR-CALNAME";
|
||||
|
||||
// Event Component
|
||||
public const string VEVENT = "VEVENT";
|
||||
// 1-1
|
||||
public const string DT_STAMP = "DTSTAMP";
|
||||
public const string USER_ID = "UID";
|
||||
// if METHOD is NOT set: 1-1
|
||||
// otherwise: 0-1
|
||||
public const string DT_START = "DTSTART";
|
||||
// 0-1
|
||||
public const string ACCESS_CLASS = "CLASS";
|
||||
public const string DT_CREATED = "CREATED";
|
||||
public const string DESCRIPTION = "DESCRIPTION";
|
||||
public const string GEO = "GEO";
|
||||
public const string DT_MODIFIED = "LAST-MODIFIED";
|
||||
public const string LOCATION = "LOCATION";
|
||||
public const string ORGANIZER = "ORGANIZER";
|
||||
public const string PRIORITY = "PRIORITY";
|
||||
public const string SEQ = "SEQ";
|
||||
public const string STATUS = "STATUS";
|
||||
public const string TITLE = "SUMMARY";
|
||||
public const string TRANSP = "TRANSP";
|
||||
public const string URL = "URL";
|
||||
public const string RECURRENCE_ID = "RECURID"; // "RECURRENCE-ID"; ???
|
||||
public const string RRULE = "RRULE";
|
||||
// one of them can (0-1), but NOT both
|
||||
public const string DT_END = "DTEND";
|
||||
public const string DURATION = "DURATION";
|
||||
// 0-*
|
||||
public const string ATTACHMENT = "ATTACH";
|
||||
public const string ATTENDEE = "ATTENDEE";
|
||||
public const string CATEGORIES = "CATEGORIES";
|
||||
public const string COMMENT = "COMMENT";
|
||||
public const string CONTACT = "CONTACT";
|
||||
public const string EXDATE = "EXDATE";
|
||||
public const string RSTATUS = "RSTATUS";
|
||||
public const string RELATED = "RELATED";
|
||||
public const string RESOURCES = "RESOURCES";
|
||||
public const string RDATE = "RDATE";
|
||||
|
||||
// To-Do Component
|
||||
public const string VTODO = "VTODO";
|
||||
public const string COMPLETED = "COMPLETED";
|
||||
public const string PERCENT = "PERCENT";
|
||||
public const string DUE = "DUE";
|
||||
// Journal Component
|
||||
public const string VJOURNAL = "VJOURNAL";
|
||||
|
||||
// Free/Busy Component
|
||||
public const string VFREEBUSY = "VFREEBUSY";
|
||||
// 0-*
|
||||
public const string FREEBUSY = "FREEBUSY";
|
||||
|
||||
// Time Zone Component
|
||||
public const string VTIMEZONE = "VTIMEZONE";
|
||||
// 1-1
|
||||
public const string TIME_ZONE_ID = "TZID";
|
||||
// 0-1
|
||||
// DT_MODIFIED
|
||||
public const string TIME_ZONE_URL = "TZURL";
|
||||
// one of both MUST occure: 1-*
|
||||
|
||||
// Time Zone: Standardc/Daylightc
|
||||
public const string STANDARD = "STANDARD";
|
||||
public const string DAYLIGHT = "DAYLIGHT";
|
||||
// 1-1
|
||||
// DT_START
|
||||
public const string TIME_ZONE_OFFSET_TO = "TZOFFSETTO";
|
||||
public const string TIME_ZONE_OFFSET_FROM = "TZOFFSETFROM";
|
||||
// 0-1
|
||||
// RRULE
|
||||
// 0-*
|
||||
// COMMENT
|
||||
// RDATE
|
||||
public const string TIME_ZONE_NAME = "TZNAME";
|
||||
|
||||
// Alarm Component
|
||||
public const string VALARM = "VALARM";
|
||||
// Alarm by audio
|
||||
// 1-1
|
||||
public const string TRIGGER = "TRIGGER";
|
||||
public const string ACTION = "ACTION"; // (AUDIO)
|
||||
// 0-1 , when one occure so MUST the other
|
||||
// DURATION
|
||||
public const string REPEAT = "REPEAT";
|
||||
// 0-1
|
||||
// ATTACHMENT
|
||||
// Alarm by disp
|
||||
// 1-1
|
||||
// ACTION (DISPLAY)
|
||||
// DESCRIPTION
|
||||
// TRIGGER
|
||||
// 0-1, when one occure so MUST the other
|
||||
// DURATION
|
||||
// REPEAT
|
||||
// Alarm by email
|
||||
// 1-1
|
||||
// ACTION (EMAIL)
|
||||
// DESCRIPTION
|
||||
// TRIGGER
|
||||
// SUMMARY
|
||||
// 1-*
|
||||
// ATTENDEE
|
||||
// 0-1, when one occure so MUST the other
|
||||
// DURATION
|
||||
// REPEAT
|
||||
// 0-*
|
||||
// ATTACH
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// ???
|
||||
|
||||
// public const string RELATED_TO = "RELATED-TO";
|
||||
|
||||
}
|
||||
|
||||
public class ICSParam
|
||||
{
|
||||
// see http://tools.ietf.org/html/rfc5545 3.2.
|
||||
|
||||
public const string ALT_REPRESENTATION = "ALTREP";
|
||||
public const string COMMON_NAME = "CN";
|
||||
public const string CALENDAR_USER_TYPE = "CUTYPE";
|
||||
public const string DELEGATORS = "DELEGATED-FROM";
|
||||
public const string DELEGATEES = "DELEGATED-TO";
|
||||
public const string DIR_REFERENCE = "DIR";
|
||||
public const string ENCODING = "ENCODING";
|
||||
public const string FORMAT_TYPE = "FMTTYPE";
|
||||
public const string FREE_BUSY_TIME_TYPE = "FBTYPE";
|
||||
public const string LANGUAGE = "LANGUAGE";
|
||||
public const string MEMBER = "MEMBER";
|
||||
public const string PARTICIPATION_STATUS = "PARTSTAT";
|
||||
public const string RECUR_ID_RANGE = "RANGE";
|
||||
public const string ALARM_TRIGGER_RELATIONSHIP = "RELATED";
|
||||
public const string RELATIONSHIP_TYPE = "RELTYPE";
|
||||
public const string PARTICIPATION_ROLE = "ROLE";
|
||||
public const string REPLY_EXPECTATION = "RSVP";
|
||||
public const string SENT_BY = "SENT-BY";
|
||||
public const string TIME_ZONE_ID = "TZID";
|
||||
public const string VALUE_TYPE = "VALUE";
|
||||
}
|
||||
|
||||
public class ICSValue
|
||||
{
|
||||
// CAL_SCALE (see 3.7.1.)
|
||||
public const string GREGORIAN = "GREGORIAN";
|
||||
// VALARM.ACTION
|
||||
public const string AUDIO = "AUDIO";
|
||||
public const string DISP = "DISPLAY";
|
||||
public const string EMAIL = "EMAIL";
|
||||
}
|
||||
|
||||
public class ICSParamValue
|
||||
{
|
||||
// CALENDAR_USER_TYPE
|
||||
public const string INDIVIDUAL = "INDIVIDUAL"; // default
|
||||
public const string GROUP = "GROUP";
|
||||
public const string RESOURCE = "RESOURCE";
|
||||
public const string ROOM = "ROOM";
|
||||
public const string UNKNOWN = "UNKNOWN";
|
||||
// ENCODING
|
||||
public const string BIT8 = "8BIT"; // default
|
||||
public const string BASE64 = "BASE64";
|
||||
// FREE_BUSY_TIME_TYPE
|
||||
public const string FREE = "FREE";
|
||||
public const string BUSY = "BUSY";
|
||||
public const string BUSY_UNAVAILABLE = "BUSY-UNAVAILABLE";
|
||||
public const string BUSY_TENTATIVE = "BUSY-TENTATIVE";
|
||||
// PARTICIPATION_STATUS
|
||||
public const string NEEDS_ACTION = "NEEDS_ACTION"; // default
|
||||
public const string ACCEPTED = "ACCEPTED";
|
||||
public const string DECLINED = "DECLINED";
|
||||
public const string TENTATIVE = "TENTATIVE";
|
||||
public const string DELEGATED = "DELEGATED";
|
||||
public const string COMPLETED = "COMPLETED";
|
||||
// RECUR_ID_RANGE
|
||||
public const string THIS_AND_FUTURE = "THISANDFUTURE";
|
||||
public const string THIS_AND_PRIOR = "THISANDPRIOR";
|
||||
// ALARM_TRIGGER_RELATIONSHIP
|
||||
public const string START = "START";
|
||||
public const string END = "END";
|
||||
// RELATIONSHIP_TYPE
|
||||
public const string PARENT = "PARENT"; // default
|
||||
public const string CHILD = "CHILD";
|
||||
public const string SIBLING = "SIBLING";
|
||||
// PARTICIPATION_ROLE
|
||||
public const string CHAIR = "CHAIR";
|
||||
public const string REQ_PARTICIPANT = "REQ-PARTICIPANT"; //default
|
||||
public const string OPT_PARTICIPANT = "OPT-PARTICIPANT";
|
||||
public const string NON_PARTICIPANT = "NON-PARTICIPANT";
|
||||
// REPLY_EXPECTATION
|
||||
public const string TRUE = "TRUE";
|
||||
public const string FALSE = "FALSE"; // default
|
||||
// VALUE_TYPE (see http://tools.ietf.org/html/rfc5545 3.3.)
|
||||
public const string BINARY = "BINARY";
|
||||
public const string BOOLEAN = "BOOLEAN";
|
||||
public const string CAL_ADDRESS = "CAL-ADDRESS";
|
||||
public const string DATE = "DATE";
|
||||
public const string DATE_TIME = "DATE-TIME";
|
||||
public const string DURATION = "DURATION";
|
||||
public const string FLOAT = "FLOAT";
|
||||
public const string INTEGER = "INTEGER";
|
||||
public const string PERIOD = "PERIOD";
|
||||
public const string RECUR = "RECUR";
|
||||
public const string TEXT = "TEXT";
|
||||
public const string TIME = "TIME";
|
||||
public const string URI = "URI";
|
||||
public const string UTC_OFFSET = "UTC-OFFSET";
|
||||
}
|
||||
}
|
||||
@@ -54,6 +54,27 @@ namespace CampusAppWP8.Utility
|
||||
{
|
||||
return str.TrimEnd('\n');
|
||||
}
|
||||
|
||||
/// <summary>Count character.</summary>
|
||||
/// <remarks>Fiedler, 27.08.2013.</remarks>
|
||||
/// <param name="str">input string.</param>
|
||||
/// <param name="c">The character.</param>
|
||||
/// <returns>The total number of the specified character in the string.</returns>
|
||||
public static int CountChar(string str, char c)
|
||||
{
|
||||
int retValue = 0;
|
||||
|
||||
for (int i = 0; i < str.Length; i++)
|
||||
{
|
||||
if (str[i].Equals(c))
|
||||
{
|
||||
retValue++;
|
||||
}
|
||||
}
|
||||
|
||||
return retValue;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user