CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
pia_Result.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 //Piaにおいて、nn::Result型を利用するためのヘッダです。
15 
16 #pragma once
17 
18 #include <nn/pia/pia_Platform.h>
19 #include <nn/pia/pia_Types.h>
20 
21 
22 //! @cond PRIVATE
23 #define PIA_DEFINE_RESULT(name, handling, viewer, description) \
24  typedef ::nn::pia::ResultConst<(handling), (viewer), (description)> name
25 //! @endcond
26 
27 
28 #if NN_PIA_NINTENDOSDK
29 namespace nn
30 {
31 namespace err
32 {
33  struct ErrorCode; // 先行宣言。
34 }
35 }
36 #endif
37 
38 
39 /*!
40  @namespace nn::pia
41  @brief pia の名前空間です。
42 
43  @details PiaのAPIの多くはスレッドセーフではありません。
44  個々の API リファレンスにおいて、特にスレッドセーフ/アンセーフに
45  ついて言及していないAPIは、基本的にスレッドセーフを保証していません。(スレッドセーフなAPIについての説明は随時追加していく予定です)
46 
47  */
48 namespace nn
49 {
50 namespace pia
51 {
52 
53 
54 /*!
55 @brief 処理の結果を示すクラスです。
56 
57 @ref nn::pia 名前空間に所属する API は、@ref nn::pia::Result クラスの実体を返します。
58 
59 @section section_valueMeanings 値の意味
60 
61 Result は 32ビットの値を持ち、内部にエラーハンドリング方法、ビューア使用の可否、種類の3つの情報を含んでいます。
62 ただしこれらの情報は、将来において変更される可能性があります。
63 
64 @section section_errorHandling エラーハンドリングの例
65 
66 以下の点に注意してください。
67 
68 @subsection section_errorHandling_processingFailures 処理の失敗を判定する
69 
70 処理の結果はシステムのアップデートによって、アプリケーション開発の時点では定義されていなかった値を返す可能性があります。 このようなケースをカバーするためにも、処理の成否は必ず、 IsSuccess() もしくは IsFailure() で判定する必要があります。
71 成否を確認せずに一致判定のみを行うことは、想定外のエラーが発生した際に成功と判定してしまう危険性があるため推奨しません。
72 
73 
74 @attention リファレンスに記載されている Result 以外のものを直接ハンドリングしてはいけません。
75 
76 @section section_unacceptableErrors 製品では発生しないようにするべきエラー
77 
78 例えば ResultInvalidArgument, ResultInvalidState 等はアプリケーション側の不具合などにより発生する Result です。
79 これらの Result は、製品では発生しないように修正する必要があります。
80 
81 上記以外の Result は、ユーザ操作によって発生するものや、開発中に完全に取り除くことが不可能なものになります。 それらのユーザの手元で発生し得るエラーは、必ずハンドリングを行う必要があります。
82 詳細は、各 API のページを参照してください。
83 
84 @section section_handlingUnexpectedErrors 想定外のエラーが発生する場合の対応
85 
86 処理の結果はシステムのアップデートによって、アプリケーション開発の時点では定義されていなかった値を返す可能性があります。
87 このため、想定外のエラーが発生する場合の対応コードはほとんどの場合において必要となります。
88 
89 
90 @section section_unrecoverableFatalErrors 継続不可能な致命的エラー
91 
92 「致命的なエラー」とは、ハードウェア不具合や本来製品で発生し得ないエラーなどシステムが何をしても復帰できず、かつハンドリング不可能なエラーのことを指します。
93 
94 このようなエラーが発生した場合は、原則アプリケーションにエラーが渡されることはなく、システムが停止してFATALエラー画面が表示されます。 このエラー表示に遭遇したユーザーはメッセージに従ってマニュアルを確認し、解決しない場合は最終的にユーザサポートに連絡することになります。
95 
96 システム上エラー表示も不可能な場合はその場で停止します。
97 
98 */
99 class Result
100 {
101 
102 protected:
103  static const uint32_t ValueSuccess = 0; // 0 のみが Success、それ以外は Failure であると規定します。
104 
105  static const int32_t SizeDescription = 10;
106  static const int32_t SizeViewer = 3;
107  static const int32_t SizeHandling = 5;
108 
109  static const int32_t ShiftsDescription = 0;
110  static const int32_t ShiftsViewer = ShiftsDescription + SizeDescription;
111  static const int32_t ShiftsHandling = ShiftsViewer + SizeViewer;
112 
113 #define NN_RESULT_H_MAKE_MASK(size, shift) (((~0u) >> (32 - (size))) << (shift))
114 #define NN_RESULT_H_MAKE_MASK_HELPER(c) \
115  static const uint32_t Mask##c = NN_RESULT_H_MAKE_MASK(Size##c, Shifts##c)
116  NN_RESULT_H_MAKE_MASK_HELPER(Description);
117  NN_RESULT_H_MAKE_MASK_HELPER(Viewer);
118  NN_RESULT_H_MAKE_MASK_HELPER(Handling);
119 #undef NN_RESULT_H_MAKE_MASK_HELPER
120 #undef NN_RESULT_H_MAKE_MASK
121 
122 #define NN_RESULT_H_MAKE_MAX(size) ((~0u) >> (32 - (size)))
123 #define NN_RESULT_H_MAKE_MAX_HELPER(c) \
124  static const int32_t Max##c = NN_RESULT_H_MAKE_MAX(Size##c)
125  NN_RESULT_H_MAKE_MAX_HELPER(Description);
126  NN_RESULT_H_MAKE_MAX_HELPER(Viewer);
127  NN_RESULT_H_MAKE_MAX_HELPER(Handling);
128 #undef NN_RESULT_H_MAKE_MAX_HELPER
129 #undef NN_RESULT_H_MAKE_MAX
130 
131 public:
132  /*!
133  @brief 期待されるハンドリングの種別を表現するための列挙型です。
134  */
136  {
137  HandlingType_Void = 0, //!< 無効な値です。
138  HandlingType_Ignorable, //!< 無視することが可能です。
139  HandlingType_Retry, //!< 少し時間をおいてから再実行してください。
140  HandlingType_Cleanup, //!< クリーンアップ処理を実行してください。@if NIN_DOC ローカル通信では Session::Cleanup() 呼び出しの後 nn::ldn::Finalize() も呼び出す必要があります。 @endif
141  HandlingType_CleanupWithLeave, //!< セッション離脱処理、クリーンアップ処理を順に実行してください。@if NIN_DOC ローカル通信では Session::Cleanup() 呼び出しの後 nn::ldn::Finalize() も呼び出す必要があります。 @endif
142  HandlingType_LogoutWithLeave, //!< セッション離脱処理、クリーンアップ処理、ログアウト処理を順に実行してください。@if NIN_DOC ローカル通信では Session::Cleanup() 呼び出しの後 nn::ldn::Finalize() も呼び出す必要があります。 @endif
143  HandlingType_ShutdownNetwork, //!< クリーンアップ処理、ログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理を順に実行してください。@if NIN_DOC ローカル通信では Session::Cleanup() 呼び出しの後 nn::ldn::Finalize() も呼び出す必要があります。 @endif
144  HandlingType_Finalize, //!< クリーンアップ処理、ログアウト処理(インターネット通信時限定)、ネットワークのシャットダウン処理、Pia の終了処理を順に実行してください。@if NIN_DOC ローカル通信では Session::Cleanup() 呼び出しの後 nn::ldn::Finalize() も呼び出す必要があります。 @endif
145  HandlingType_ProgrammingError //!< プログラミングエラーです。ソースコードを修正してください。
146  };
147 
148  /*!
149  @if CTR_DOC
150  @brief エラー・EULA アプレット使用の指針を表現するための列挙型です。
151  @elseif CAFE_DOC
152  @brief エラービューア使用の指針を表現するための列挙型です。
153  @elseif NIN_DOC
154  @brief エラービューアアプレット使用の指針を表現するための列挙型です。
155  @endif
156  */
158  {
159  ViewerType_Void = 0, //!< 無効な値です。
160  ViewerType_ShouldUse, //!< 使用すべきです。
161  ViewerType_MayUse, //!< 使用しても構いません。
162  ViewerType_ShouldNotUse //!< 使用すべきではありません。
163  };
164 
165  /*!
166  @brief Pia の汎用 Result を示す列挙型です。
167  */
169  {
170  Description_Success = 0, //!< 成功しました
171  Description_AllocationFailed, //!< メモリなどのリソースの確保に失敗したことを示します。
172  Description_AlreadyInitialized, //!< 既に初期化は完了しています。
173  Description_BrokenData, //!< 通信回線を経由してきたデータが壊れている、あるいは改ざんの疑いがあることを示すエラーです。
174  Description_BufferShortage, //!< 引数で渡されたバッファのサイズが不足しています。
175  Description_Cancelled, //!< 非同期処理のキャンセルが要求されました。
176  Description_NetworkConnectionIsLost, //!< 接続が切れたことを表します。
177  Description_InvalidArgument, //!< APIに渡した引数が誤っています。
178  Description_InvalidState, //!< APIを呼び出すタイミングが誤っています。ライブラリの状態が、このResultを返したAPIを呼び出せる状態ではなかったことを示します。
179  Description_NoData, //!< データが存在しません。
180  Description_NotFound, //!< 要求されたものが見つかりませんでした。
181  Description_NotImplemented, //!< 未実装であることを示します。
182  Description_NotInitialized, //!< 初期化されていません。
183  Description_BufferIsFull, //!< 処理を実行するのに必要なバッファが一時的に不足していたために失敗しました。ネットワークトラフィックの混雑が原因の場合もあります。時間をあけてから再度実行すれば、成功する可能性があります。
184  Description_TimeOut, //!< 非同期処理がタイムアウトしました。
185  Description_AlreadyExists, //!< 対象は既に存在しています。
186  Description_ContainerIsFull, //!< コンテナは既に満杯です。
187  Description_TemporaryUnavailable, //!< 一時的に利用できない状態です。
188  Description_NotSet = Description_TemporaryUnavailable + 2, //!< 事前に設定されているべき値が設定されていません。
189  Description_MemoryLeak, //!< PIAライブラリ内部でのメモリリーク疑いです。
190  Description_InvalidNode = Description_MemoryLeak + 2, //!< 対象のノードがネットワークに存在しません。
191  Description_NegligibleFault = Description_InvalidNode + 2, //!< 無視可能な失敗です。
192  Description_InvalidConnection, //!< ネットワークに接続されていません。
193  Description_ErrorOccurred = Description_InvalidConnection + 2, //!< エラーが発生しました。
194  Description_NetworkIsNotFound, //!< 接続できないネットワークです。
195  Description_NetworkIsFull, //!< ネットワークが満員でした。
196  Description_LocalLowerVersion, //!< 自分のバージョンが通信相手のバージョンよりも低いです。
197  Description_LocalHigherVersion, //!< 自分のバージョンが通信相手のバージョンよりも高いです。
198  Description_WifiOff, //!< 無線がオフになっています。
199  Description_Sleep, //!< スリープ状態です。
200  Description_WirelessControllerCountLimitation, //!< 無線コントローラの接続台数が制限を超えています。
201  Description_ConnectionFailed, //!< @cond PRIVATE 接続に失敗しました。@endcond
202  Description_CreateStationFailed, //!< @cond PRIVATE Station 作成に失敗しました。@endcond
203  Description_VersionMismatched, //!< 通信方式バージョン番号が異なります。
204  Description_IsNotInCommunication, //!< 通信中ではありません。
205  Description_TableIsFull, //!< @cond PRIVATE テーブルは既に満杯のため、これ以上エントリを追加することはできません。@endcond
206  Description_SyncDataIsNotArrivedYet = 44, //!< 全 Station のデータが揃っていません。
207  Description_SyncDataIsNotSet = 50, //!< 送信データが設定されていません。
208  Description_NatCheckFailed = 52, //!< NAT チェックに失敗しました。
209  Description_InUsed, //!< @cond PRIVATE すでに使用中のため使用できません。@endcond
210  Description_DnsFailed, //!< NAT チェック前に行う DNS 名前解決に失敗しました。
211  Description_NexInternalError, //!< ゲームサーバが想定外のリザルトコードを返したことを示します。
212  Description_RequestDenied, //!< 要求が拒否されました。
213  Description_StationConnectionFailed, //!< Station 間の接続に失敗しました。
214  Description_MeshIsFull = Description_StationConnectionFailed + 4, //!< メッシュが満員でした。
215  Description_InvalidMessage, //!< 不正なシステムメッセージを処理しました。
216  Description_NatTraversalFailedUnknown, //!< Station 間の接続に失敗しました。NAT タイプは不明でした。
217  Description_NatTraversalFailedLocalEimRemoteEim = Description_NatTraversalFailedUnknown + 3, //!< Station 間の接続に失敗しました。Local, Remote 共に NAT タイプは EIM でした。
218  Description_NatTraversalFailedLocalEimRemoteEdm, //!< Station 間の接続に失敗しました。Local の NAT タイプは EIM, Remote の NAT タイプは EDM でした。
219  Description_NatTraversalFailedLocalEdmRemoteEim, //!< Station 間の接続に失敗しました。Local の NAT タイプは EDM, Remote の NAT タイプは EIM でした。
220  Description_NatTraversalFailedLocalEdmRemoteEdm, //!< Station 間の接続に失敗しました。Local, Remote 共に NAT タイプは EDM でした。
221  Description_RelayFailedNoCandidate, //!< リレー接続に失敗しました。(リレー候補がいなかったため)
222  Description_RelayFailedRttLimit, //!< リレー接続に失敗しました。( RTT 制限を超えたため)
223  Description_RelayFailedRelayNumLimit, //!< リレー接続に失敗しました。(リレー数制限を超えたため)
224  Description_RelayFailedUnknown, //!< リレー接続に失敗しました。(詳細不明)
225  Description_NatTraversalRequestTimeout, //!< Station 間の接続に失敗しました。NAT トラバーサル要求がタイムアウトしました。
226  Description_SessionIsNotFound, //!< 存在しないセッションでした。
227  Description_MatchmakeSessionIsFull, //!< マッチメイクセッションが満員でした。
228  Description_DeniedByParticipants, //!< 自分をブラックリストに登録しているユーザーが参加していました。
229  Description_ParticipantInBlocklist, //!< ブロックリストに登録されているユーザーが参加していました。
230  Description_GameServerMaintenance, //!< サーバーメンテナンス中です。
231  Description_MeshConnectionIsLost, //!< @cond PRIVATE メッシュが切断状態です。@endcond
232  Description_SessionUserPasswordUnmatch, //!< ユーザーパスワードがセットされているセッションに参加しようとしましたがユーザーパスワードが一致しませんでした。
233  Description_SessionSystemPasswordUnmatch, //!< システムパスワードがセットされているセッションに参加しようとしましたがシステムパスワードが一致しませんでした。
234  Description_SessionIsClosed, //!< 参加しようとしたセッションが締め切られていました。
235  Description_CompanionStationIsOffline, //!< ジョイントセッション時に同行者として参加させようとしたステーションがサーバーにログインしていませんでした。
236  Description_HostIsNotFriend, //!< 参加しようとしたセッションのホストとフレンド関係がありませんでした。
237  Description_SessionConnectionIsLost, //!< セッションが切断状態です。
238  Description_CompanionStationIsLeft, //!< ジョイントセッション時に同行者として指定したステーションが切断していました。
239  Description_SessionMigrationFailed = Description_CompanionStationIsLeft + 2, //!< ジョイントセッション時にセッション移行に必要な処理に失敗しました。
240  Description_GameServerProcessAborted, //!< ゲームサーバーへの処理が異常終了しました。
241  Description_SessionWrongState, //!< 参加したセッションの状態が異常でした。
242  Description_CreateCommunityFailedUpperLimit = Description_SessionWrongState + 4, //!< コミュニティの作成上限を超えました。
243  Description_JoinCommunityFailedUpperLimit, //!< コミュニティの参加上限を超えました。
244  Description_CommunityIsFull, //!< 参加しようとしたコミュニティが満員でした。
245  Description_CommunityIsNotFound, //!< 存在しないコミュニティでした。
246  Description_CommunityIsClosed, //!< 参加しようとしたコミュニティが参加可能期間外でした。
247  Description_AlreadyJoinedCommunity, //!< 参加しようとしたコミュニティに既に参加していた。
248  Description_UserAccountNotExisted, //!< ユーザーアカウントが存在しませんでした。
249  Description_CommunityUserPasswordUnmatch, //!< 参加時に指定したユーザーパスワードがコミュニティに設定されたユーザーパスワードと一致しませんでした。
250  Description_NatTraversalFailedLocalEimRemoteEimSamePublicAddress, //!< Station 間の接続に失敗しました。Local, Remote 共に NAT タイプは EIM でした。また、Local と Remote は同じグローバルIPアドレスでした。
251  Description_NatTraversalFailedLocalEimRemoteEdmSamePublicAddress, //!< Station 間の接続に失敗しました。Local の NAT タイプは EIM, Remote の NAT タイプは EDM でした。また、Local と Remote は同じグローバルIPアドレスでした。
252  Description_NatTraversalFailedLocalEdmRemoteEimSamePublicAddress, //!< Station 間の接続に失敗しました。Local の NAT タイプは EDM, Remote の NAT タイプは EIM でした。また、Local と Remote は同じグローバルIPアドレスでした。
253  Description_NatTraversalFailedLocalEdmRemoteEdmSamePublicAddress, //!< Station 間の接続に失敗しました。Local, Remote 共に NAT タイプは EDM でした。また、Local と Remote は同じグローバルIPアドレスでした。
254  Description_SdkError, //!< SDK の API 呼び出しに失敗しました。
255  Description_SdkViewerErrorCodeError, //!< SDK の API 呼び出しに失敗しました。nn::pia::Result::GetErrorCode() で取得できるエラーコードは SDK のものになります。
256  Description_CancelledByUser, //!< ユーザー操作に従って処理を中断しました。
257  Description_SdkViewerResultError, //!< SDK の API 呼び出しに失敗しました。nn::pia::framework::Framework::GetLastSdkResult() で nn::Result を取得し、エラービューアアプレットを使用して適切にハンドリングして下さい。
258  Description_LanLowerVersion, //!< 自分のバージョンが通信相手のバージョンよりも低いです。
259  Description_LanHigherVersion, //!< 自分のバージョンが通信相手のバージョンよりも高いです。
260  Description_DuplicateLogin, //!< @if NIN_DOC 他の本体から同じアカウントを使ってログインされたため、サーバーから切断されました。@endif
261  Description_OnlinePlayLicenseNotAvailable, //!< @if NIN_DOC ネットワークサービスの利用権限がありません。@endif
262  Description_OnlinePlayLicenseError //!< @if NIN_DOC ネットワークサービスが利用できません。@endif
263  };
264 
265 #if NN_PIA_CTR
266  static const uint32_t PiaErrorCodeBase = 180000; // CTR-Piaには 018-xxxx が割り当てられている。
267 #elif NN_PIA_WIN
268  static const uint32_t PiaErrorCodeBase = 180000; // 数値はCTRに合わせているが、Windows環境でエラー表示アプレットが用いられることはあるだろうか?
269 #elif NN_PIA_CAFE
270  static const uint32_t PiaErrorCodeBase = 1180000; // Cafe-Piaには 118-xxxx が割り当てられている。
271 #elif NN_PIA_NINTENDOSDK
272  static const uint32_t PiaErrorCodeBase = 26180000; // NX-Pia には 2618-xxxx が割り当てられている。
273 #elif NN_PIA_A
274  static const uint32_t PiaErrorCodeBase = 26180000;
275 #elif NN_PIA_B
276  static const uint32_t PiaErrorCodeBase = 26180000;
277 #else
278 #error "invalid platform"
279 #endif
280 
281  /*!
282  @cond PRIVATE
283  @brief ゲームサーバとの通信で発生したエラーのネットワークエラーコードをセットします。
284 
285  @param[in] code NEX の qResult をネットワークエラーコードに変換した値をセットします。
286  @endcond
287  */
288 #if NN_PIA_NINTENDOSDK
289  static void SetNexNetworkErrorCode(const nn::err::ErrorCode& code);
290 #else
291  static void SetNexNetworkErrorCode(uint32_t code);
292 #endif
293 
294  /*!
295  @cond PRIVATE
296  @brief SetNexNetworkErrorCode() でセットされたネットワークエラーコードをクリアします。
297  @endcond
298  */
299  static void ClearNexNetworkErrorCode(void);
300 
301 
302  /*!
303  @cond PRIVATE
304  @brief SDK の API 呼び出し失敗によるエラーコードをセットします。
305 
306  @param[in] code SDK のエラーコードです。
307  @endcond
308  */
309  static void SetSdkErrorCode(uint32_t code)
310  {
311  s_SdkErrorCode = code;
312  }
313 
314 
315  /*!
316  @cond PRIVATE
317  @brief SetSdkErrorCode() でセットされたエラーコードをクリアします。
318  @endcond
319  */
320  static void ClearSdkErrorCode(void)
321  {
322  s_SdkErrorCode = 0;
323  }
324 
325 private:
326  uint32_t m_Code;
327 #if NN_PIA_NINTENDOSDK
328  static nn::err::ErrorCode s_NexNetworkErrorCode;
329 #else
330  static uint32_t s_NexNetworkErrorCode;
331 #endif
332  static uint32_t s_SdkErrorCode;
333 
334 protected:
335  explicit Result(uint32_t code)
336  : m_Code(code)
337  {
338  }
339 
340 public:
341  Result()
342  : m_Code(ValueSuccess)
343  {
344  }
345 
346  Result(const Result& r)
347  : m_Code(r.m_Code)
348  {
349  }
350 
351  Result(HandlingType handling, ViewerType viewer, Description description)
352  : m_Code(static_cast<uint32_t>(
353  ((static_cast<uint32_t>(handling) << ShiftsHandling) & MaskHandling) |
354  ((static_cast<uint32_t>(viewer) << ShiftsViewer) & MaskViewer) |
355  ((static_cast<uint32_t>(description) << ShiftsDescription) & MaskDescription)))
356  {
357  }
358 
359  /*!
360  @name 判定
361  @{
362  */
363  /*!
364  * @brief ! IsSuccess() を返します。
365  */
366  bool IsFailure() const
367  {
368  return !IsSuccess();
369  }
370 
371  /*!
372  * @brief 処理の結果が成功なら true を、失敗なら false を返します。
373  */
374  bool IsSuccess() const
375  {
376  return m_Code == ValueSuccess;
377  }
378  /*!
379  @}
380  */
381 
382  /*!
383  * @brief エラーの詳細を示す Description 列挙体を返します。
384  *
385  * 列挙体の定義は将来変更されます。開発時のエラー内容確認の用途以外では利用してはいけません。
386  */
388  {
389  return static_cast<enum Description>(GetCodeBits(MaskDescription, ShiftsDescription));
390  }
391 
392  uint32_t GetValue() const
393  {
394  return m_Code;
395  }
396 
397  /*!
398  @name 判定
399  @{
400  */
401  /*!
402  * @brief 一致判定を行います。
403  *
404  * @param [in] rhs 演算子の右オペランドです。
405  * @return 一致した場合に true を、一致しない場合に false を返します。
406  */
407  bool operator==(const Result& rhs) const
408  {
409  return this->m_Code == rhs.m_Code;
410  }
411 
412  /*!
413  * @brief 不一致判定を行います。
414  *
415  * @param [in] rhs 演算子の右オペランドです。
416  * @return 一致しない場合に true を、一致する場合に false を返します。
417  */
418  bool operator!=(const Result& rhs) const
419  {
420  return this->m_Code != rhs.m_Code;
421  }
422  /*!
423  @}
424  */
425 
426 
427  /*!
428  @brief Pia の Result に対して期待されるハンドリングの種別を返します。
429 
430  @return Result に応じたハンドリングの列挙値が返されます。
431  Pia 以外の Result や、Pia 内部でのみ使用される Result を
432  渡した場合は HandlingType_Void が返されます。
433  */
435  {
436  return static_cast<enum HandlingType>(GetCodeBits(MaskHandling, ShiftsHandling));
437  }
438 
439 
440  /*!
441  @if CTR_DOC
442  @brief エラー・EULA アプレットを使用しても良い Pia の Result であるかどうかを判定します。
443  @details Pia API 呼び出しで失敗の Result が返された場合に、その Result から
444  GetErrorCode で取得したエラーコードを
445  エラー・EULA アプレット
446  に渡すのが適切かどうかを判定する API です。
447  @details ただし、ローカル通信時に返された Result については、この API の返り値にかかわらず、
448  エラー・EULA アプレットを使用してはいけません。
449  @endif
450  @if CAFE_DOC
451  @brief エラービューアを使用しても良い Pia の Result であるかどうかを判定します。
452  @details Pia API 呼び出しで失敗の Result が返された場合に、その Result から
453  GetErrorCode で取得したエラーコードを
454  エラービューア
455  に渡すのが適切かどうかを判定する API です。
456  @endif
457  @if NIN_DOC
458  @brief エラービューアアプレットを使用しても良い Pia の Result であるかどうかを判定します。
459  @details Pia API 呼び出しで失敗の Result が返された場合に、その Result から
460  GetErrorCode で取得したエラーコードを
461  エラービューアアプレット
462  に渡すのが適切かどうかを判定する API です。
463  @endif
464 
465  @return 渡された Result に応じた ViewerType が返されます。
466  Pia 以外の Result が渡された場合は ViewerType_Void が返されます。
467  */
469  {
470  return static_cast<enum ViewerType>(GetCodeBits(MaskViewer, ShiftsViewer));
471  }
472 
473 #if !NN_PIA_NINTENDOSDK
474  /*!
475  @brief Result に対応するエラーコードを得ます。
476 
477  @details Pia ライブラリが返した Result に対応するエラーコードを得ます。
478  @details 例外的に、 ResultNexInternalError に対して本 API を呼び出すと、この Result の
479  原因となった NEX の内部エラーに対応するエラーコードが返されます。
480  この内部エラーには複数の種類があるため、 ResultNexInternalError に対応する
481  返り値が一定しないことがあります。
482  @if CTR_DOC
483  得られた値は、エラー・EULAアプレットに渡すことができます。
484  @endif
485  @if CAFE_DOC
486  得られた値は、エラービューアに渡すことができます。
487  @endif
488 
489  IsSuccess() が true となる Result に対しては 0 を、Pia ライブラリで定義されていない
490  Result に本 API を適用した場合はアサート停止します(リリースビルドでは PiaErrorCodeBase を返します)。
491  ResultNexInternalError を除いて、本関数は Pia ライブラリで定義されている Result を一意に識別するコードに変換しますが、
492  全てのコードをユーザーにエラーとして表示する必要はありません。
493  エラーコード表示については、
494  @if CTR_DOC
495  CTR ガイドライン インターネット通信編 や、
496  ネットワークエラーコードリスト などのドキュメントも参照してください。
497  @endif
498  @if CAFE_DOC
499  Wii U ガイドラインにおけるエラー表示の章なども参照してください。
500  @endif
501 
502  @return エラーコードが返されます。
503  */
504 #endif
505  uint32_t GetErrorCode() const;
506 
507 
508 #if NN_PIA_NINTENDOSDK
509  /*!
510  @brief Result に対応するエラーコードを得ます。
511 
512  @details Pia ライブラリが返した Result に対応するエラーコードを得ます。
513  @details 例外的に、 ResultNexInternalError に対して本 API を呼び出すと、この Result の
514  原因となった NEX の内部エラーに対応するエラーコードが返されます。
515  この内部エラーには複数の種類があるため、 ResultNexInternalError に対応する
516  返り値が一定しないことがあります。
517 
518  得られた値は、エラービューアに渡すことができます。
519 
520  IsSuccess() が true となる Result に対しては、pOut が指すインスタンスにゼロクリアされた値がセットされます。
521  Pia ライブラリで定義されていない Result に本 API を適用した場合はアサート停止します。
522  ResultNexInternalError を除いて、本関数は Pia ライブラリで定義されている Result を一意に識別するコードに変換しますが、
523  全てのコードをユーザーにエラーとして表示する必要はありません。
524 
525  @param[out] pOut nn::err::ErrorCode 型のインスタンスを指すポインタを渡します。
526 
527  @return 成功すれば、IsSuccess() が true となる Result が返されます。
528 
529  @retval ResultInvalidArgument 引数に誤りがあります(ヌルポインタであるなど)プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
530  */
531  Result GetErrorCode(nn::err::ErrorCode* pOut) const;
532 #endif
533 
534 
535  /*!
536  @brief Pia の Result の文字列表現を返します。
537 
538  @return Pia の Result の文字列表現が返されます。
539  */
540  const char* ToString() const;
541 
542 
543 private:
544  uint32_t GetCodeBits(uint32_t mask, int32_t shift) const
545  {
546  return ((m_Code & mask) >> shift);
547  }
548 };
549 
550 
551 /*!
552 @cond PRIVATE
553 @brief 全ての Result のアサート停止の有効/無効を管理します。
554  */
555 struct AssertableResultAll
556 {
557 public:
558  /*!
559  @brief アサート停止を有効にします。
560  */
561  static void EnableAssert()
562  {
563  s_IsAssertEnabled = true;
564  }
565 
566  /*!
567  @brief アサート停止を無効にします。
568  */
569  static void DisableAssert()
570  {
571  s_IsAssertEnabled = false;
572  }
573 
574  /*!
575  @brief アサート停止が有効がどうかを取得します。
576  @return アサート停止が有効なら true 無効なら false を返します。
577  */
578  static bool IsAssertEnabled()
579  {
580  return s_IsAssertEnabled;
581  }
582 
583 private:
584  static bool s_IsAssertEnabled;
585 };
586 //! @endcond
587 
588 
589 /*!
590 @cond PRIVATE
591 @brief 定数型の Result 。ResultSuccess や、いわゆるエラーの Result はこちらのテンプレート型から生成される。
592  アサート停止機能もこのクラスに引っ越しています。
593  */
594 template <Result::HandlingType THandling, Result::ViewerType TViewer, Result::Description TDescription>
595 struct ResultConst : public Result
596 {
597  static const uint32_t Value =
598  static_cast<uint32_t>(
599  ((static_cast<uint32_t>(THandling) << ShiftsHandling) & MaskHandling) |
600  ((static_cast<uint32_t>(TViewer) << ShiftsViewer) & MaskViewer) |
601  ((static_cast<uint32_t>(TDescription) << ShiftsDescription) & MaskDescription));
602 
603  ResultConst()
604  : Result(Value)
605  {
606  }
607 
608  /*!
609  @brief アサート停止を有効にします。
610  */
611  static void EnableAssert()
612  {
613  s_IsAssertEnabled = true;
614  }
615 
616  /*!
617  @brief アサート停止を無効にします。
618  */
619  static void DisableAssert()
620  {
621  s_IsAssertEnabled = false;
622  }
623 
624  /*!
625  @brief アサート停止が有効がどうかを取得します。
626  @return アサート停止が有効なら true 無効なら false を返します。
627  */
628  static bool IsAssertEnabled()
629  {
630  return (s_IsAssertEnabled || AssertableResultAll::IsAssertEnabled());
631  }
632 
633 private:
634  static bool s_IsAssertEnabled;
635 };
636 //! @endcond
637 
638 //! @cond PRIVATE
639 template <Result::HandlingType THandling, Result::ViewerType TViewer, Result::Description TDescription>
640 bool ResultConst<THandling, TViewer, TDescription>::s_IsAssertEnabled = false;
641 //! @endcond
642 
643 
644 /*!
645  @class nn::pia::ResultAllocationFailed
646  @brief メモリなどのリソースの確保に失敗したことを示すリザルトコードです。この Result が返らないようにアプリケーションを実装する必要があります。
647 */
648 PIA_DEFINE_RESULT(
649  ResultAllocationFailed,
653 
654 /*!
655  @class nn::pia::ResultAlreadyInitialized
656  @brief 既に初期化が完了していたことを示すリザルトコードです。この Result が返らないようにアプリケーションを実装する必要があります。
657 */
658 PIA_DEFINE_RESULT(
659  ResultAlreadyInitialized,
663 
664 /*!
665  @class nn::pia::ResultBufferShortage
666  @brief 引数で渡されたバッファのサイズが不足していることを示すリザルトコードです。この Result が返らないようにアプリケーションを実装する必要があります。
667 */
668 PIA_DEFINE_RESULT(
669  ResultBufferShortage,
673 
674 /*!
675  @class nn::pia::ResultBrokenData
676  @brief 通信回線を経由してきたデータが壊れている、あるいは改ざんの疑いがあることを示すリザルトコードです。
677 */
678 PIA_DEFINE_RESULT(
679  ResultBrokenData,
683 
684 /*!
685  @class nn::pia::ResultCancelled
686  @brief 非同期処理のキャンセルが要求されたことを示すリザルトコードです。
687 */
688 PIA_DEFINE_RESULT(
689  ResultCancelled,
693 
694 /*!
695  @class nn::pia::ResultNetworkConnectionIsLost
696  @brief 接続が既に切断されたことを示すリザルトコードです。
697 */
698 PIA_DEFINE_RESULT(
699  ResultNetworkConnectionIsLost,
703 
704 /*!
705  @class nn::pia::ResultInvalidArgument
706  @brief API に渡した引数が誤っていることを示すリザルトコードです。例えば NULL ポインタを渡された等のケースが該当します。この Result が返らないようにアプリケーションを実装する必要があります。
707 */
708 PIA_DEFINE_RESULT(
709  ResultInvalidArgument,
713 
714 
715 /*!
716  @class nn::pia::ResultInvalidState
717  @brief API を呼び出すタイミングが誤っていることを示すリザルトコードです。 Pia ライブラリの状態が、この Result を返したAPIを呼び出せる状態ではなかったことを示します。
718 */
719 PIA_DEFINE_RESULT(
720  ResultInvalidState,
724 
725 /*!
726  @class nn::pia::ResultNoData
727  @brief データが存在しない事を示すリザルトコードです。
728 */
729 PIA_DEFINE_RESULT(
730  ResultNoData,
734 
735 /*!
736  @class nn::pia::ResultNotFound
737  @brief 要求されたものが見つからなかった事を示すリザルトコードです。
738 */
739 PIA_DEFINE_RESULT(
740  ResultNotFound,
744 
745 /*!
746  @class nn::pia::ResultNotImplemented
747  @brief 機能が未実装であることを示すリザルトコードです。この Result が返らないようにアプリケーションを実装する必要があります。
748 */
749 PIA_DEFINE_RESULT(
750  ResultNotImplemented,
754 
755 
756 /*!
757  @class nn::pia::ResultNotInitialized
758  @brief 関数を呼びだしたオブジェクトやモジュールが未初期化であった事を示すリザルトコードです。この Result が返らないようにアプリケーションを実装する必要があります。
759 */
760 PIA_DEFINE_RESULT(
761  ResultNotInitialized,
765 
766 /*!
767  @class nn::pia::ResultBufferIsFull
768  @brief 処理を実行するのに必要なバッファが一時的に不足していたために失敗したことを示すリザルトコードです。ネットワークトラフィックの混雑によって引き起こされることもあります。時間をあけてから再度実行すれば、成功する可能性があります。
769 */
770 PIA_DEFINE_RESULT(
771  ResultBufferIsFull,
775 
776 /*!
777  @class nn::pia::ResultTimeOut
778  @brief 非同期処理がタイムアウトしたことを示すリザルトコードです。
779 */
780 PIA_DEFINE_RESULT(
781  ResultTimeOut,
785 
786 /*!
787  @class nn::pia::ResultAlreadyExists
788  @brief 対象は既に存在していたことを示すリザルトコードです。
789 */
790 PIA_DEFINE_RESULT(
791  ResultAlreadyExists,
795 
796 /*!
797  @class nn::pia::ResultContainerIsFull
798  @brief コンテナは満杯であることを示すリザルトコードです。
799 */
800 PIA_DEFINE_RESULT(
801  ResultContainerIsFull,
805 
806 /*!
807  @class nn::pia::ResultTemporaryUnavailable
808  @brief API が一時的に利用できない状態であることを示すリザルトコードです。
809 */
810 PIA_DEFINE_RESULT(
811  ResultTemporaryUnavailable,
815 
816 /*!
817  @class nn::pia::ResultNotSet
818  @brief 事前に設定されているべき値が設定されていなかったことを示すリザルトコードです。
819 */
820 PIA_DEFINE_RESULT(
821  ResultNotSet,
825 
826 
827 /*!
828  @class nn::pia::ResultMemoryLeak
829  @brief Pia ライブラリ内部のメモリリーク疑いを表現するリザルトコードです。
830 */
831 PIA_DEFINE_RESULT(
832  ResultMemoryLeak,
836 
837 /*!
838  @cond PRIVATE
839  @class nn::pia::ResultInvalidNode
840  @brief 【システム用エラー】送信先のノードがネットワーク上に見つからなかったことを示します。
841 */
842 PIA_DEFINE_RESULT(
843  ResultInvalidNode,
847 //! @endcond
848 
849 /*!
850  @class nn::pia::ResultNegligibleFault
851  @brief 無視可能なエラーを表します。
852 */
853 PIA_DEFINE_RESULT(
854  ResultNegligibleFault,
858 
859 /*!
860  @class nn::pia::ResultInvalidConnection
861  @if NIN_DOC
862  @brief 接続状態が不正であることを表します。
863  @else
864  @brief 接続状態が不正であることや、無線オフモードになっていることを表します。
865  @endif
866 */
867 PIA_DEFINE_RESULT(
868  ResultInvalidConnection,
872 
873 /*!
874  @class nn::pia::ResultErrorOccurred
875  @brief 内部でエラーが発生したことを表します。
876 */
877 PIA_DEFINE_RESULT(
878  ResultErrorOccurred,
882 
883 /*!
884  @cond PRIVATE
885  @class nn::pia::ResultNetworkIsNotFound
886  @brief 【システム用エラー】接続できないネットワークであることを表します。
887 */
888 PIA_DEFINE_RESULT(
889  ResultNetworkIsNotFound,
893 //! @endcond
894 
895 /*!
896  @class nn::pia::ResultNetworkIsFull
897  @brief ネットワークが満員でした。
898 */
899 PIA_DEFINE_RESULT(
900  ResultNetworkIsFull,
904 
905 /*!
906  @class nn::pia::ResultLocalLowerVersion
907  @brief 自分のバージョンが通信相手のバージョンよりも低いことを表します。
908 */
909 PIA_DEFINE_RESULT(
910  ResultLocalLowerVersion,
914 
915 /*!
916  @class nn::pia::ResultLocalHigherVersion
917  @brief 自分のバージョンが通信相手のバージョンよりも高いことを表します。
918 */
919 PIA_DEFINE_RESULT(
920  ResultLocalHigherVersion,
924 
925 /*!
926  @class nn::pia::ResultWifiOff
927  @brief 無線がオフになっていることを示すリザルトコードです。
928 */
929 PIA_DEFINE_RESULT(
930  ResultWifiOff,
934 
935 /*!
936  @class nn::pia::ResultSleep
937  @brief スリープ状態であることを示すリザルトコードです。
938 */
939 PIA_DEFINE_RESULT(
940  ResultSleep,
944 
945 /*!
946 @class nn::pia::ResultWirelessControllerCountLimitation
947 @brief 無線コントローラの接続台数が制限を超えていることを示すリザルトコードです。
948 */
949 PIA_DEFINE_RESULT(
950  ResultWirelessControllerCountLimitation,
954 
955 /*!
956  @cond PRIVATE
957  @class nn::pia::ResultConnectionFailed
958  @brief 【システム用エラー】何らかの理由で接続処理に失敗しました。
959  この Result がアプリに伝達されることはありません。
960 */
961 PIA_DEFINE_RESULT(
962  ResultConnectionFailed,
965  Result::Description_ConnectionFailed);
966 //! @endcond
967 
968 /*!
969  @cond PRIVATE
970  @class nn::pia::ResultCreateStationFailed
971  @brief 【システム用エラー】新しい Station を作成できませんでした。
972  この Result がアプリに伝達されることはありません。
973 */
974 PIA_DEFINE_RESULT(
975  ResultCreateStationFailed,
978  Result::Description_CreateStationFailed);
979 //! @endcond
980 
981 /*!
982  @class nn::pia::ResultIncompatibleFormat
983  @brief 非互換の通信形式です。
984 */
985 PIA_DEFINE_RESULT(
986  ResultIncompatibleFormat,
990 
991 /*!
992  @class nn::pia::ResultNotInCommunication
993  @brief 通信中ではありません。
994 */
995 PIA_DEFINE_RESULT(
996  ResultNotInCommunication,
1000 
1001 /*!
1002  @cond PRIVATE
1003  @class nn::pia::ResultTableIsFull
1004  @brief 【システム用エラー】テーブルは既に満杯のため、これ以上エントリを追加することはできません。
1005  この Result がアプリに伝達されることはありません。
1006 */
1007 PIA_DEFINE_RESULT(
1008  ResultTableIsFull,
1011  Result::Description_TableIsFull);
1012 //! @endcond
1013 
1014 /*!
1015  @class nn::pia::ResultDataIsNotArrivedYet
1016  @brief 全 Station のデータが揃っていません
1017 
1018  @details このエラーは通信状態の悪化などの理由で、データの同期に問題が生じた際に発生します。<br>
1019  このエラーを返した場合、アプリケーションはゲームの進行を止めて次のピクチャフレームを待つ必要があります。<br>
1020  全ての Station が同じタイミングで、同じ回数このエラーに遭遇する訳ではないことに注意してください。
1021 */
1022 PIA_DEFINE_RESULT(
1023  ResultDataIsNotArrivedYet,
1027 
1028 
1029 /*!
1030  @class nn::pia::ResultDataIsNotSet
1031  @brief 送信データが設定されていません。
1032 */
1033 PIA_DEFINE_RESULT(
1034  ResultDataIsNotSet,
1038 
1039 
1040 /*!
1041  @class nn::pia::ResultNatCheckFailed
1042  @brief NAT チェックに失敗しました。
1043 */
1044 PIA_DEFINE_RESULT(
1045  ResultNatCheckFailed,
1049 
1050 /*!
1051  @cond PRIVATE
1052  @class nn::pia::ResultInUse
1053  @brief すでに使用中のため使用できません。
1054 */
1055 PIA_DEFINE_RESULT(
1056  ResultInUse,
1059  Result::Description_InUsed);
1060 //!@endcond
1061 
1062 
1063 /*!
1064  @class nn::pia::ResultDnsFailed
1065  @brief DNS 解決に失敗しました。
1066 */
1067 PIA_DEFINE_RESULT(
1068  ResultDnsFailed,
1072 
1073 
1074 /*!
1075  @class nn::pia::ResultNexInternalError
1076  @brief NEX 内部エラーが発生しました。
1077 */
1078 PIA_DEFINE_RESULT(
1079  ResultNexInternalError,
1083 
1084 
1085 /*!
1086  @class nn::pia::ResultJoinRequestDenied
1087  @brief セッションホストによって Join 要求が拒否されました。
1088 */
1089 PIA_DEFINE_RESULT(
1090  ResultJoinRequestDenied,
1094 
1095 
1096 /*!
1097  @class nn::pia::ResultStationConnectionFailed
1098  @brief Station 間の接続処理に失敗しました。
1099 */
1100 PIA_DEFINE_RESULT(
1101  ResultStationConnectionFailed,
1105 
1106 
1107 /*!
1108  @class nn::pia::ResultMeshIsFull
1109  @brief Join 要求を出したメッシュが満員で、参加できませんでした。
1110 */
1111 PIA_DEFINE_RESULT(
1112  ResultMeshIsFull,
1116 
1117 
1118 /*!
1119  @class nn::pia::ResultInvalidSystemMessage
1120  @brief Join 要求への応答に不正なメッセージが返されました。
1121 */
1122 PIA_DEFINE_RESULT(
1123  ResultInvalidSystemMessage,
1127 
1128 /*!
1129  @class nn::pia::ResultStationConnectionNatTraversalFailedUnknown
1130  @brief Station 間の NAT トラバーサル処理に失敗しました。NAT タイプは不明でした。
1131 */
1132 PIA_DEFINE_RESULT(
1133  ResultStationConnectionNatTraversalFailedUnknown,
1137 
1138 /*!
1139  @class nn::pia::ResultNatTraversalFailedBothEim
1140  @brief Station 間の NAT トラバーサル処理に失敗しました。Local, Remote 共に NAT タイプは EIM でした。
1141 */
1142 PIA_DEFINE_RESULT(
1143  ResultNatTraversalFailedBothEim,
1147 
1148 /*!
1149  @class nn::pia::ResultNatTraversalFailedLocalEimRemoteEdm
1150  @brief Station 間の NAT トラバーサル処理に失敗しました。Local の NAT タイプは EIM, Remote の NAT タイプは EDM でした。
1151 */
1152 PIA_DEFINE_RESULT(
1153  ResultNatTraversalFailedLocalEimRemoteEdm,
1157 
1158 /*!
1159  @class nn::pia::ResultNatTraversalFailedLocalEdmRemoteEim
1160  @brief Station 間の NAT トラバーサル処理に失敗しました。Local の NAT タイプは EDM, Remote の NAT タイプは EIM でした。
1161 */
1162 PIA_DEFINE_RESULT(
1163  ResultNatTraversalFailedLocalEdmRemoteEim,
1167 
1168 /*!
1169  @class nn::pia::ResultNatTraversalFailedBothEdm
1170  @brief Station 間の NAT トラバーサル処理に失敗しました。Local, Remote 共に NAT タイプは EDM でした。
1171 */
1172 PIA_DEFINE_RESULT(
1173  ResultNatTraversalFailedBothEdm,
1177 
1178 
1179 /*!
1180  @class nn::pia::ResultRelayFailedNoCandidate
1181  @brief リレー接続に失敗しました。(リレー候補がいなかったため)
1182 */
1183 PIA_DEFINE_RESULT(
1184  ResultRelayFailedNoCandidate,
1188 
1189 /*!
1190  @class nn::pia::ResultRelayFailedRttLimit
1191  @brief リレー接続に失敗しました。( RTT 制限を超えたため)
1192 */
1193 PIA_DEFINE_RESULT(
1194  ResultRelayFailedRttLimit,
1198 /*!
1199  @class nn::pia::ResultRelayFailedRelayNumLimit
1200  @brief リレー接続に失敗しました。(リレー数制限を超えたため)
1201 */
1202 PIA_DEFINE_RESULT(
1203  ResultRelayFailedRelayNumLimit,
1207 /*!
1208  @class nn::pia::ResultRelayFailedUnknown
1209  @brief リレー接続に失敗しました。(詳細不明)
1210 */
1211 PIA_DEFINE_RESULT(
1212  ResultRelayFailedUnknown,
1216 
1217 /*!
1218  @class nn::pia::ResultNatTraversalRequestTimeout
1219  @brief Station 間の NAT トラバーサル処理に失敗しました。NAT トラバーサル要求がタイムアウトしました。
1220 */
1221 PIA_DEFINE_RESULT(
1222  ResultNatTraversalRequestTimeout,
1226 
1227 /*!
1228  @class nn::pia::ResultSessionIsNotFound
1229  @brief 既に存在していないセッションになっていました。
1230 */
1231 PIA_DEFINE_RESULT(
1232  ResultSessionIsNotFound,
1236 
1237 /*!
1238  @class nn::pia::ResultMatchmakeSessionIsFull
1239  @brief 満員のマッチメイクセッションに参加しようとしました。
1240 */
1241 PIA_DEFINE_RESULT(
1242  ResultMatchmakeSessionIsFull,
1246 
1247 /*!
1248  @class nn::pia::ResultDeniedByParticipants
1249  @brief 自分をブラックリストに登録しているユーザーが参加していました。
1250 */
1251 PIA_DEFINE_RESULT(
1252  ResultDeniedByParticipants,
1256 
1257 /*!
1258  @class nn::pia::ResultParticipantInBlockList
1259  @brief ブロックリストに登録しているユーザーが参加していました。
1260 */
1261 PIA_DEFINE_RESULT(
1262  ResultParticipantInBlockList,
1266 
1267 /*!
1268  @class nn::pia::ResultGameServerMaintenance
1269  @brief ゲームサーバーがメンテナンス中です。
1270 */
1271 PIA_DEFINE_RESULT(
1272  ResultGameServerMaintenance,
1276 
1277 /*!
1278  @class nn::pia::ResultSessionUserPasswordUnmatch
1279  @brief ユーザーパスワードがセットされているセッションに参加しようとしましたがユーザーパスワードが一致しませんでした。
1280 */
1281 PIA_DEFINE_RESULT(
1282  ResultSessionUserPasswordUnmatch,
1286 
1287 /*!
1288  @class nn::pia::ResultSessionSystemPasswordUnmatch
1289  @brief システムパスワードがセットされているセッションに参加しようとしましたがシステムパスワードが一致しませんでした。
1290 */
1291 PIA_DEFINE_RESULT(
1292  ResultSessionSystemPasswordUnmatch,
1296 
1297 /*!
1298  @cond PRIVATE
1299  @class nn::pia::ResultMeshConnectionIsLost
1300  @brief 【システム用エラー】メッシュが切断状態になりました。
1301 */
1302 PIA_DEFINE_RESULT(
1303  ResultMeshConnectionIsLost,
1306  Result::Description_MeshConnectionIsLost);
1307 //! @endcond
1308 
1309 /*!
1310  @class nn::pia::ResultSessionIsClosed
1311  @brief 参加しようとしたセッションが締め切られていました。
1312 */
1313 PIA_DEFINE_RESULT(
1314  ResultSessionIsClosed,
1318 
1319 /*!
1320  @class nn::pia::ResultCompanionStationIsOffline
1321  @brief (ジョイントセッション用)追加で参加させようとしたステーションがサーバーにログインしていませんでした。
1322 */
1323 PIA_DEFINE_RESULT(
1324  ResultCompanionStationIsOffline,
1328 
1329 /*!
1330  @class nn::pia::ResultHostIsNotFriend
1331  @brief 参加しようとしたセッションのホストとフレンド関係がありませんでした。
1332 */
1333 PIA_DEFINE_RESULT(
1334  ResultHostIsNotFriend,
1338 
1339 
1340 /*!
1341  @class nn::pia::ResultSessionConnectionIsLost
1342  @brief セッションが切断されました。
1343 */
1344 PIA_DEFINE_RESULT(
1345  ResultSessionConnectionIsLost,
1349 
1350 /*!
1351  @class nn::pia::ResultCompanionStationIsLeft
1352  @brief ジョイントセッション時に同行者として指定したステーションが切断していました。
1353 */
1354 PIA_DEFINE_RESULT(
1355  ResultCompanionStationIsLeft,
1359 
1360 /*!
1361  @class nn::pia::ResultSessionMigrationFailed
1362  @brief ジョイントセッション時にセッション移行に必要な処理に失敗しました。
1363 */
1364 PIA_DEFINE_RESULT(
1365  ResultSessionMigrationFailed,
1369 
1370 /*!
1371  @class nn::pia::ResultGameServerProcessAborted
1372  @brief ゲームサーバーへの処理が異常終了しました。
1373 */
1374 PIA_DEFINE_RESULT(
1375  ResultGameServerProcessAborted,
1379 
1380 /*!
1381  @class nn::pia::ResultSessionWrongState
1382  @brief 参加したセッションの状態が異常でした。
1383 */
1384 PIA_DEFINE_RESULT(
1385  ResultSessionWrongState,
1389 
1390 /*!
1391  @class nn::pia::ResultCreateCommunityFailedUpperLimit
1392  @brief コミュニティの作成上限を超えました。
1393 */
1394 PIA_DEFINE_RESULT(
1395  ResultCreateCommunityFailedUpperLimit,
1399 
1400 /*!
1401  @class nn::pia::ResultJoinCommunityFailedUpperLimit
1402  @brief コミュニティの参加上限を超えました。
1403 */
1404 PIA_DEFINE_RESULT(
1405  ResultJoinCommunityFailedUpperLimit,
1409 
1410 /*!
1411  @class nn::pia::ResultCommunityIsFull
1412  @brief 参加しようとしたコミュニティが満員でした。
1413 */
1414 PIA_DEFINE_RESULT(
1415  ResultCommunityIsFull,
1419 
1420 /*!
1421  @class nn::pia::ResultCommunityIsNotFound
1422  @brief 存在しないコミュニティでした。
1423 */
1424 PIA_DEFINE_RESULT(
1425  ResultCommunityIsNotFound,
1429 
1430 /*!
1431  @class nn::pia::ResultCommunityIsClosed
1432  @brief 参加しようとしたコミュニティが参加可能期間外でした。
1433 */
1434 PIA_DEFINE_RESULT(
1435  ResultCommunityIsClosed,
1439 
1440 /*!
1441 @class nn::pia::ResultCommunityUserPasswordUnmatch
1442 @brief 参加時に指定したユーザーパスワードがコミュニティに設定されたユーザーパスワードと一致しませんでした。
1443 */
1444 PIA_DEFINE_RESULT(
1445  ResultCommunityUserPasswordUnmatch,
1449 
1450 /*!
1451  @class nn::pia::ResultAlreadyJoinedCommunity
1452  @brief 参加しようとしたコミュニティに既に参加していた。
1453 */
1454 PIA_DEFINE_RESULT(
1455  ResultAlreadyJoinedCommunity,
1459 
1460 /*!
1461 @class nn::pia::ResultUserAccountNotExisted
1462 @brief ユーザーアカウントが存在しませんでした。
1463 */
1464 PIA_DEFINE_RESULT(
1465  ResultUserAccountNotExisted,
1469 
1470 /*!
1471  @class nn::pia::ResultNatTraversalFailedBothEimSamePublicAddress
1472  @brief Station 間の NAT トラバーサル処理に失敗しました。Local, Remote 共に NAT タイプは EIM でした。また、Local と Remote は同じグローバルIPアドレスでした。
1473 */
1474 PIA_DEFINE_RESULT(
1475  ResultNatTraversalFailedBothEimSamePublicAddress,
1479 
1480 /*!
1481 @class nn::pia::ResultNatTraversalFailedBothEdmSamePublicAddress
1482 @brief Station 間の NAT トラバーサル処理に失敗しました。Local, Remote 共に NAT タイプは EDM でした。また、Local と Remote は同じグローバルIPアドレスでした。
1483 */
1484 PIA_DEFINE_RESULT(
1485  ResultNatTraversalFailedBothEdmSamePublicAddress,
1489 
1490 /*!
1491  @class nn::pia::ResultNatTraversalFailedLocalEimRemoteEdmSamePublicAddress
1492  @brief Station 間の NAT トラバーサル処理に失敗しました。Local の NAT タイプは EIM, Remote の NAT タイプは EDM でした。また、Local と Remote は同じグローバルIPアドレスでした。
1493 */
1494 PIA_DEFINE_RESULT(
1495  ResultNatTraversalFailedLocalEimRemoteEdmSamePublicAddress,
1499 
1500 /*!
1501  @class nn::pia::ResultNatTraversalFailedLocalEdmRemoteEimSamePublicAddress
1502  @brief Station 間の NAT トラバーサル処理に失敗しました。Local の NAT タイプは EDM, Remote の NAT タイプは EIM でした。また、Local と Remote は同じグローバルIPアドレスでした。
1503 */
1504 PIA_DEFINE_RESULT(
1505  ResultNatTraversalFailedLocalEdmRemoteEimSamePublicAddress,
1509 
1510 /*!
1511  @class nn::pia::ResultSdkError
1512  @brief SDK の API 呼び出しに失敗しました。
1513 */
1514 PIA_DEFINE_RESULT(
1515  ResultSdkError,
1519 
1520 /*!
1521  @class nn::pia::ResultSdkViewerErrorCodeError
1522  @brief SDK の API 呼び出しに失敗しました。nn::pia::Result::GetErrorCode() で取得できるエラーコードは SDK のものになります。
1523 */
1524 PIA_DEFINE_RESULT(
1525  ResultSdkViewerErrorCodeError,
1529 
1530 /*!
1531 @if NIN_DOC
1532 @class nn::pia::ResultSdkViewerResultError
1533 @brief SDK の API 呼び出しに失敗しました。nn::pia::framework::Framework::GetLastSdkResult() で SDK の Result を取得し、エラービューアアプレットを使用して適切にハンドリングして下さい。
1534 @endif
1535 */
1536 PIA_DEFINE_RESULT(
1537  ResultSdkViewerResultError,
1541 
1542 /*!
1543 @if NIN_DOC
1544 @class nn::pia::ResultCancelledByUser
1545 @brief ユーザー操作に従って処理を中断しました。
1546 @endif
1547 */
1548 PIA_DEFINE_RESULT(
1549  ResultCancelledByUser,
1553 
1554 /*!
1555 @class nn::pia::ResultLanLowerVersion
1556 @brief 自分のバージョンが通信相手のバージョンよりも低いことを表します。
1557 */
1558 PIA_DEFINE_RESULT(
1559  ResultLanLowerVersion,
1563 
1564 /*!
1565 @class nn::pia::ResultLanHigherVersion
1566 @brief 自分のバージョンが通信相手のバージョンよりも高いことを表します。
1567 */
1568 PIA_DEFINE_RESULT(
1569  ResultLanHigherVersion,
1573 
1574 /*!
1575 @if NIN_DOC
1576 @class nn::pia::ResultNetworkConnectionIsLostByDuplicateLogin
1577 @brief 他の本体から同じアカウントを使ってログインされたため、サーバーから切断されました。切断状態ですが、ログアウトを呼び出しても問題ありません。
1578 @endif
1579 */
1580 PIA_DEFINE_RESULT(
1581  ResultNetworkConnectionIsLostByDuplicateLogin,
1584  Result::Description_DuplicateLogin);
1585 
1586 /*!
1587 @if NIN_DOC
1588 @class nn::pia::ResultOnlinePlayLicenseNotAvailable
1589 @brief ネットワークサービスの利用権限がありません。
1590 @endif
1591 */
1592 PIA_DEFINE_RESULT(
1593  ResultOnlinePlayLicenseNotAvailable,
1596  Result::Description_OnlinePlayLicenseNotAvailable);
1597 
1598 /*!
1599 @if NIN_DOC
1600 @class nn::pia::ResultOnlinePlayLicenseError
1601 @brief ネットワークサービスを利用できません。
1602 @endif
1603 */
1604 PIA_DEFINE_RESULT(
1605  ResultOnlinePlayLicenseError,
1608  Result::Description_OnlinePlayLicenseError);
1609 
1610 
1611 /*!
1612  @class nn::pia::ResultSuccess
1613  @brief 成功の Result です。
1614 */
1615 PIA_DEFINE_RESULT(
1616  ResultSuccess,
1620 
1621 #define PIA_RETURN_RESULT(result) \
1622  { \
1623  PIA_ASSERTMSG(result::IsAssertEnabled() == false, "Result:" #result); \
1624  return result(); \
1625  }
1626 }
1627 } // end of namespace nn::pia