Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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)
Expand Down
13 changes: 10 additions & 3 deletions Samples/Workspace SDK/ImageExtractorSample/SampleModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
30 changes: 25 additions & 5 deletions Samples/Workspace SDK/ImageExtractorSample/VCardReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>()
: 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)
};
Expand All @@ -42,12 +49,25 @@ private static List<string> 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;
Expand Down