CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
inet_NexFacade.h
1 /*--------------------------------------------------------------------------------*
2  Copyright (C)Nintendo All rights reserved.
3 
4  These coded instructions, statements, and computer programs contain proprietary
5  information of Nintendo and/or its licensed developers and are protected by
6  national and international copyright laws. They may not be disclosed to third
7  parties or copied or duplicated in any form, in whole or in part, without the
8  prior written consent of Nintendo.
9 
10  The content herein is highly confidential and should be handled accordingly.
11  *--------------------------------------------------------------------------------*/
12 
13 
14 #pragma once
15 
16 #include <nn/pia/inet/inet_Definitions.h>
17 
18 #if NN_PIA_ENABLE_NEX
19 
20 #include <nn/pia/inet/inet_NexSessionTypes.h>
21 #include <nn/pia/inet/inet_IFacade.h>
22 
23 #include <nn/pia/common/common_AsyncContext.h>
24 #include <nn/pia/common/common_FixedString.h>
25 #include <nn/pia/common/common_InetAddress.h>
26 #include <nn/pia/common/common_SignatureSetting.h>
27 
28 #include <nn/pia/nat/nat_Definitions.h>
29 
30 #include <nn/pia/transport/transport_StationConnectionInfo.h>
31 
32 #if NN_PIA_CTR
33 #pragma diag_suppress 1300
34 #endif
35 
36 #include <OnlineCore/src/Platform/Core/qList.h>
37 #include <OnlineCore/src/Transport/Interface/StationURL.h>
38 #include <RendezVous/Core/src/Client/Credentials.h>
39 #include <RendezVous/Core/src/Common/Constants/NotificationEvents.h>
40 
41 #include <RendezVous/Services/Jugem/Login/src/Client/NgsFacade.h>
42 #include <RendezVous/Services/Jugem/Login/src/Client/NgsBridgeInterface.h>
43 #include <RendezVous/Services/MatchMaking.h>
44 #include <RendezVous/Services/Jugem/Matchmake/src/Client/MatchmakeExtensionClient.h>
45 #include <RendezVous/Services/NATTraversal/src/Client/NATTraversalClient.h>
46 
47 #if NN_PIA_CTR
48 #pragma diag_default 1300
49 #endif
50 
51 namespace nn
52 {
53 namespace pia
54 {
55 namespace common
56 {
57 class Socket;
58 }
59 }
60 }
61 
62 namespace nn
63 {
64 namespace pia
65 {
66 namespace nat
67 {
68 class NatTraverser;
69 }
70 }
71 }
72 
73 namespace nn
74 {
75 namespace pia
76 {
77 namespace inet
78 {
79 class IFacade;
80 class NexNatRelay;
81 class NexNatTraversalClient;
82 class NexNotificationDataJob;
83 class NexNatServerAddressResolveJob;
84 class SocketOutputStream;
85 class SocketInputStream;
86 
87 #if NN_PIA_CTR
88 class NexBlockListJob;
89 #endif
90 
91 /*!
92  @brief NEX ライブラリのファサード(facade、インターフェースラッパー)クラスです。
93  @details nn::pia::inet::Nex*クラス群のファサードではなく、NEX ライブラリのクラス群のファサードクラスになります。
94  */
95 class NexFacade : public IFacade
96 {
97 public:
98  /*!
99  @brief ログインした NEX ゲームサーバーの情報
100  */
101  struct LoginInfo
102  {
103  LoginInfo()
104  : pNgsFacade(NULL), gameServerId(0), pAccessKey(NULL)
105  {
106  }
107 
108  nn::nex::NgsFacade* pNgsFacade; //!< ゲームサーバーにログインした nn::nex::NgsFacade インスタンス
109  uint32_t gameServerId; //!< ゲームサーバーにログインする際に指定したゲームサーバー ID
110  common::String* pAccessKey; //!< ゲームサーバーにログインする際に指定したアクセスキー
111  };
112 
113  /*!
114  @brief インスタンスを作成します(シングルトンパターン)。
115 
116  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
117  @retval nn::pia::ResultNotInitialized inet モジュールが未初期化です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
118  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
119  @retval nn::pia::ResultAlreadyExists 既にインスタンスは作成されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
120  */
121  static Result CreateInstance(void);
122 
123  /*!
124  @brief インスタンスを破棄します(シングルトンパターン)。
125 
126  @details インスタンスが作成されていないときにこの関数が呼び出された場合は、
127  何も実行せずに関数から返ります。
128  */
129  static void DestroyInstance(void);
130 
131  /*!
132  @brief NexFacade インスタンスへのポインタを取得します(シングルトンパターン)。
133 
134  @return インスタンスが作成されていないときは、 NULL ポインタが返ります。
135  */
136  static NexFacade* GetInstance(void)
137  {
138  return s_pInstance;
139  }
140 
141  /*!
142  @cond PRIVATE
143  @brief nn::nex::StationURLを @ref nn::pia::transport::StationConnectionInfo に変換します。
144 
145  @details nn::nex::MatchmakeExtensionClient::GetSessionURLs で取得した接続先情報を Pia のステーション接続情報に変換します。
146  変換したステーション接続情報は nn::pia::session::Mesh::JoinMeshAsync で使用できます。
147 
148  @param[in] nexStationUrlList 変換元となる接続情報です。要素数は1か2である必要があります。
149  @param[in] pStationConnectionInfo 変換先となるステーション接続情報です。
150 
151  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
152  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
153  @endcond
154  */
155  static Result ConvertNexStationUrlToStationConnectionInfo(
156  const nn::nex::qList<nn::nex::StationURL>& nexStationUrlList,
157  transport::StationConnectionInfo* pStationConnectionInfo);
158 
159  /*!
160  @cond PRIVATE
161  @brief NEX の StationURL を PiaTransport の StationLocation に変換します。
162  @param[in] url NEX の StationURL
163  @param[out] pLocation PiaTransport の StationLocation
164  @see ConvertStationLocationToNexStationUrl
165  @endcond
166  */
167  static void ConvertNexStationUrlToStationLocation(const nn::nex::StationURL& url, transport::StationLocation* pLocation);
168 
169  /*!
170  @cond PRIVATE
171  @brief NEX の InetAddress を Pia の InetAddress に変換します。
172 
173  @details この関数はスレッドセーフです。
174  <br>
175  @param[in] nexAddress NEX の InetAddress
176  @param[out] pAddress Pia の InetAddress
177  @endcond
178  */
179  static void ConvertNexInetAddressToInetAddress(const nn::nex::InetAddress& nexAddress, common::InetAddress* pAddress);
180 
181  /*!
182  @cond PRIVATE
183  @brief Pia の InetAddress を NEX の InetAddress に変換します。
184 
185  @details この関数はスレッドセーフです。
186  <br>
187  @param[in] address Pia の InetAddress
188  @param[out] pNexAddress NEX の InetAddress
189  @endcond
190  */
191  static void ConvertInetAddressToNexInetAddress(const common::InetAddress& address, nn::nex::InetAddress* pNexAddress);
192 
193  /*!
194  @cond PRIVATE
195  @brief PiaTransport の StationLocation を NEX の StationURL に変換します。
196  @param[in] location PiaTransport の StationLocation
197  @param[out] pUrl NEX の StationURL
198  @see ConvertNexStationUrlToStationLocation
199  @endcond
200  */
201  static void ConvertStationLocationToNexStationUrl(const transport::StationLocation& location, nn::nex::StationURL* pUrl);
202 
203  /*!
204  @cond PRIVATE
205  @endcond
206  */
207  static void ConvertStationLocationToStationUrlNexList(
208  const nn::nex::qList<transport::StationLocation>& stationLocationList,
209  nn::nex::qList<nn::nex::StationURL>* pStationUrlList);
210 
211  /*!
212  @cond PRIVATE
213  @endcond
214  */
215  static void ConvertStationUrlToStationLocationNexList(
216  const nn::nex::qList<nn::nex::StationURL>& stationUrlList,
217  nn::nex::qList<transport::StationLocation>* pStationLocationList);
218 
219  /*!
220  @cond PRIVATE
221  @brief nex::String を nn::pia::common::String に変換
222  @param[in] nexString 変換元の nex::String
223  @param[out] pString 変換先の nn::pia::common::String
224  @endcond
225  */
226  static void ConvertNexStringToString(const nn::nex::String& nexString, common::String* pString);
227 
228  /*!
229  @cond PRIVATE
230  @brief nn::nex::qVector<nn::nex::qByte> の セッション共有キーを nn::pia::common::SignatureSetting に変換します。
231 
232  @details マッチメイク時にゲームサーバーから取得するセッション共有キーをパケットの署名機能に関する設定用クラスの鍵に変換します。
233  変換先の nn::pia::common::SignatureSetting にはあらかじめキー用のバッファを設定しておくか、@ref nn::pia::common::SignatureSettingWithKeyBuffer を使用してください。
234  変換したパケット署名機能用の設定は nn::pia::session::Mesh::Startup で必要になります。
235 
236  @param[in] nexSignatureKey 変換元の nn::nex::qVector<nn::nex::qByte>
237  @param[out] pSignatureSetting 変換先の nn::pia::common::SignatureSetting
238 
239  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
240  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。nn::pia::common::SignatureSetting のバッファサイズが変換元のサイズ以上であることを確認してください。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
241  @endcond
242  */
243 
244  static Result ConvertNexSignatureKeyToSignatureSetting(
245  const nn::nex::qVector<nn::nex::qByte>& nexSignatureKey,
246  common::SignatureSetting* pSignatureSetting);
247 
248  /*!
249  @cond PRIVATE
250  @endcond
251  */
252  Result CreateProtocols();
253 
254  /*!
255  @brief ログインしたゲームサーバーの情報を登録します。
256 
257  @details 本関数は NEX ゲームサーバーへのログインに成功した際の nn::nex::NgsFacade クラスのインスタンス、ゲームサーバー ID、アクセスキー を Pia ライブラリに登録します。
258  NEX ゲームサーバーにログインしてから NexFacade::Startup を呼び出すまでの間に呼び出す必要があります。
259 
260  @param[in] pLoginInfo ログインした NEX ゲームサーバー情報 LoginInfo のポインタを指定します。
261 
262  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
263  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
264  @see Unbind, Startup
265  */
266  Result Bind(const LoginInfo* pLoginInfo);
267 
268  /*!
269  @brief 登録したゲームサーバーの情報を削除します。
270 
271  @details 本関数は NEX ゲームサーバーへのログインに成功した際の nn::nex::NgsFacade クラスのインスタンス、ゲームサーバー ID の登録情報を Pia ライブラリから削除します。
272  NexFacade::Cleanup を呼び出してから NEX ゲームサーバーからログアウトするまでの間に呼び出す必要があります。
273  @see Bind, Startup
274  */
275  void Unbind();
276 
277  /*!
278  @if CTR_DOC
279  @brief ブロックリストにユーザーを追加する非同期処理を開始します。
280  @details 開始した処理は @ref common::Scheduler::Dispatch を定期的に呼び出すことで進行します。また、NEX のディスパッチ関数も同様に定期的に呼び出す必要があります。
281  処理の完了は @ref IsAddToBlockListCompleted でチェックし、結果は @ref GetAddToBlockListResult で確認できます。
282  <br>
283  既にフレンド関係が成立している場合は登録できません。また、既にブロックリストに追加されているユーザーは無視されます。
284  ブロックリスト登録後にフレンド関係が成立しても、自動的にブロックリストから削除されることはありません。
285 
286  @param[in] pPrincipalIdArray ブロックリストに登録するユーザーのプリンシパル ID を格納した配列のポインタ。
287  @param[in] principalIdArraySize ブロックリストに登録するユーザーのプリンシパル ID を格納した配列のサイズ。配列の最大長は 100 です。
288  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
289  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
290  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
291 
292  @see IsAddToBlockListCompleted, GetAddToBlockListResult
293  @endif
294  */
295  Result AddToBlockListAsync(PrincipalId* pPrincipalIdArray, uint32_t principalIdArraySize);
296 
297  /*!
298  @if CTR_DOC
299  @brief AddToBlockListAsync の非同期処理の完了をチェックします。
300  @details @ref AddToBlockListAsync で開始された非同期処理は、本関数で完了をチェックできます。
301  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。非同期処理が行われていない場合も false が返ります。
302 
303  @see AddToBlockListAsync, GetAddToBlockListResult
304  @endif
305  */
306  bool IsAddToBlockListCompleted() const;
307 
308 
309  /*!
310  @if CTR_DOC
311  @brief AddToBlockListAsync の非同期処理の結果を取得します。
312  @details @ref AddToBlockListAsync で開始された非同期処理が完了した後、本関数で結果を取得できます。
313 
314  @return IsSuccess() が真となる Result を返します。失敗した場合、以下の Result を返します。
315  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害、ゲームサーバーとの接続の切断などの原因が考えられます。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
316  @retval nn::pia::ResultGameServerProcessAborted ゲームサーバーに関する処理が異常終了しました。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
317  @retval nn::pia::ResultNexInternalError NEX の内部エラーです。nn::pia::Result::GetErrorCode() で取得できるエラーコードは NEX のものになります。エラーコードリストの NEX の項目をご確認ください。クリーンアップ処理、NEX サーバーからのログアウト処理、ネットワークのシャットダウン処理、終了処理を順に実行してください。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。アプリケーションで適切にハンドリングしてください。
318 
319  @see AddToBlockListAsync, IsAddToBlockListCompleted
320  @endif
321  */
323 
324  /*!
325  @if CTR_DOC
326  @brief ブロックリストから指定したユーザーを削除する非同期処理を開始します。。
327  @details 開始した処理は @ref common::Scheduler::Dispatch を定期的に呼び出すことで進行します。また、NEX のディスパッチ関数も同様に定期的に呼び出す必要があります。
328  処理の完了は @ref IsRemoveFromBlockListCompleted でチェックし、結果は @ref GetRemoveFromBlockListResult で確認できます。
329 
330  @param[in] pPrincipalIdArray ブロックリストから削除するユーザーのプリンシパル ID を格納した配列のポインタ。
331  @param[in] principalIdArraySize ブロックリストから削除するユーザーのプリンシパル ID を格納した配列のサイズ。配列の最大長は 100 です。
332  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
333  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
334  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
335 
336  @see IsRemoveFromBlockListCompleted, GetRemoveFromBlockListResult
337  @endif
338  */
339  Result RemoveFromBlockListAsync(PrincipalId* pPrincipalIdArray, uint32_t principalIdArraySize);
340 
341  /*!
342  @if CTR_DOC
343  @brief RemoveFromBlockListAsync の非同期処理の完了をチェックします。
344  @details @ref RemoveFromBlockListAsync で開始された非同期処理は、本関数で完了をチェックできます。
345  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。非同期処理が行われていない場合も false が返ります。
346 
347  @see RemoveFromBlockListAsync, GetRemoveFromBlockListResult
348  @endif
349  */
350  bool IsRemoveFromBlockListCompleted() const;
351 
352  /*!
353  @if CTR_DOC
354  @brief RemoveFromBlockListAsync の非同期処理の結果を取得します。
355  @details @ref RemoveFromBlockListAsync で開始された非同期処理が完了した後、本関数で結果を取得できます。
356 
357  @return IsSuccess() が真となる Result を返します。失敗した場合、以下の Result を返します。
358  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害、ゲームサーバーとの接続の切断などの原因が考えられます。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
359  @retval nn::pia::ResultGameServerProcessAborted ゲームサーバーに関する処理が異常終了しました。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
360  @retval nn::pia::ResultNexInternalError NEX の内部エラーです。nn::pia::Result::GetErrorCode() で取得できるエラーコードは NEX のものになります。エラーコードリストの NEX の項目をご確認ください。クリーンアップ処理、NEX サーバーからのログアウト処理、ネットワークのシャットダウン処理、終了処理を順に実行してください。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。アプリケーションで適切にハンドリングしてください。
361 
362  @see RemoveFromBlockListAsync, IsRemoveFromBlockListCompleted
363  @endif
364  */
366 
367  /*!
368  @if CTR_DOC
369  @brief ブロックリストをクリアする非同期処理を開始します。
370  @details 開始した処理は @ref common::Scheduler::Dispatch を定期的に呼び出すことで進行します。また、NEX のディスパッチ関数も同様に定期的に呼び出す必要があります。
371  処理の完了は @ref IsClearBlockListCompleted でチェックし、結果は @ref GetClearBlockListResult で確認できます。
372 
373  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
374  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
375  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
376 
377  @see IsClearBlockListCompleted, GetClearBlockListResult
378  @endif
379  */
381 
382  /*!
383  @if CTR_DOC
384  @brief ClearBlockListAsync の非同期処理の完了をチェックします。
385  @details @ref ClearBlockListAsync で開始された非同期処理は、本関数で完了をチェックできます。
386  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。非同期処理が行われていない場合も false が返ります。
387 
388  @see ClearBlockListAsync, GetClearBlockListResult
389  @endif
390  */
391  bool IsClearBlockListCompleted() const;
392 
393  /*!
394  @if CTR_DOC
395  @brief ClearBlockListAsync の非同期処理の結果を取得します。
396  @details @ref ClearBlockListAsync で開始された非同期処理が完了した後、本関数で結果を取得できます。
397 
398  @return IsSuccess() が真となる Result を返します。失敗した場合、以下の Result を返します。
399  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害、ゲームサーバーとの接続の切断などの原因が考えられます。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
400  @retval nn::pia::ResultGameServerProcessAborted ゲームサーバーに関する処理が異常終了しました。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
401  @retval nn::pia::ResultNexInternalError NEX の内部エラーです。nn::pia::Result::GetErrorCode() で取得できるエラーコードは NEX のものになります。エラーコードリストの NEX の項目をご確認ください。クリーンアップ処理、NEX サーバーからのログアウト処理、ネットワークのシャットダウン処理、終了処理を順に実行してください。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。アプリケーションで適切にハンドリングしてください。
402 
403  @see ClearBlockListAsync, IsClearBlockListCompleted
404  @endif
405  */
407 
408  /*!
409  @if CTR_DOC
410  @brief ブロックリストに登録しているユーザーを取得する非同期処理を開始します。
411  @details 開始した処理は @ref common::Scheduler::Dispatch を定期的に呼び出すことで進行します。また、NEX のディスパッチ関数も同様に定期的に呼び出す必要があります。
412  処理の完了は @ref IsRequestBlockListCompleted でチェックし、結果は @ref GetRequestBlockListResult で確認できます。
413  非同期処理が成功していた場合は、@ref GetBlockList でブロックリストの登録ユーザーを取得できます。
414 
415  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
416  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
417  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
418 
419  @see IsRequestBlockListCompleted, GetRequestBlockListResult, GetBlockList
420  @endif
421  */
423 
424  /*!
425  @if CTR_DOC
426  @brief RequestBlockListAsync の非同期処理の完了をチェックします。
427  @details @ref RequestBlockListAsync で開始された非同期処理は、本関数で完了をチェックできます。
428  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。非同期処理が行われていない場合も false が返ります。
429 
430  @see RequestBlockListAsync, GetRequestBlockListResult
431  @endif
432  */
433  bool IsRequestBlockListCompleted() const;
434 
435  /*!
436  @if CTR_DOC
437  @brief RequestBlockListAsync の非同期処理の結果を取得します。
438  @details @ref RequestBlockListAsync で開始された非同期処理が完了した後、本関数で結果を取得できます。
439 
440  @return IsSuccess() が真となる Result を返します。失敗した場合、以下の Result を返します。
441  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害、ゲームサーバーとの接続の切断などの原因が考えられます。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
442  @retval nn::pia::ResultGameServerProcessAborted ゲームサーバーに関する処理が異常終了しました。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
443  @retval nn::pia::ResultNexInternalError NEX の内部エラーです。nn::pia::Result::GetErrorCode() で取得できるエラーコードは NEX のものになります。エラーコードリストの NEX の項目をご確認ください。クリーンアップ処理、NEX サーバーからのログアウト処理、ネットワークのシャットダウン処理、終了処理を順に実行してください。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。アプリケーションで適切にハンドリングしてください。
444 
445  @see RequestBlockListAsync, IsRequestBlockListCompleted
446  @endif
447  */
449 
450  /*!
451  @if CTR_DOC
452  @brief ブロックリストに登録されているユーザーを取得します。
453  @details ブロックリストの情報取得は @ref RequestBlockListAsync で行う必要があります。
454  @param[in] pPrincipalIdArray ブロックリストに登録されているユーザーのプリンシパル ID をコピーする配列のポインタ。
455  @param[in] principalIdArraySize ブロックリストに登録されているユーザーのプリンシパル ID をコピーする配列のサイズ。配列の最大長は 100 です。
456  @param[out] pBlockListSize 引数に指定した配列にプリンシパル ID をコピーした回数を格納する変数のポインタ。
457 
458  @return IsSuccess() が真となる Result を返します。失敗した場合、以下の Result を返します。
459  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
460  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
461 
462  @see RequestBlockListAsync
463  @endif
464  */
465  Result GetBlockList(PrincipalId* pPrincipalIdArray, uint32_t principalIdArraySize, uint32_t* pBlockListSize);
466 
467  /*!
468  @brief ゲーム固有のイベントをゲームサーバーに通知します。
469  @details 同じゲームサーバーにログインしているフレンドに対して、ゲームが独自に定義したイベントを通知します。
470  ゲームサーバーにログインし、Bind の呼び出しから Unbind の呼び出しまでの間に呼び出し可能です。
471  イベント通知は 1 分間に 10 回の頻度を越えて呼び出してはいけません。
472  <br>
473  非同期処理中に nn::nex::MatchmakeExtensionClient::UpdateNotificationData を呼び出します。
474  <br>
475  この API は非推奨のため、本関数も非推奨となります。
476 
477  @param[in] gameNotificationType ゲーム定義のイベントタイプ(nn::nex::NotificationEvents::GameNotificationEvent1 ~ 8)を指定します。
478  @param[in] param1 イベントのパラメータを指定します。
479  @param[in] param2 イベントのパラメータを指定します。
480  @param[in] strParam イベントのパラメータ(文字列)を指定します。文字列長は 256 以内です。
481  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
482  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
483  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
484  */
485  Result UpdateNotificationDataAsync(nn::nex::NotificationEvents::NotificationEvents gameNotificationType, uint32_t param1, uint32_t param2, const common::String& strParam);
486 
487  /*!
488  @brief UpdateNotificationDataAsync の非同期処理の完了をチェックします。
489  @details UpdateNotificationDataAsync を呼び出した後、本関数で非同期処理の完了をチェックします。
490 
491  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。
492  */
494 
495  /*!
496  @brief UpdateNotificationDataAsync の非同期処理の結果を取得します。
497  @details UpdateNotificationDataAsync を呼び出し、IsUpdateNotificationDataCompleted で処理が完了した後、本関数で結果を取得します。
498 
499  @return UpdateNotificationDataAsync の非同期処理の結果を返します。 処理が完了した場合、以下を返します。
500  @retval ResultSuccess 非同期処理が成功しました。
501  @retval nn::pia::ResultInvalidState UpdateNotificationDataAsync を呼び出すタイミングが間違っているか、非同期処理が完了していません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
502  @retval nn::pia::ResultNexInternalError NEX の内部エラーです。nn::pia::Result::GetErrorCode() で取得できるエラーコードは NEX のものになります。エラーコードリストの NEX の項目をご確認ください。クリーンアップ処理、NEX サーバーからのログアウト処理、ネットワークのシャットダウン処理、終了処理を順に実行してください。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。アプリケーションで適切にハンドリングしてください。
503  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害、ゲームサーバーとの接続の切断などの原因が考えられます。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
504  @retval nn::pia::ResultGameServerProcessAborted ゲームサーバーに関する処理が異常終了しました。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
505  @if NIN_DOC
506  @retval nn::pia::ResultNetworkConnectionIsLostByDuplicateLogin 他の端末からの同一アカウントでのログインによりゲームサーバーから切断され、非同期処理が中断されました。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
507  @endif
508  */
510 
511  /*!
512  @brief ゲームサーバーに通知されたゲーム固有のイベントを取得します。
513  @details 同じゲームサーバーにログインしているフレンドから通知された、ゲームが独自に定義したイベントを取得します。
514  ゲームサーバーにログインし、Bind の呼び出しから Unbind の呼び出しまでの間に呼び出し可能です。
515  通常、イベントの取得はイベントハンドラで取得し、本関数によるイベント取得はログイン時のみとします。
516  <br>
517  非同期処理中に nn::nex::MatchmakeExtensionClient::GetFriendNotificationData を呼び出します。
518  <br>
519  この API は非推奨のため、本関数も非推奨となります。
520 
521  @param[in] gameNotificationTypeBitMask 取得対象とするゲーム定義のイベントタイプを示すビットマスクを指定します。N ビット目が nn::nex::NotificationEvents::GameNotificationEventN にあたります。
522  @param[out] pRetrievedEventList 取得したイベントのリストを格納先を指定します。指定したリストは非同期処理完了までインスタンスを保持する必要があります。
523  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
524  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
525  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
526  */
527  Result RetrieveNotificationDataAsync(uint8_t gameNotificationTypeBitMask, nn::nex::qList<nn::nex::NotificationEvent>* pRetrievedEventList);
528 
529  /*!
530  @brief RetrieveNotificationDataAsync の非同期処理の完了をチェックします。
531  @details RetrieveNotificationDataAsync を呼び出した後、本関数で非同期処理の完了をチェックします。
532 
533  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。
534  */
536 
537  /*!
538  @brief RetrieveNotificationDataAsync の非同期処理の結果を取得します。
539  @details RetrieveNotificationDataAsync を呼び出し、IsRetrieveNotificationDataCompleted で処理が完了した後、本関数で結果を取得します。
540 
541  @return RetrieveNotificationDataAsync の非同期処理の結果を返します。 処理が完了した場合、以下を返します。
542  @retval ResultSuccess 非同期処理が成功しました。
543  @retval nn::pia::ResultInvalidState RetrieveNotificationDataAsync を呼び出すタイミングが間違っているか、非同期処理が完了していません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
544  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害、ゲームサーバーとの接続の切断などの原因が考えられます。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
545  @retval nn::pia::ResultGameServerProcessAborted ゲームサーバーに関する処理が異常終了しました。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
546  @retval nn::pia::ResultNexInternalError NEX の内部エラーです。nn::pia::Result::GetErrorCode() で取得できるエラーコードは NEX のものになります。エラーコードリストの NEX の項目をご確認ください。クリーンアップ処理、NEX サーバーからのログアウト処理、ネットワークのシャットダウン処理、終了処理を順に実行してください。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。アプリケーションで適切にハンドリングしてください。
547  @if NIN_DOC
548  @retval nn::pia::ResultNetworkConnectionIsLostByDuplicateLogin 他の端末からの同一アカウントでのログインによりゲームサーバーから切断され、非同期処理が中断されました。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。セッション離脱処理、クリーンアップ処理、NEX サーバーからのログアウト処理を順に実行してください。
549  @endif
550  */
552 
553  /*!
554  @cond PRIVATE
555  @brief NexFacade 機能をスタートアップします。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
556  @details 本関数は NEX ゲームサーバーにログインし、Bind 実行後に呼び出す必要があります。
557  本関数の内部で内部処理用クラスのインスタンスを NEX のアロケータを使用して生成します。生成したインスタンスは NEX 内で管理され、nn::nex::NgsFacade の
558  インスタンスと共に破棄されます。既に NEX 内でインスタンスが管理されている場合は、新たにインスタンスを生成しません。
559 
560  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
561  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
562  @if CTR_DOC
563  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っているか、Pia のサポート対象外の NEX のスレッドモードが設定されています。( Pia はアンセーフトランスポートバッファスレッドモード、またはアンセーフユーザースレッドモードしかサポートしません。メジャーバージョンが 3 の NEX ではアンセーフトランスポートバッファスレッドモードの使用が推奨されています。)プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
564  @endif
565  @if CAFE_DOC
566  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っているか、Pia のサポート対象外の NEX のスレッドモードが設定されています。( Pia はアンセーフトランスポートバッファスレッドモードしかサポートしません)。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
567  @endif
568  @see Bind
569  @endcond
570  */
571  Result Startup();
572 
573  /*!
574  @cond PRIVATE
575  @brief NexFacade 機能をクリーンアップします。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
576 
577  @details NEX ゲームサーバーのログアウト前に呼び出す必要があります。
578  @endcond
579  */
580  void Cleanup();
581 
582  /*!
583  @cond PRIVATE
584  @brief NAT セッション(P2P 通信)を開始します。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
585 
586  @details NAT セッションを開始し、P2P 通信に必要な前処理を行います。
587  呼び出す場合は nn::pia::session::Mesh::Startup を呼び出す前に本関数を呼び出す必要があります。
588  本関数を実行する度に P2P 通信で使用されるポート番号が変化します。
589 
590  開始した処理は @ref nn::pia::common::Scheduler::Dispatch を定期的に呼び出すことで進行します。
591  処理の完了は @ref IsStartNatSessionCompleted でチェックし、結果は @ref GetStartNatSessionResult で確認できます。
592 
593  アプリケーション起動後の初回呼び出し時にのみ、 NAT 種別判定用サーバーの DNS による名前解決処理を行います。
594  名前解決処理は非同期処理中にバックグラウンドスレッドで実行されます。
595  @if CTR_DOC
596  名前解決処理にはソケットライブラリの nn::socket::GetAddrInfo() を使用しています。名前解決処理が実行される際に nn::socket::Initialize() で
597  指定したワークメモリからメモリ確保が行われ、名前解決処理が完了した際に確保したメモリは解放されます。
598  @endif
599  @if CAFE_DOC
600  名前解決処理にはソケットライブラリの SOGetAddrInfo を使用しています。名前解決処理が実行される際にメモリ確保が行われ、名前解決処理が完了した際に
601  確保したメモリは解放されます。アプリケーションで名前解決処理用のメモリアロケータを SOResolverRegisterAllocator() で
602  登録している場合、バックグラウンドスレッドからアロケータが呼ばれることになりますので注意してください。アロケータが
603  スレッドセーフである必要があります。
604  @endif
605 
606  名前解決前にルータの WAN 側のケーブルを抜いたときなどには、名前解決処理のタイムアウトを待つため、本非同期処理の
607  完了に 30 秒以上かかることがあります。 なお、名前解決処理はキャンセルできません。
608 
609  @if CAFE_DOC
610  本関数の呼び出しに成功した時点でシステムによるバックグラウンドダウンロード機能は停止されます。
611  そして StopNatSession() 呼び出し時にバックグラウンドダウンロード機能は再び有効化されます。
612 
613  BG ストレスモードは DevMenu の設定にのみ依存するため、本関数実行後もバックグラウンドダウンロードが行われる可能性があることに注意してください。
614  @endif
615 
616  【非同期処理完了時に @ref GetStartNatSessionResult を通して返される可能性のある Result】<br>
617  ・ ResultSuccess :非同期処理が成功しました。<br>
618  ・ nn::pia::ResultCancelled :非同期処理がキャンセルされました。クリーンアップ処理を実行してください。<br>
619  ・ nn::pia::ResultInvalidState :呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。<br>
620  ・ nn::pia::ResultNetworkConnectionIsLost :ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害などの原因が考えられます。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。<br>
621  ・ nn::pia::ResultNatCheckFailed :NAT チェックに失敗しました。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理を実行してください。<br>
622  ・ nn::pia::ResultDnsFailed :DNS 解決に失敗しています。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理を実行してください。
623 
624  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。
625  @retval nn::pia::ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
626  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
627  @endcond
628  */
629  Result StartNatSessionAsync();
630 
631  /*!
632  @cond PRIVATE
633  @brief StartNatSessionAsync の非同期処理の完了をチェックします。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
634 
635  @details StartNatSessionAsync を呼び出した後、本関数で非同期処理の完了をチェックします。
636 
637  @return 非同期処理が完了していた場合は true, 処理中の場合は false が返ります。
638  @endcond
639  */
640  bool IsStartNatSessionCompleted() const;
641 
642  /*!
643  @cond PRIVATE
644  @brief StartNatSessionAsync の非同期処理の結果を取得します。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
645 
646  @details StartNatSessionAsync を呼び出し、IsStartNatSessionCompleted で処理が完了した後、本関数で結果を取得します。
647 
648  @return StartNatSessionAsync の非同期処理の結果を返します。 処理が完了した場合、以下を返します。
649  @retval ResultSuccess 非同期処理が成功しました。
650  @retval nn::pia::ResultCancelled 非同期処理がキャンセルされました。クリーンアップ処理を実行してください。
651  @retval nn::pia::ResultInvalidState StartNatSessionAsync を呼び出すタイミングが間違っているか、非同期処理が完了していません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
652  @retval nn::pia::ResultNetworkConnectionIsLost ネットワークが使用できない状態になっています。無線スイッチOffや、アクセスポイントの障害などの原因が考えられます。クリーンアップ処理、NEX サーバーからのログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。
653  @retval nn::pia::ResultNatCheckFailed NAT チェックに失敗しました。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理を実行してください。
654  @retval nn::pia::ResultDnsFailed DNS 解決に失敗しています。インターネット通信でこのエラーが発生した場合は、ネットワークエラーコードに変換し、エラー・EULA アプレットで表示してください。ですが、ローカル通信時にはエラー・EULA アプレットでエラーコード付きのエラー表示は行わないでください。クリーンアップ処理を実行してください。
655  @endcond
656  */
657  Result GetStartNatSessionResult() const;
658 
659  /*!
660  @cond PRIVATE
661  @brief StartNatSessionAsync の非同期処理をキャンセルします。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
662 
663  @details StartNatSessionAsync を呼び出した後、本関数で非同期処理をキャンセルします。
664  キャンセル処理は @ref nn::pia::common::Scheduler::Dispatch を定期的に呼び出すことで進行します。
665  本関数を呼び出した後、ライブラリは速やかに非同期処理のキャンセルを行いますが、
666  キャンセルの完了は @ref IsStartNatSessionCompleted() でチェックする必要があります。
667 
668  @return StartNatSessionAsync の非同期処理のキャンセル結果を返します。 処理が失敗した場合、以下を返します。
669  @retval nn::pia::ResultInvalidState StartNatSessionAsync の非同期処理が行われていないタイミングで呼び出しています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
670  @endcond
671  */
672  Result CancelStartNatSessionAsync();
673 
674  /*!
675  @cond PRIVATE
676  @brief NAT セッション(P2P 通信)を終了します。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
677 
678  @details nn::pia::session::Mesh::Cleanup を呼び出した後、本関数を呼び出す必要があります。
679  @endcond
680  */
681  void StopNatSession();
682 
683  /*!
684  @cond PRIVATE
685  @endcond
686  */
687  void CompleteStartNatSession();
688 
689  /*!
690  @cond PRIVATE
691  @brief デバッグに有用な情報をプリントします。
692  @param[in] flag トレースフラグです。詳細は @ref TraceFlag 型を参照してください。
693  @endcond
694  */
695  void Trace(uint64_t flag) const;
696 
697  /*!
698  @cond PRIVATE
699  @brief NexFacade 機能がスタートアップされた状態かチェックします。
700  @return スタートアップされた状態の場合、true を返します。
701  @endcond
702  */
703  bool IsStartedUp() const
704  {
705  return m_IsStartedUp;
706  }
707 
708  /*!
709  @cond PRIVATE
710  @brief NAT セッション(P2P 通信)が開始された状態かチェックします。
711  @return 開始された状態の場合、true を返します。
712  @endcond
713  */
714  bool IsStartedNatSession() const
715  {
716  return m_IsStartedNatSession;
717  }
718 
719  /*!
720  @cond PRIVATE
721  @endcond
722  */
723  nat::NatTraverser* GetNatTraverser()
724  {
725  return m_pNatTraverser;
726  }
727 
728  /*!
729  @cond PRIVATE
730  @endcond
731  */
732  NexNatRelay* GetNatRelay()
733  {
734  return m_pNexNatRelay;
735  }
736 
737  /*!
738  @cond PRIVATE
739  @brief MatchmakeExtensionClient のポインタを取得します。
740  @return MatchmakeExtensionClient のポインタ。
741  @endcond
742  */
743  nn::nex::MatchmakeExtensionClient* GetMatchMakingClient()
744  {
745  return m_pMatchMakingClient;
746  }
747 
748  /*!
749  @cond PRIVATE
750  @brief MatchmakeSession のポインタを取得します。
751  @return MatchmakeSession のポインタ。
752  @endcond
753  */
754  nn::nex::MatchmakeSession* GetMatchmakeSessionPtr()
755  {
756  return m_pMatchmakeSession;
757  }
758 
759  /*!
760  @cond PRIVATE
761  @brief Startup で指定した NgsFacade のポインタを取得します。
762  @return NgsFacade のポインタ。
763  @endcond
764  */
765  nn::nex::NgsBridgeInterface* GetNgsInterface()
766  {
767  return m_pNgsInterface;
768  }
769 
770  /*!
771  @cond PRIVATE
772  @brief Startup で指定した GameServerId を取得します。
773  @return GameServerId。
774  @endcond
775  */
776  uint32_t GetGameServerId() const
777  {
778  return m_GameServerId;
779  }
780 
781  /*!
782  @cond PRIVATE
783  @brief NexFacade が管理するマッチメイクセッションの GatheringID を更新します。session::Mesh クラスを直接操作する場合のみ呼出し可能です。
784  @details この API で更新される GatheringID は、ホストマイグレーションなどで使用されます。
785  @param[in] gatheringID 参加しているマッチメイクセッションの GatheringID を指定する必要があります。
786  @endcond
787  */
788  void UpdateGatheringID(nn::nex::GatheringID gatheringID);
789 
790  /*!
791  @cond PRIVATE
792  @brief UpdateGatheringID で指定した GatheringID を取得します。
793  @return GatheringID。
794  @endcond
795  */
796  nn::nex::GatheringID GetGatheringID() const
797  {
798  return m_GatheringID;
799  }
800 
801  /*!
802  @brief 自分自身の NAT ポートマッピングタイプを取得します。
803  @details 自分自身の NAT ポートマッピングタイプを取得します。
804  NexFacade::StartNatSessionAsync の非同期処理が完了した後に正しい値を取得できます。
805  @return NAT ポートマッピングタイプ
806  */
807  nat::Mapping GetNatPropertyMapping() const;
808  /*!
809  @brief 自分自身の NAT フィルタリングタイプを取得します。
810  @details 自分自身の NAT フィルタリングタイプを取得します。
811  NexFacade::StartNatSessionAsync の非同期処理が完了した後に正しい値を取得できます。
812  @return NAT フィルタリング
813  */
814  nat::Filtering GetNatPropertyFiltering() const;
815  /*!
816  @brief 自分自身の NAT ポートインクリメントを取得します。
817  @details 自分自身の NAT ポートインクリメントを取得します。
818  NexFacade::StartNatSessionAsync の非同期処理が完了した後に正しい値を取得できます。
819  @return NAT ポートインクリメント
820  */
821  uint32_t GetNatPropertyPortIncrement() const;
822  /*!
823  @brief 自分自身の NAT のインターネット側のポートを取得します。
824  @details 自分自身の NAT のインターネット側のポートを取得します。
825  NexFacade::StartNatSessionAsync の非同期処理が完了した後に正しい値を取得できます。
826  @return NAT のインターネット側のポート
827  */
828  uint16_t GetNatPropertyPublicPort() const;
829  /*!
830  @brief 自分自身の NAT の LAN 側のポートを取得します。
831  @details 自分自身の NAT の LAN 側のポートを取得します。
832  NexFacade::StartNatSessionAsync の非同期処理が完了した後に正しい値を取得できます。
833  @return NAT の LAN 側のポート
834  */
835  uint16_t GetNatPropertyInterfacePort() const;
836 
837  /*!
838  @cond PRIVATE
839  @brief NAT トラバーサル処理のタイムアウト基本時間を設定します。
840  @details タイムアウト時間は接続性に大きく影響を与えるため、通常アプリケーションはタイムアウト時間を変更してはいけません。
841  @param[in] timeout タイムアウト時間。単位はミリ秒です。
842  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
843  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。Startup から Cleanup までの区間に呼び出された場合はエラーとなります。
844  @endcond
845  */
846  Result SetNatTraversalTimeout(int32_t timeout);
847 
848  /*!
849  @cond PRIVATE
850  @endcond
851  */
852  int32_t GetNatTraversalTimeout() const
853  {
854  return m_NatTraversalTimeout;
855  }
856 
857  /*!
858  @cond PRIVATE
859  @brief NAT トラバーサル処理の EDM タイムアウト拡張時間を設定します。
860  @details タイムアウト時間は接続性に大きく影響を与えるため、通常アプリケーションはタイムアウト時間を変更してはいけません。
861  @param[in] timeout タイムアウト時間。単位はミリ秒です。
862  @return 関数の実行結果を返します。 処理が失敗した場合、以下を返します。この関数がエラーを返さないようにアプリケーションを実装する必要があります。
863  @retval nn::pia::ResultInvalidState 呼び出すタイミングが間違っています。Startup から Cleanup までの区間に呼び出された場合はエラーとなります。
864  @endcond
865  */
866  Result SetNatTraversalTimeoutEdmExtension(int32_t timeout);
867 
868  /*!
869  @cond PRIVATE
870  @endcond
871  */
872  int32_t GetNatTraversalTimeoutEdmExtension() const
873  {
874  return m_NatTraversalTimeoutEdmExtension;
875  }
876 
877  /*!
878  @brief 自分のプリンシパル ID を取得します。
879  @details プリンシパル ID はゲームサーバーにログインし、@ref Bind() 実行後に取得できるようになります。
880  @return 自分のプリンシパル ID を返します。
881  */
883 
884 #if NN_PIA_CAFE
885  /*!
886  @cond PRIVATE
887  @brief NAT セッション有効時( P2P 通信中)にシステムによるバックグラウンドダウンロード機能を停止するかを設定します。
888  @details isSuspendBossDaemon が true に指定されている場合、@ref StartNATSession() 呼び出し時にシステムによるバックグラウンドダウンロード機能を停止し、
889  @ref StopNATSession() 呼び出し時に有効化します。false が指定されている場合はバックグラウンドダウンロード機能の挙動には影響ありません。
890  また、どちらを指定しても、BOSS ライブラリのフォアグランドダウンロード機能には影響を与えません。
891  true が指定されている場合、ライブラリ内で自動的に ndm の Initialize(), Finalize() を呼び出します。
892 
893  デフォルトは「true(停止する)」です。アプリケーションが直接 ndm の機能を使用する場合は、本関数を用いて
894  @ref StartNATSession() を呼び出す前に設定を false に変更する必要があります。
895 
896  @param[in] isSuspendBossDaemon NAT セッション有効時にシステムによるバックグラウンドダウンロード機能を停止するかどうかを指定します。true の場合、停止します。
897  @endcond
898  */
899  void SetSuspendBossDaemonOnNATSession(bool isSuspendBossDaemon)
900  {
901  m_IsSuspendBossDaemon = isSuspendBossDaemon;
902  }
903 
904  /*!
905  @cond PRIVATE
906  @brief NAT セッション有効時( P2P 通信中)に システムによるバックグラウンドダウンロード機能停止の設定を取得します。
907  @return StartNatSession() 時にシステムによるバックグラウンドダウンロード機能を停止するかどうか
908  @endcond
909  */
910  bool IsSuspendBossDaemonOnNATSession() const
911  {
912  return m_IsSuspendBossDaemon;
913  }
914 #endif
915 
916  /*!
917  @cond PRIVATE
918  @brief Pia 内部処理用 nn::nex::NotificationEventHandler を NgsFacade へ登録します
919 
920  @return 登録の成否
921  @endcond
922  */
923  bool RegisterNexNotificationEventHandler4Pia(nn::nex::NotificationEventHandler* pEventHandler);
924 
925  /*!
926  @cond PRIVATE
927  @brief Pia 内部処理用 nn::nex::NotificationEventHandler を登録解除します
928 
929  @return 登録解除の成否
930  @endcond
931  */
932  bool UnregisterNexNotificationEventHandler4Pia(nn::nex::NotificationEventHandler* pEventHandler);
933 
934  /*!
935  @cond PRIVATE
936  */
937  void SetPersistentGatheringCodeKey();
938  void ClearPersistentGatheringCodeKey();
939  Result SetRelayServiceEnabled(bool isEnabled);
940  bool IsRelayServiceEnabled() const;
941  Result UpdateNatServerAddress();
942  void SetIgnoreNatProbeRequest(bool bIgnore);
943  void NotifyProbeRequest(const transport::StationLocation& requesterLocation);
944  void NotifyLocalServerConnectionId(const ServerConnectionId scid);
945  bool IsTraversed(const transport::StationLocation& targetLocation) const;
946  bool IsTraversed(ServerConnectionId scid) const;
947  bool IsProcessingNatDetection() const;
948  void NotifyLeave(const transport::StationLocation& targetLocation, bool isProbeCleanup, bool isRelayEntryCleanup);
949  bool PrepareNatTraversal(const transport::StationLocation& targetLocation,
950  const transport::StationConnectionInfo& targetConnectionInfo,
951  common::AsyncContext* pContext,
952  bool isInverseConnection,
953  bool isRelayServerUsed,
954  StationIndex targetStationIndex);
955  bool CheckLatestStationLocation(transport::StationLocation& stationLocation);
956  void ResetProbeStatus(const transport::StationLocation& targetLocation, bool bInverseConnection);
957  void ReportNatTraversalResult(const transport::StationLocation& stationLocation, Result result, bool bReport);
958  //! @endcond
959 
960  /*!
961  @cond PRIVATE
962  */
963  virtual uint16_t GetRandomPortRangeMin() const;
964  virtual uint16_t GetRandomPortRangeMax() const;
965  virtual uint16_t GetReservedPort() const;
966  virtual ServerConnectionId GetLocalServerConnectionId() const;
967  virtual void RelayProbeRequest(const transport::StationLocation& targetLocation, const transport::StationLocation& requesterLocation);
968  virtual void UpdateRelayTable();
969  virtual const common::InetAddress& GetRelayServerAddress() const;
970  virtual bool IsBeginMonitoringDataAvailable() const;
971  //! @endcond
972 
973 private:
974  // シングルトンインスタンスへのポインタです。
975  static NexFacade* s_pInstance;
976 
977  static const uint32_t GameServerAccessKeySize = 8;
978 
979  /*!
980  @brief シングルトンパターンのため、コンストラクタは封印します。
981  */
982  NexFacade(void);
983 
984  /*!
985  @brief シングルトンパターンのため、デストラクタは封印します。
986  */
987  virtual ~NexFacade(void);
988 
989  /*!
990  @brief シングルトンパターンのため、コピーコンストラクタは封印します。
991  */
992  NexFacade(const NexFacade&);
993 
994  /*!
995  @brief シングルトンパターンのため、代入演算子は封印します。
996  */
997  NexFacade& operator=(const NexFacade&);
998 
999  Result Initialize();
1000  void Finalize();
1001 
1002 #if NN_PIA_CAFE
1003  void suspendBossDaemon();
1004  void resumeBossDaemon();
1005 #endif
1006 
1007  static void NatTraverserStartupCompletionCallback(Result result, void* pUserContext);
1008  static void NatServerAddressResolveCompletionCallback(Result result, void* pUserContext);
1009  void CompletedNatServerAddressResolution();
1010  void CancelCleanupNatServerAddressResolution();
1011 
1012  uint32_t m_GameServerId;
1013  common::FixedString<GameServerAccessKeySize> m_GameServerAccessKey;
1014  nn::nex::NgsBridgeInterface* m_pNgsInterface;
1015  nn::nex::GatheringID m_GatheringID;
1016 
1017  uint8_t* m_pMatchMakingClientBuffer;
1018  nn::nex::MatchmakeExtensionClient* m_pMatchMakingClient;
1019  nn::nex::MatchmakeSession* m_pMatchmakeSession;
1020 
1021  uint8_t* m_pNatTraversalRelayClientBuffer;
1022  nn::nex::NATTraversalRelayClient* m_pNatTraversalRelayClient;
1023  NexNatRelay* m_pNexNatRelay;
1024 
1025  nat::NatTraverser* m_pNatTraverser;
1026 
1027  common::Socket* m_pSocket;
1028  SocketOutputStream* m_pOutputStream;
1029  SocketInputStream* m_pInputStream;
1030 
1031  bool m_IsStartedUp;
1032  bool m_IsStartedNatSession;
1033  bool m_IsRelayEnabled;
1034 
1035  int32_t m_NatTraversalTimeout;
1036  int32_t m_NatTraversalTimeoutEdmExtension;
1037 
1038 #if NN_PIA_CAFE
1039  bool m_IsSuspendBossDaemon;
1040  int32_t m_NdmInitializeCount;
1041 #endif
1042 
1043  nn::nex::NotificationEventHandler* m_pNexNotificationEventHandler;
1044 
1045  NexNotificationDataJob* m_pNexNotificationDataJob;
1046 
1047  uint8_t m_InternalAsyncProcessType;
1048  common::AsyncContext m_InternalAsyncConext;
1049 
1050  common::AsyncContext m_NatTraverserStartupCallContext;
1051  common::AsyncContext m_NatServerAddressResolveCallContext;
1052  NexNatServerAddressResolveJob* m_pNexNatServerAddressResolveJob;
1053 
1054  nn::nex::StationURL* m_pLocalUrl;
1055  nn::nex::StationURL* m_pUpdatedUrl;
1056 
1057  nn::nex::ProtocolCallContext* m_pReplaceURLCallContext;
1058 
1059  bool m_IsIgnoredNatProbeRequest;
1060  ServerConnectionId m_LocalServerConnectionId;
1061 
1062 #if NN_PIA_CTR
1063  NexBlockListJob* m_pNexBlockListJob;
1064 #endif
1065 };
1066 }
1067 }
1068 } // end of namespace nn::pia::inet
1069 
1070 #endif