-
Notifications
You must be signed in to change notification settings - Fork 9
/
WlanHostedNetworkWinRT.h
160 lines (127 loc) · 4.53 KB
/
WlanHostedNetworkWinRT.h
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************
#pragma once
/// App-specific exception class
class WlanHostedNetworkException : public std::exception
{
public:
WlanHostedNetworkException(const char* message)
: std::exception(message),
_hr(S_OK)
{}
WlanHostedNetworkException(const char* message, HRESULT hr)
: std::exception(message),
_hr(hr)
{}
HRESULT GetErrorCode() const
{
return _hr;
}
private:
HRESULT _hr;
};
/// Helper interface that can be notified about changes in the "soft AP"
class IWlanHostedNetworkListener
{
public:
virtual ~IWlanHostedNetworkListener() {}
virtual void OnDeviceConnected(std::wstring remoteHostName) = 0;
virtual void OnDeviceDisconnected(std::wstring deviceId) = 0;
virtual void OnAdvertisementStarted() = 0;
virtual void OnAdvertisementStopped(std::wstring message) = 0;
virtual void OnAdvertisementAborted(std::wstring message) = 0;
virtual void OnAsyncException(std::wstring message) = 0;
virtual void LogMessage(std::wstring message) = 0;
};
/// Helper interface to handle user input
class IWlanHostedNetworkPrompt
{
public:
virtual ~IWlanHostedNetworkPrompt() {};
virtual bool AcceptIncommingConnection() = 0;
};
/// Wraps code to call into the WiFiDirect WinRT APIs as a replacement for the WlanHostedNetwork* functions
/// https://msdn.microsoft.com/en-us/library/windows.devices.wifidirect.aspx
class WlanHostedNetworkHelper
{
public:
WlanHostedNetworkHelper();
~WlanHostedNetworkHelper();
/// Set SSID (optional, falls back to a Wi-FI Direct default SSID which begins with "DIRECT-")
void SetSSID(const std::wstring& ssid)
{
_ssid = ssid;
_ssidProvided = true;
}
std::wstring GetSSID() const
{
return _ssid;
}
/// Set Passphrase (optional, falls back to a random string)
void SetPassphrase(const std::wstring& passphrase)
{
_passphraseProvided = true;
_passphrase = passphrase;
}
std::wstring GetPassphrase() const
{
return _passphrase;
}
/// Register listener to receive updates (only one listener is supported)
void RegisterListener(IWlanHostedNetworkListener* listener)
{
_listener = listener;
}
/// Register user prompt to get user input
void RegisterPrompt(IWlanHostedNetworkPrompt* prompt)
{
_prompt = prompt;
}
/// Change behavior to auto-accept or ask user
void SetAutoAccept(bool autoAccept)
{
_autoAccept = autoAccept;
}
/// Start advertising
void Start();
/// Stop advertising
void Stop();
private:
/// Start connection listener
void StartListener();
/// Clear out old state
void Reset();
// WinRT helpers
/// Main class that is used to start advertisement
Microsoft::WRL::ComPtr<ABI::Windows::Devices::WiFiDirect::IWiFiDirectAdvertisementPublisher> _publisher;
/// Advertisement Settings within the publisher
Microsoft::WRL::ComPtr<ABI::Windows::Devices::WiFiDirect::IWiFiDirectAdvertisement> _advertisement;
/// Legacy settings within the advertisement settings
Microsoft::WRL::ComPtr<ABI::Windows::Devices::WiFiDirect::IWiFiDirectLegacySettings> _legacySettings;
/// Listen for incoming connections
Microsoft::WRL::ComPtr<ABI::Windows::Devices::WiFiDirect::IWiFiDirectConnectionListener> _connectionListener;
/// Keep references to all connected peers
std::map<std::wstring, Microsoft::WRL::ComPtr<ABI::Windows::Devices::WiFiDirect::IWiFiDirectDevice>> _connectedDevices;
std::map<std::wstring, EventRegistrationToken> _connectedDeviceStatusChangedTokens;
/// Used to un-register for events
EventRegistrationToken _connectionRequestedToken;
EventRegistrationToken _statusChangedToken;
// Settings for "soft AP"
bool _ssidProvided;
std::wstring _ssid;
bool _passphraseProvided;
std::wstring _passphrase;
// Listeners that can be notified of changes to the "soft AP"
IWlanHostedNetworkListener* _listener;
IWlanHostedNetworkPrompt* _prompt;
/// tracks whether we should accept incoming connections or ask the user
bool _autoAccept;
};