CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
transport_StationManager.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/transport/transport_Definitions.h>
17 
18 #include <nn/pia/transport/transport_Singleton.h>
19 #include <nn/pia/transport/transport_Station.h>
20 
21 #include <nn/pia/common/common_ObjList.h>
22 #include <nn/pia/common/common_SimpleContainer.h>
23 
24 
25 // 先行宣言(PiaCommon)
26 namespace nn
27 {
28 namespace pia
29 {
30 namespace common
31 {
32 class InetAddress;
33 }
34 }
35 }
36 
37 
38 namespace nn
39 {
40 namespace pia
41 {
42 namespace transport
43 {
44 
45 
46 /*!
47  @brief 複数の Station インスタンスを統括するクラスです。
48 
49  @details StationManager クラスのインスタンスは、 Transport クラスによって構築/破棄されます。
50  ですので、アプリケーションプログラムが StationManager クラスの CreateInstance() や
51  DestroyInstance() を呼び出す必要はありません。
52 
53  */
55 {
56 public:
57  typedef common::ObjList<Station> TStationList;
58  typedef common::SimpleContainer<Station*, static_cast<int>(MaxStationNum)> TStationPtrArray;
59 
60  /*!
61  @brief セッションに参加している Station を参照するためのイテレータです(非 const 版)。
62  */
63  class Iterator
64  {
65  public:
66  Iterator(TStationPtrArray::Iterator it)
67  : m_Iterator(it)
68  {
69  }
70  Station& operator*(void)
71  {
72  return **m_Iterator;
73  }
74  Station* operator->(void)
75  {
76  return *m_Iterator;
77  }
78  bool operator==(const Iterator& rhs) const
79  {
80  return m_Iterator == rhs.m_Iterator;
81  }
82  bool operator!=(const Iterator& rhs) const
83  {
84  return !(*this == rhs);
85  }
86  Iterator& operator++(void)
87  {
88  ++m_Iterator;
89  return *this;
90  }
91 
92  private:
93  TStationPtrArray::Iterator m_Iterator;
94  };
95 
96  /*!
97  @brief セッションに参加している Station を参照するためのイテレータです( const 版)。
98  */
100  {
101  public:
102  ConstIterator(TStationPtrArray::ConstIterator it)
103  : m_ConstIterator(it)
104  {
105  }
106  const Station& operator*(void)
107  {
108  return **m_ConstIterator;
109  }
110  const Station* operator->(void)
111  {
112  return *m_ConstIterator;
113  }
114  bool operator==(const ConstIterator& rhs) const
115  {
116  return m_ConstIterator == rhs.m_ConstIterator;
117  }
118  bool operator!=(const ConstIterator& rhs) const
119  {
120  return !(*this == rhs);
121  }
122  ConstIterator& operator++(void)
123  {
124  ++m_ConstIterator;
125  return *this;
126  }
127 
128  private:
129  TStationPtrArray::ConstIterator m_ConstIterator;
130  };
131 
132 
133  /*!
134  @cond PRIVATE
135  @brief StationManager クラスのインスタンスを作成します(シングルトンパターン)。
136 
137  @return インスタンスの作成に成功すれば、成功の Result が返されます。
138  @retval ResultNotInitialized transport モジュールが未初期化です。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
139  @retval ResultInvalidState CreateInstance() を呼ぶタイミングが誤っています。 BeginSetup() ~ EndSetup() 間で呼び出す必要があります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
140  @retval ResultAlreadyExists 既にインスタンスは作成されています。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
141  @see DestroyInstance, GetInstance
142  */
143  static Result CreateInstance(void);
144  //! @endcond
145 
146 
147  /*!
148  @cond PRIVATE
149  @brief StationManager クラスのインスタンスを破棄します(シングルトンパターン)。
150  @see CreateInstance, GetInstance
151  */
152  static void DestroyInstance(void);
153  //! @endcond
154 
155 
156  /*!
157  @brief StationManager クラスのインスタンスを得ます(シングルトンパターン)
158  事前に CreateInstance() によってインスタンスを作成していない場合は、
159  NULL ポインタが返されます。
160  この関数はスレッドセーフです。
161 
162  @return インスタンスへのポインタ。
163  @see CreateInstance, DestroyInstance
164  */
166  {
167  return s_pInstance;
168  }
169 
170 
171  /*!
172  @cond PRIVATE
173  @brief デフォルトコンストラクタです。
174  */
175  StationManager(void);
176  //! @endcond
177 
178 
179  /*!
180  @cond PRIVATE
181  @brief デストラクタです。
182  */
183  virtual ~StationManager(void);
184  //! @endcond
185 
186 
187  /*!
188  @cond PRIVATE
189  @brief StationManager を初期化します。
190 
191  @param[in] pFactory NetworkFactory から派生させた具象クラスのインスタンスを指すポインタを渡します(ファクトリパターン)。
192  @param[in] pStationProtocol StationProtocol ポインタです。
193  @param[in] pRttProtocol RttProtocol ポインタです。
194  @param[in] maxStations 管理する Station 数の最大値を指定します。
195  @return 成功すれば、 IsSuccess() が true を返す Result が返されます。
196  @retval ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
197  @retval ResultAllocationFailed メモリ確保に失敗しました。 common::Initialize() 呼び出し時により多くのメモリを供給するか、 maxStations の値を小さくする必要があります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
198  @see Finalize
199  */
200  Result Initialize(NetworkFactory* pFactory, uint32_t maxStations, StationProtocol* pStationProtocol, RttProtocol* pRttProtocol);
201  //! @endcond
202 
203 
204  /*!
205  @cond PRIVATE
206  @brief StationManager を解放します。
207 
208  @see Initialize
209  */
210  void Finalize(void);
211  //! @endcond
212 
213 
214  /*!
215  @brief Station インスタンスのイテレータを返します(非 const 版)。
216 
217  @return StationManager が管理している Station インスタンス群の
218  先頭にある要素のイテレータを返します。
219  @see End
220  */
222  {
223  return Iterator(m_ValidStationPtr.Begin());
224  }
225 
226 
227  /*!
228  @brief Station インスタンスのイテレータを返します(非 const 版)。
229 
230  @return StationManager が管理している Station インスタンス群の
231  末尾の要素の次に対応するイテレータを返します。
232  @see Begin
233  */
234  Iterator End(void)
235  {
236  return Iterator(m_ValidStationPtr.End());
237  }
238 
239 
240  /*!
241  @brief Station インスタンスのイテレータを返します( const 版)。
242 
243  @return StationManager が管理している Station インスタンス群の
244  先頭にある要素のイテレータを返します。
245  @see End
246  */
247  ConstIterator Begin(void) const
248  {
249  return ConstIterator(m_ValidStationPtr.Begin());
250  }
251 
252 
253  /*!
254  @brief Station インスタンスのイテレータを返します( const 版)。
255 
256  @return StationManager が管理している Station インスタンス群の
257  末尾の要素の次に対応するイテレータを返します。
258  @see Begin
259  */
260  ConstIterator End(void) const
261  {
262  return ConstIterator(m_ValidStationPtr.End());
263  }
264 
265 
266  /*!
267  @cond PRIVATE
268  @brief ローカルステーションの Station インスタンスを作成します。
269 
270  @return 成功すれば、作成した Station インスタンスを指すポインタが返ります。
271  既にローカルステーションが作成されているなどの理由で失敗したときは、 NULL が返されます。
272  @see CreateStation
273  */
274  Station* CreateLocalStation(void);
275  //! @endcond
276 
277 
278  /*!
279  @cond PRIVATE
280  @brief Station インスタンスを作成します。
281 
282  @return 成功すれば、作成した Station インスタンスを指すポインタが返ります。
283  既に Station 数が Initialize() 時に指定した最大 Station 数に達している
284  ような状況では、 NULL が返されます。
285  @see CreateLocalStation, Initialize
286  */
287  Station* CreateStation(void);
288  //! @endcond
289 
290 
291  /*!
292  @cond PRIVATE
293  @brief 指定された Station を破棄します。
294 
295  @param[in] pStation 破棄対象の Station を指すポインタ。このポインタは、 StationManager から取得したものでなければなりません。
296  @see CreateStation, CreateLocalStation
297  */
298  void DestroyStation(Station* pStation);
299  //! @endcond
300 
301 
302  /*!
303  @cond PRIVATE
304  @brief StationIndex で指定された Station を破棄します。
305 
306  @param[in] idx 破棄対象 Station の StationIndex 。
307  @see CreateStation, CreateLocalStation
308  */
309  void DestroyStation(StationIndex idx);
310  //! @endcond
311 
312 
313  /*!
314  @brief ローカルステーションを取得します(非 const 版)。
315 
316  @details この関数はスレッドセーフです。
317  <br>
318  @return ローカルステーションが存在すれば、有効なポインタが返ります。存在していなければ、 NULL ポインタが返されます。
319  */
321  {
322  return m_pLocalStation;
323  }
324 
325 
326  /*!
327  @brief ローカルステーションを取得します( const 版)。
328 
329  @details この関数はスレッドセーフです。
330  <br>
331  @return ローカルステーションが存在すれば、有効なポインタが返ります。存在していなければ、 NULL ポインタが返されます。
332  */
333  const Station* GetLocalStation(void) const
334  {
335  return m_pLocalStation;
336  }
337 
338 
339  /*!
340  @brief StationId に対応する Station を得ます(非 const 版)。
341 
342  @param[in] id StationId 。
343  @return 指定した StationId に対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなかったり、StationId が無効の場合は NULL ポインタが返ります。
344  @see GetStationByAddress
345  */
347 
348 
349  /*!
350  @brief StationId に対応する Station を得ます( const 版)。
351 
352  @param[in] id StationId 。
353  @return 指定した StationId に対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなかったり、StationId が無効の場合は NULL ポインタが返ります。
354  @see GetStationByAddress
355  */
356  const Station* GetStation(StationId id) const;
357 
358 
359  /*!
360  @cond PRIVATE
361  @brief StationIndex に対応する Station を得ます(非 const 版)。
362 
363  @param[in] idx StationIndex 。
364  @return 指定した StationIndex に対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなかったり、StationIndex が無効の場合は NULL ポインタが返ります。
365  @see GetStationByAddress
366  */
368  //! @endcond
369 
370 
371  /*!
372  @cond PRIVATE
373  @brief StationIndex に対応する Station を得ます( const 版)。
374 
375  @param[in] idx StationIndex 。
376  @return 指定した StationIndex に対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなかったり、StationIndex が無効の場合は NULL ポインタが返ります。
377  @see GetStationByAddress
378  */
379  const Station* GetStation(StationIndex idx) const;
380  //! @endcond
381 
382 
383  /*!
384  @brief StationAddress に対応する Station を得ます(非 const 版)。
385 
386  @param[in] addr ステーションアドレス。
387  @return 指定したステーションアドレスに対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなければ、 NULL ポインタが返ります。
388  @see GetStationByAddress
389  */
391 
392 
393  /*!
394  @brief StationAddress に対応する Station を得ます( const 版)。
395 
396  @param[in] addr ステーションアドレス。
397  @return 指定したステーションアドレスに対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなければ、 NULL ポインタが返ります。
398  @see GetStationByAddress
399  */
400  const Station* GetStation(const common::StationAddress& addr) const;
401 
402 
403  /*!
404  @brief インターネットアドレスに対応する Station を得ます(非 const 版)。
405 
406  @param[in] addr インターネットアドレス。
407  @return 指定したインターネットアドレスに対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなければ、 NULL ポインタが返ります。
408  @retval ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
409  @see GetStation
410  */
412 
413 
414  /*!
415  @brief インターネットアドレスに対応する Station を得ます( const 版)。
416 
417  @param[in] addr インターネットアドレス。
418  @return 指定したインターネットアドレスに対応する Station が存在すれば、その Station を指すポインタが返ります。存在しなければ、 NULL ポインタが返ります。
419  @retval ResultInvalidArgument 引数に誤りがあります。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
420  @see GetStation
421  */
422  const Station* GetStationByAddress(const common::InetAddress& addr) const;
423 
424 
425  /*!
426  @brief StationId に対応する Station の StationAddress を得ます。
427 
428  @param[out] pAddr 書き込み先の StationAddress インスタンスを指すポインタ。
429  @param[in] id StationId 。
430  @return 成功すれば、 IsSuccess() が true を返す Result が返されます。
431  @retval ResultInvalidArgument 引数に誤りがあります。StationId が無効だった場合もこの Result が返されます。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
432  @retval ResultNotFound 引数で指定した Station が見つからなかったことを示します。アプリケーションで適切にハンドリングしてください。
433  */
435 
436 
437  /*!
438  @cond PRIVATE
439  @brief StationIndex に対応する Station の StationAddress を得ます。
440 
441  @param[out] pAddr 書き込み先の StationAddress インスタンスを指すポインタ。
442  @param[in] idx StationIndex 。
443  @return 成功すれば、 IsSuccess() が true を返す Result が返されます。
444  @retval ResultInvalidArgument 引数に誤りがあります。StationIndex が無効だった場合もこの Result が返されます。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
445  @retval ResultNotFound 引数で指定した Station が見つからなかったことを示します。アプリケーションで適切にハンドリングしてください。
446  */
448  //! @endcond
449 
450 
451  /*!
452  @cond PRIVATE
453  @brief 現時点で有効な Station インスタンスの個数を返します。
454 
455  @return 現時点で有効な Station インスタンスの個数。
456  */
457  uint16_t GetValidStationNum(void) const;
458  //! @endcond
459 
460 
461  /*!
462  @cond PRIVATE
463  @brief セッションに参加している Station の StationIndex に対応するビットを立てたビットマップを返します。
464 
465  @param[in] bIncludeMyself 自分自身に対応する StationIndex のビットを返り値に含めたい場合は true を指定します。
466 
467  @return ビットマップ値。最下位ビット (LSB) が StationIndex_1 に対応します。
468  */
469  uint32_t GetParticipatingStationBitmap(bool bIncludeMyself) const;
470  //! @endcond
471 
472 
473  /*!
474  @cond PRIVATE
475  @brief session から呼ばれます。Host の StationIndex をセットします。
476  */
477  void SetHostStationIndex(StationIndex idx)
478  {
479  m_HostStationIndex = idx;
480  }
481  //! @endcond
482 
483 
484  /*!
485  @cond PRIVATE
486  @brief Host の StationIndex を取得します。
487  */
488  StationIndex GetHostStationIndex(void) const
489  {
490  return m_HostStationIndex;
491  }
492  //! @endcond
493 
494 
495  /*!
496  @brief デバッグに有用な情報をプリントします。
497 
498  @param[in] flag トレースフラグの論理和。詳細は @ref TraceFlag 型を参照してください。
499  */
500  virtual void Trace(uint64_t flag) const;
501 
502 
503 private:
504  TStationList m_StationList; // Station の実体を管理する。
505  uint8_t* m_pWorkBuf; // m_StationList 用のバッファ
506 
507  TStationPtrArray m_ValidStationPtr; // 現時点で有効な Station のポインタを管理する。
508  TStationPtrArray m_InvalidStationPtr; // 現時点で無効な Station のポインタを管理する。
509 
510  bool isInStationList(const Station* pStation) const;
511  bool isInPtrArray(const TStationPtrArray& ptrArray, const Station* pStation) const;
512 
513  Station* m_pLocalStation;
514 
515  StationIndex m_HostStationIndex;
516 
517  static StationManager* s_pInstance; // このクラスの唯一のインスタンスの実体
518 
519  StationManager(const StationManager&);
520  StationManager& operator=(const StationManager&);
521 };
522 }
523 }
524 } // end of namespace nn::pia::transport