-
Notifications
You must be signed in to change notification settings - Fork 15
/
StartupTask.cs
93 lines (84 loc) · 3.32 KB
/
StartupTask.cs
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
using System;
using System.Diagnostics;
using Windows.ApplicationModel.Background;
using Windows.ApplicationModel.AppService;
using Windows.Foundation.Collections;
namespace ShowcaseBridgeService
{
public sealed class StartupTask : IBackgroundTask
{
private BackgroundTaskDeferral _deferral;
private AppServiceConnection _connection;
private static ValueSet _valueStorage = new ValueSet();
private delegate void ValueChangedHandler(ValueSet args);
private static ValueChangedHandler ValueChanged;
public void Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += OnTaskCanceled;
Debug.WriteLine($"ShowcaseBridgeService FamilyName: {Windows.ApplicationModel.Package.Current.Id.FamilyName}.");
if (SetupConnection(taskInstance.TriggerDetails as AppServiceTriggerDetails))
{
_deferral = taskInstance.GetDeferral();
}
}
private bool SetupConnection(AppServiceTriggerDetails triggerDetails)
{
if (triggerDetails == null)
{
Debug.WriteLine("ForegroundBridgeService started without details, exiting.");
return false;
}
if (!triggerDetails.Name.Equals("com.microsoft.showcase.appservice"))
{
Debug.WriteLine("Trigger details name doesn't match com.microsoft.showcase.bridge, exiting.");
return false;
}
Debug.WriteLine("New service connection.");
_connection = triggerDetails.AppServiceConnection;
_connection.RequestReceived += OnRequestReceived;
ValueChanged += BroadcastReceivedMessage;
return true;
}
private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
Debug.WriteLine($"Cancellation, reason: {reason}.");
ValueChanged -= BroadcastReceivedMessage;
if (_deferral != null)
{
_deferral.Complete();
}
}
private async void BroadcastReceivedMessage(ValueSet changedValues)
{
await _connection.SendMessageAsync(changedValues);
}
private async void OnRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args)
{
// Use args.GetDeferral() (and release the deferral later) if args is to be used after awaited calls
var requestedValues = new ValueSet();
var values = new ValueSet();
foreach (var element in args.Request.Message)
{
if (element.Value != null)
{
_valueStorage[element.Key] = element.Value;
values.Add(element.Key, element.Value);
}
else
{
var key = element.Key;
_valueStorage.TryGetValue(key, out object value);
requestedValues.Add(key, value);
}
}
if (values.Count != 0)
{
ValueChanged?.Invoke(values);
}
if (requestedValues.Count != 0)
{
await _connection.SendMessageAsync(requestedValues);
}
}
}
}