-
Notifications
You must be signed in to change notification settings - Fork 139
Expand file tree
/
Copy pathNetworkState.h
More file actions
108 lines (82 loc) · 3.14 KB
/
NetworkState.h
File metadata and controls
108 lines (82 loc) · 3.14 KB
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
#pragma once
#include "HTTP/httpcall.h"
#include "Platform/IHttpProvider.h"
#ifndef HC_NOWEBSOCKETS
#include "WebSocket/hcwebsocket.h"
#include "Platform/IWebSocketProvider.h"
#endif
NAMESPACE_XBOX_HTTP_CLIENT_BEGIN
// Global state related to network operations.
//
// Responsible for tracking ongoing network operations and awaiting them during cleanup. It also owns the IHttpProvider
// and IWebSocketProvider that will be used to perform HttpCalls and WebSockets operations.
class NetworkState
{
public:
NetworkState(NetworkState const&) = delete;
NetworkState& operator=(NetworkState const&) = delete;
~NetworkState() = default;
// Lifecycle management
#ifndef HC_NOWEBSOCKETS
static Result<UniquePtr<NetworkState>> Initialize(
UniquePtr<IHttpProvider> httpProvider,
UniquePtr<IWebSocketProvider> webSocketProvider
) noexcept;
#else
static Result<UniquePtr<NetworkState>> Initialize(
UniquePtr<IHttpProvider> httpProvider
) noexcept;
#endif
static HRESULT CleanupAsync(
UniquePtr<NetworkState> networkManager,
XAsyncBlock* async
) noexcept;
public: // Http
IHttpProvider& HttpProvider() noexcept;
Result<UniquePtr<HC_CALL>> HttpCallCreate() noexcept;
HRESULT HttpCallPerformAsync(
HCCallHandle httpCall,
XAsyncBlock* async
) noexcept;
#ifdef HC_UNITTEST_API
bool CanCleanupCancelHttpRequest(XAsyncBlock* async) noexcept;
#endif
#ifndef HC_NOWEBSOCKETS
public: // WebSocket
IWebSocketProvider& WebSocketProvider() noexcept;
Result<SharedPtr<WebSocket>> WebSocketCreate() noexcept;
HRESULT WebSocketConnectAsync(
String&& uri,
String&& subProtocol,
HCWebsocketHandle handle,
XAsyncBlock* asyncBlock
) noexcept;
#endif
private:
#ifndef HC_NOWEBSOCKETS
NetworkState(UniquePtr<IHttpProvider> httpProvider, UniquePtr<IWebSocketProvider> webSocketProvider) noexcept;
#else
NetworkState(UniquePtr<IHttpProvider> httpProvider) noexcept;
#endif
static HRESULT CALLBACK HttpCallPerformAsyncProvider(XAsyncOp op, const XAsyncProviderData* data);
static void CALLBACK HttpCallPerformComplete(XAsyncBlock* async);
static HRESULT CALLBACK CleanupAsyncProvider(XAsyncOp op, const XAsyncProviderData* data);
static void CALLBACK HttpProviderCleanupComplete(XAsyncBlock* async);
bool ScheduleCleanup();
DefaultUnnamedMutex m_mutex;
UniquePtr<IHttpProvider> m_httpProvider;
struct HttpPerformContext;
Set<HttpPerformContext*> m_activeHttpRequests;
XAsyncBlock* m_cleanupAsyncBlock{ nullptr }; // non-owning
#ifndef HC_NOWEBSOCKETS
static HRESULT CALLBACK WebSocketConnectAsyncProvider(XAsyncOp op, const XAsyncProviderData* data);
static void CALLBACK WebSocketConnectComplete(XAsyncBlock* async);
static void CALLBACK WebSocketClosed(HCWebsocketHandle websocket, HCWebSocketCloseStatus closeStatus, void* context);
UniquePtr<IWebSocketProvider> m_webSocketProvider;
struct WebSocketConnectContext;
struct ActiveWebSocketContext;
Set<XAsyncBlock*> m_connectingWebSockets;
Set<ActiveWebSocketContext*> m_connectedWebSockets;
#endif
};
NAMESPACE_XBOX_HTTP_CLIENT_END