From d76718c2bf0edb8c3446bb735da9e538a5e0b1ca Mon Sep 17 00:00:00 2001 From: alcexhim Date: Mon, 18 May 2015 16:14:15 -0400 Subject: [PATCH] Added vCard data format (incomplete) --- .../Contact/VCard/VCardDataFormat.cs | 124 ++++++++++++++++++ ...UniversalEditor.Plugins.AddressBook.csproj | 1 + 2 files changed, 125 insertions(+) create mode 100644 CSharp/Plugins/UniversalEditor.Plugins.AddressBook/DataFormats/Contact/VCard/VCardDataFormat.cs diff --git a/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/DataFormats/Contact/VCard/VCardDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/DataFormats/Contact/VCard/VCardDataFormat.cs new file mode 100644 index 00000000..328ac5e8 --- /dev/null +++ b/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/DataFormats/Contact/VCard/VCardDataFormat.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using UniversalEditor.DataFormats.PropertyList.CoreObject; +using UniversalEditor.ObjectModels.Contact; +using UniversalEditor.ObjectModels.PropertyList; + +namespace UniversalEditor.DataFormats.Contact.VCard +{ + public class VCardDataFormat : CoreObjectDataFormat + { + private static DataFormatReference _dfr = null; + protected override DataFormatReference MakeReferenceInternal() + { + if (_dfr == null) + { + _dfr = new DataFormatReference(GetType()); + _dfr.Capabilities.Add(typeof(ContactObjectModel), DataFormatCapabilities.All); + _dfr.ContentTypes.Add("text/vcard"); + _dfr.ContentTypes.Add("text/x-vcard"); // deprecated + _dfr.ContentTypes.Add("text/directory;profile=vCard"); // deprecated + _dfr.ContentTypes.Add("text/directory"); // deprecated + _dfr.Sources.Add("https://en.wikipedia.org/wiki/VCard"); + } + return _dfr; + } + + private Version mvarFormatVersion = new Version(4, 0); + public Version FormatVersion { get { return mvarFormatVersion; } set { mvarFormatVersion = value; } } + + protected override void BeforeLoadInternal(Stack objectModels) + { + base.BeforeLoadInternal(objectModels); + objectModels.Push(new PropertyListObjectModel()); + } + protected override void AfterLoadInternal(Stack objectModels) + { + base.AfterLoadInternal(objectModels); + PropertyListObjectModel plom = (objectModels.Pop() as PropertyListObjectModel); + ContactObjectModel contact = (objectModels.Pop() as ContactObjectModel); + + Group vcard = plom.Groups["VCARD"]; + if (vcard == null) throw new InvalidDataFormatException("File does not contain a top-level VCARD group"); + + bool hasVersion = false; + + foreach (Property prop in vcard.Properties) + { + switch (prop.Name) + { + case "VERSION": + { + if (!hasVersion) + { + mvarFormatVersion = new Version(prop.Value.ToString()); + hasVersion = true; + } + break; + } + case "N": + { + ContactName name = new ContactName(); + string[] splits = prop.Value.ToString().Split(new char[] { ';' }); + if (splits.Length > 1) + { + name.FamilyName = splits[0]; + name.GivenName = splits[1]; + if (splits.Length > 2) + { + // third assuming is middle name + name.MiddleName = splits[2]; + if (splits.Length > 3) + { + // per wikipedia fourth is title + name.Title = splits[3]; + } + } + } + contact.Names.Add(name); + break; + } + case "FN": + { + // formatted name + if (contact.Names.Count > 0) + { + contact.Names[contact.Names.Count - 1].FormattedName = prop.Value.ToString(); + } + else + { + ContactName name = new ContactName(); + name.FormattedName = prop.Value.ToString(); + contact.Names.Add(name); + } + break; + } + case "ORG": + { + // organizations + break; + } + case "TITLE": + { + // organizations + break; + } + } + } + + + } + protected override void BeforeSaveInternal(Stack objectModels) + { + base.BeforeSaveInternal(objectModels); + + ContactObjectModel contact = (objectModels.Pop() as ContactObjectModel); + PropertyListObjectModel plom = new PropertyListObjectModel(); + + objectModels.Push(plom); + } + } +} diff --git a/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/UniversalEditor.Plugins.AddressBook.csproj b/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/UniversalEditor.Plugins.AddressBook.csproj index 570ab38c..650a64f6 100644 --- a/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/UniversalEditor.Plugins.AddressBook.csproj +++ b/CSharp/Plugins/UniversalEditor.Plugins.AddressBook/UniversalEditor.Plugins.AddressBook.csproj @@ -36,6 +36,7 @@ +