Pico Unreal Platform SDK
IPAddressPico.h
1// Copyright 2022 Pico Technology Co., Ltd.All rights reserved.
2// This plugin incorporates portions of the Unreal® Engine. Unreal® is a trademark or registered trademark of Epic Games, Inc.In the United States of America and elsewhere.
3// Unreal® Engine, Copyright 1998 – 2022, Epic Games, Inc.All rights reserved.
4
5#pragma once
6
7#include "CoreMinimal.h"
8#include "IPAddress.h"
9#include "Algo/Reverse.h"
10#include "Engine/EngineBaseTypes.h"
11#include "OnlineSubsystemPico.h"
12#include "OnlineSubsystemPicoTypes.h"
13#include "OnlineSubsystemPicoPackage.h"
14
19class FInternetAddrPico : public FInternetAddr
20{
21PACKAGE_SCOPE:
22
23#if ENGINE_MAJOR_VERSION > 4
24 FUniqueNetIdPicoRef PicoId;
25#elif ENGINE_MINOR_VERSION > 26
26 FUniqueNetIdPicoRef PicoId;
27#elif ENGINE_MINOR_VERSION > 24
28 FUniqueNetIdPico PicoId;
29#endif
30
35 PicoId(Src.PicoId)
36 {
37 }
38
39
40public:
46#if ENGINE_MAJOR_VERSION > 4
48 PicoId(FUniqueNetIdPico::EmptyId())
49 {
50 }
51
55 explicit FInternetAddrPico(const FUniqueNetIdPico& InPicoId) :
56 PicoId(InPicoId.AsShared())
57 {
58 }
59
63 explicit FInternetAddrPico(ppfID InPicoId) :
64 PicoId(FUniqueNetIdPico::Create(InPicoId))
65 {
66 }
67 explicit FInternetAddrPico(const FString& UserId) :
68 PicoId(FUniqueNetIdPico::Create(UserId))
69 {
70 }
71
72 static FInternetAddrPico FromUrl(const FURL& ConnectURL)
73 {
74 FString Host = ConnectURL.Host;
75 // Parse the URL: unreal://<pico_id>.pico or unreal://<pico_id>
76 int32 DotIndex;
77 FString PicoStringID = (Host.FindChar('.', DotIndex)) ? Host.Left(DotIndex) : Host;
78 uint64 PicoUintId = strtoull(TCHAR_TO_ANSI(*PicoStringID), nullptr, 10);
79 const FUniqueNetIdPicoRef PicoNetId = FUniqueNetIdPico::Create(PicoUintId);
80 return FInternetAddrPico(*PicoNetId);
81 }
82#elif ENGINE_MINOR_VERSION > 26
84 PicoId(FUniqueNetIdPico::EmptyId())
85 {
86 }
87
91 explicit FInternetAddrPico(const FUniqueNetIdPico& InPicoId) :
92 PicoId(InPicoId.AsShared())
93 {
94 }
95
99 explicit FInternetAddrPico(ppfID InPicoId) :
100 PicoId(FUniqueNetIdPico::Create(InPicoId))
101 {
102 }
103 explicit FInternetAddrPico(const FString& UserId) :
104 PicoId(FUniqueNetIdPico::Create(UserId))
105 {
106 }
107
108 static FInternetAddrPico FromUrl(const FURL& ConnectURL)
109 {
110 FString Host = ConnectURL.Host;
111 // Parse the URL: unreal://<pico_id>.pico or unreal://<pico_id>
112 int32 DotIndex;
113 FString PicoStringID = (Host.FindChar('.', DotIndex)) ? Host.Left(DotIndex) : Host;
114 uint64 PicoUintId = strtoull(TCHAR_TO_ANSI(*PicoStringID), nullptr, 10);
115 const FUniqueNetIdPicoRef PicoNetId = FUniqueNetIdPico::Create(PicoUintId);
116 return FInternetAddrPico(*PicoNetId);
117 }
118
119#elif ENGINE_MINOR_VERSION > 24
121 PicoId(0ull)
122 {
123 }
124
128 explicit FInternetAddrPico(const FUniqueNetIdPico& InPicoId) :
129 PicoId(InPicoId)
130 {
131 }
132
136 explicit FInternetAddrPico(ppfID InPicoId) :
137 PicoId(FUniqueNetIdPico(InPicoId))
138 {
139 }
140 explicit FInternetAddrPico(const FString& UserId) :
141 PicoId(FUniqueNetIdPico(UserId))
142 {
143 }
144
145 explicit FInternetAddrPico(const FURL& ConnectURL)
146 {
147 auto Host = ConnectURL.Host;
148
149 // Parse the URL: unreal://<oculus_id>.oculus or unreal://<oculus_id>
150 int32 DotIndex;
151 auto PicoStringID = (Host.FindChar('.', DotIndex)) ? Host.Left(DotIndex) : Host;
152 PicoId = strtoull(TCHAR_TO_ANSI(*PicoStringID), nullptr, 10);
153 }
154#endif
155
156
157#if ENGINE_MAJOR_VERSION > 4
158 ppfID GetID() const
159 {
160 return PicoId->GetID();
161 }
162 FString GetStrID() const
163 {
164 return PicoId->GetStringID();
165 }
166#elif ENGINE_MINOR_VERSION > 26
167 ppfID GetID() const
168 {
169 return PicoId->GetID();
170}
171 FString GetStrID() const
172 {
173 return PicoId->GetStringID();
174 }
175#elif ENGINE_MINOR_VERSION > 24
176 ppfID GetID() const
177 {
178 return PicoId.GetID();
179 }
180 FString GetStrID() const
181 {
182 return PicoId.GetStringID();
183 }
184#endif
185
186 virtual TArray<uint8> GetRawIp() const override
187 {
188#if ENGINE_MAJOR_VERSION > 4
189 TArray<uint8> RawAddressArray;
190 const uint8* PicoIdWalk = PicoId->GetBytes();
191 while (RawAddressArray.Num() < PicoId->GetSize())
192 {
193 RawAddressArray.Add(*PicoIdWalk);
194 ++PicoIdWalk;
195 }
196#elif ENGINE_MINOR_VERSION > 26
197 TArray<uint8> RawAddressArray;
198 const uint8* PicoIdWalk = PicoId->GetBytes();
199 while (RawAddressArray.Num() < PicoId->GetSize())
200 {
201 RawAddressArray.Add(*PicoIdWalk);
202 ++PicoIdWalk;
203 }
204
205#elif ENGINE_MINOR_VERSION > 24
206 TArray<uint8> RawAddressArray;
207 const uint8* PicoIdWalk = PicoId.GetBytes();
208 while (RawAddressArray.Num() < PicoId.GetSize())
209 {
210 RawAddressArray.Add(*PicoIdWalk);
211 ++PicoIdWalk;
212 }
213#endif
214
215
216 // We want to make sure that these arrays are in big endian format.
217#if PLATFORM_LITTLE_ENDIAN
218 Algo::Reverse(RawAddressArray);
219#endif
220
221 return RawAddressArray;
222 }
223
224 virtual void SetRawIp(const TArray<uint8>& RawAddr) override
225 {
226 ppfID NewId = 0;
227
228 // Make a quick copy of the array
229 TArray<uint8> WorkingArray = RawAddr;
230
231 // If we're little endian, we need to reverse so that the shifts turn out correct
232#if PLATFORM_LITTLE_ENDIAN
233 Algo::Reverse(WorkingArray);
234#endif
235
236 for (int32 i = 0; i < WorkingArray.Num(); ++i)
237 {
238 NewId |= (ppfID)WorkingArray[i] << (i * 8);
239 }
240
241#if ENGINE_MAJOR_VERSION > 4
242 PicoId = FUniqueNetIdPico::Create(NewId);
243#elif ENGINE_MINOR_VERSION > 26
244 PicoId = FUniqueNetIdPico::Create(NewId);
245#elif ENGINE_MINOR_VERSION > 24
246 PicoId = FUniqueNetIdPico(NewId);
247#endif
248
249
250 }
251
257 void SetIp(uint32 InAddr) override
258 {
260 }
261
267 void SetIp(const TCHAR* InAddr, bool& bIsValid) override
268 {
270 }
271
277 void GetIp(uint32& OutAddr) const override
278 {
280 }
281
287 void SetPort(int32 InPort) override
288 {
290 }
291
297 void GetPort(int32& OutPort) const override
298 {
300 }
301
305 int32 GetPort() const override
306 {
308 return 0;
309 }
310
312 void SetAnyAddress() override
313 {
315 }
316
318 void SetBroadcastAddress() override
319 {
321 }
322
324 void SetLoopbackAddress() override
325 {
327 }
328
334 FString ToString(bool bAppendPort) const override
335 {
336#if ENGINE_MAJOR_VERSION > 4
337 return PicoId->ToString();
338#elif ENGINE_MINOR_VERSION > 26
339 return PicoId->ToString();
340#elif ENGINE_MINOR_VERSION > 24
341 return PicoId.ToString();
342#endif
343
344 }
345
351 virtual bool operator==(const FInternetAddr& Other) const override
352 {
353 FInternetAddrPico& PicoOther = (FInternetAddrPico&)Other;
354 return PicoId == PicoOther.PicoId;
355 }
356
357 bool operator!=(const FInternetAddrPico& Other) const
358 {
359 return !(FInternetAddrPico::operator==(Other));
360 }
361
362 virtual uint32 GetTypeHash() const override
363 {
364 return ::GetTypeHash((uint64)GetID());
365 }
366
367 virtual FName GetProtocolType() const override
368 {
369 return FNetworkProtocolTypes::Pico;
370 }
371
377 virtual bool IsValid() const override
378 {
379#if ENGINE_MAJOR_VERSION > 4
380 return PicoId->IsValid();
381#elif ENGINE_MINOR_VERSION > 26
382 return PicoId->IsValid();
383#elif ENGINE_MINOR_VERSION > 24
384 return PicoId.IsValid();
385#endif
386
387 }
388
389 virtual TSharedRef<FInternetAddr> Clone() const override
390 {
391 TSharedRef<FInternetAddrPico> NewAddress = MakeShareable(new FInternetAddrPico);
392 NewAddress->PicoId = PicoId;
393 return NewAddress;
394 }
395};
Definition: IPAddressPico.h:20
void SetAnyAddress() override
Definition: IPAddressPico.h:312
void SetPort(int32 InPort) override
Definition: IPAddressPico.h:287
int32 GetPort() const override
Definition: IPAddressPico.h:305
void SetBroadcastAddress() override
Definition: IPAddressPico.h:318
void GetIp(uint32 &OutAddr) const override
Definition: IPAddressPico.h:277
void SetIp(const TCHAR *InAddr, bool &bIsValid) override
Definition: IPAddressPico.h:267
void SetLoopbackAddress() override
Definition: IPAddressPico.h:324
virtual bool IsValid() const override
Definition: IPAddressPico.h:377
void GetPort(int32 &OutPort) const override
Definition: IPAddressPico.h:297
virtual bool operator==(const FInternetAddr &Other) const override
Definition: IPAddressPico.h:351
FString ToString(bool bAppendPort) const override
Definition: IPAddressPico.h:334
void SetIp(uint32 InAddr) override
Definition: IPAddressPico.h:257