diff --git a/Samples/Workspace SDK/ImageExtractorSample/SampleImageExtractor.cs b/Samples/Workspace SDK/ImageExtractorSample/SampleImageExtractor.cs index 9f053b1..809f5da 100644 --- a/Samples/Workspace SDK/ImageExtractorSample/SampleImageExtractor.cs +++ b/Samples/Workspace SDK/ImageExtractorSample/SampleImageExtractor.cs @@ -3,11 +3,11 @@ namespace Genetec.Dap.CodeSamples; +using Microsoft.Win32; +using Sdk.Workspace.Components.ImageExtractor; using System; using System.Windows.Media; using System.Windows.Media.Imaging; -using Microsoft.Win32; -using Sdk.Workspace.Components.ImageExtractor; public sealed class SampleImageExtractor : ImageExtractor { @@ -17,16 +17,18 @@ public sealed class SampleImageExtractor : ImageExtractor public override Guid UniqueId { get; } = new Guid("5EDBB0B6-8253-433E-99A1-9021E498437A"); - public override ImageSource GetImage() { - var openFileDialog = new OpenFileDialog + var dialog = new OpenFileDialog { Filter = "vCard files (*.vcf)|*.vcf|All files (*.*)|*.*", - Title = "Open vCard File" + Title = "Select vCard File" }; - return openFileDialog.ShowDialog() == true ? VCardReader.ReadVCard(openFileDialog.FileName)?.Picture : null; + if (dialog.ShowDialog() != true) + return null; + + return VCardReader.ReadVCard(dialog.FileName)?.Picture; } public override bool SupportsContext(ImageExtractorContext context) diff --git a/Samples/Workspace SDK/ImageExtractorSample/SampleModule.cs b/Samples/Workspace SDK/ImageExtractorSample/SampleModule.cs index f1f48d8..d443c47 100644 --- a/Samples/Workspace SDK/ImageExtractorSample/SampleModule.cs +++ b/Samples/Workspace SDK/ImageExtractorSample/SampleModule.cs @@ -7,16 +7,23 @@ namespace Genetec.Dap.CodeSamples; public class SampleModule : Module { + private SampleImageExtractor m_imageExtractor; + static SampleModule() => AssemblyResolver.Initialize(); public override void Load() { - var component = new SampleImageExtractor(); - component.Initialize(Workspace); - Workspace.Components.Register(component); + m_imageExtractor = new SampleImageExtractor(); + m_imageExtractor.Initialize(Workspace); + Workspace.Components.Register(m_imageExtractor); } public override void Unload() { + if (m_imageExtractor != null) + { + Workspace.Components.Unregister(m_imageExtractor); + m_imageExtractor = null; + } } } \ No newline at end of file diff --git a/Samples/Workspace SDK/ImageExtractorSample/VCardReader.cs b/Samples/Workspace SDK/ImageExtractorSample/VCardReader.cs index 8209c34..da0b15c 100644 --- a/Samples/Workspace SDK/ImageExtractorSample/VCardReader.cs +++ b/Samples/Workspace SDK/ImageExtractorSample/VCardReader.cs @@ -16,10 +16,17 @@ public class VCardReader public static VCard ReadVCard(string filePath) { string vCardText = File.ReadAllText(filePath); + + // N: field format is LastName;FirstName;MiddleName;Prefix;Suffix + string nameField = ExtractField(vCardText, "N:"); + string[] nameParts = string.IsNullOrEmpty(nameField) + ? Array.Empty() + : nameField.Split(';'); + var vcard = new VCard { - FirstName = ExtractField(vCardText, "FN:"), - LastName = ExtractField(vCardText, "N:").Split(';')[0], // Assuming last name is the first component in the N: field + LastName = nameParts.Length > 0 ? nameParts[0] : string.Empty, + FirstName = nameParts.Length > 1 ? nameParts[1] : string.Empty, Note = ExtractField(vCardText, "NOTE:"), Picture = ExtractPhoto(vCardText) }; @@ -42,12 +49,25 @@ private static List ExtractEmails(string vCardText) private static ImageSource ExtractPhoto(string vCardText) { - Match photoMatch = Regex.Match(vCardText, @"PHOTO;ENCODING=b;TYPE=image/jpeg:(.*?)(\n(?![ \t])|\r\n(?![ \t])|$)", RegexOptions.Singleline); + // Match various vCard photo formats: + // PHOTO;ENCODING=b;TYPE=image/jpeg: + // PHOTO;ENCODING=BASE64;TYPE=JPEG: + // PHOTO;TYPE=JPEG;ENCODING=b: + // PHOTO;ENCODING=b;TYPE=image/png: + var photoMatch = Regex.Match(vCardText, + @"PHOTO;[^:]*(?:ENCODING=(?:b|BASE64))[^:]*:(.*?)(\n(?![ \t])|\r\n(?![ \t])|$)", + RegexOptions.Singleline | RegexOptions.IgnoreCase); + if (photoMatch.Success) { - string base64Data = photoMatch.Groups[1].Value.Trim().Replace("\n", "").Replace("\r", ""); + string base64Data = photoMatch.Groups[1].Value + .Trim() + .Replace("\n", "") + .Replace("\r", ""); + + byte[] imageBytes = Convert.FromBase64String(base64Data); - using var stream = new MemoryStream(Convert.FromBase64String(base64Data)); + using var stream = new MemoryStream(imageBytes); var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.StreamSource = stream;