1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.DI;
using Tango.FSE.Common;
using Tango.FSE.Common.FileAssociation;
using Tango.FSE.Common.FSEApplication;
using Tango.FSE.Common.Threading;
using Tango.Logging;
using ZetaIpc.Runtime.Server;
namespace Tango.FSE.UI.FileAssociation
{
[TangoCreateWhenRegistered]
public class DefaultFileAssociationProvider : FSEExtendedObject, IFileAssociationProvider
{
private Dictionary<String, Action<FileAssociationPackage>> _handlers;
private IpcServer _ipcServer;
private bool _initialized;
public const string FILE_ASSOCIATION_PREFIX = "-file";
public const int FILE_ASSOCIATION_ARGS_COUNT = 3;
public bool HasStartArgsPackage { get; private set; }
[TangoInject]
private IDispatcherProvider DispatcherProvider { get; set; }
[TangoInject]
private IFSEApplicationManager ApplicationManager { get; set; }
public DefaultFileAssociationProvider()
{
_handlers = new Dictionary<string, Action<FileAssociationPackage>>();
_ipcServer = new IpcServer();
}
public void RegisterFileAssociationHandler(string targetName, Action<FileAssociationPackage> handler)
{
_handlers.Add(targetName.ToLower(), handler);
}
public async void OnApplicationReady(IFSEApplicationManager applicationManager)
{
if (_initialized) return;
_initialized = true;
try
{
LogManager.Log("Starting file association IPC service...");
_ipcServer.Start(Settings.FileAssociationServicePort);
_ipcServer.ReceivedRequest += _ipcServer_ReceivedRequest;
}
catch (Exception ex)
{
LogManager.Log(ex, "Error starting file association IPC service. Another instance of the application might already be running...");
}
var args = applicationManager.StartupArgs;
LogManager.Log("Processing file association if any...");
if (args.Count == FILE_ASSOCIATION_ARGS_COUNT)
{
if (args[0] == FILE_ASSOCIATION_PREFIX)
{
//This delay is a workaround for when the invoked handler navigates to some module.
//The navigation system does not catches the navigation request properly... :/
await Task.Delay(500);
LogManager.Log($"File association package found: '{String.Join(" ", args)}'. Invoking handler...");
try
{
String targetName = args[1].ToLower();
if (_handlers.ContainsKey(targetName))
{
var package = new FileAssociationPackage()
{
TargetName = targetName,
File = args[2]
};
_handlers[targetName].Invoke(package);
}
else
{
LogManager.Log("File association handler not found.", LogCategory.Warning);
}
}
catch (Exception ex)
{
LogManager.Log(ex, $"Error invoking file association handler for package '{String.Join(" ", args)}'.");
}
}
}
}
private void _ipcServer_ReceivedRequest(object sender, ReceivedRequestEventArgs e)
{
try
{
e.Handled = true;
LogManager.Log($"File association package received through IPC server.\n{e.Request}\nInvoking handler...");
var package = JsonConvert.DeserializeObject<FileAssociationPackage>(e.Request);
if (_handlers.ContainsKey(package.TargetName.ToLower()))
{
DispatcherProvider.Invoke(() =>
{
if (ApplicationManager.WindowState == System.Windows.WindowState.Minimized)
{
ApplicationManager.WindowState = System.Windows.WindowState.Normal;
}
ApplicationManager.ActivateMainWindow();
_handlers[package.TargetName.ToLower()].Invoke(package);
});
}
else
{
LogManager.Log($"Handler not found for target '{package.TargetName}'.", LogCategory.Warning);
}
}
catch (Exception ex)
{
LogManager.Log(ex, $"Error invoking file association handler.");
}
}
public void OnApplicationStarted(IFSEApplicationManager applicationManager)
{
HasStartArgsPackage =
applicationManager.StartupArgs.Count == FILE_ASSOCIATION_ARGS_COUNT
&&
applicationManager.StartupArgs[0] == FILE_ASSOCIATION_PREFIX;
}
}
}
|