AM Daemon ライブラリリファレンス
Core.h
[詳解]
1 /// @file
2 /// @brief Daemonライブラリのコア処理を提供するMonostateクラス Core のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_CORE_H
7 #define AMDAEMON_CORE_H
8 
9 #include "amdaemon/env.h"
10 #include "amdaemon/deprecated.h"
11 #include "amdaemon/NextProcess.h"
12 #include "amdaemon/RequestState.h"
13 
14 #include <functional>
15 #include <cstddef>
16 
17 namespace amdaemon
18 {
19 /// @addtogroup g_core
20 /// @{
21 
22  // 前方宣言
23  class Exception;
24 
25  /// @brief Daemonライブラリのコア処理を提供するMonostateクラス。
26  ///
27  /// @par ライブラリ利用アプリで実装すべきこと
28  /// - メンバ関数 #execute を毎フレーム呼び出し、状態を更新すること。
29  /// - 下記タイミングではメンバ関数 #isReady が true を返すまで待機すること。
30  /// - Daemonプロセス起動時。
31  /// - Sequence クラスによってゲームテストモードを開始した時。
32  /// - Sequence クラスによってゲームテストモードを終了した時。
33  /// - 上記タイミングの際、並行してアプリ固有の初期化処理を行っても構わないが、
34  /// Core クラスおよび Error クラスの一部関数を除き、
35  /// @ref g_common "主要クラス" は利用しないこと。
36  /// - 特に、メンバ関数 #kill 以外の処理要求関数を呼び出した場合は例外が発生する。
37  /// - アプリを終了してセガブートやシステムテストモードへ移行する場合は
38  /// メンバ関数 #kill を呼び出すこと。(詳細は後述)
39  ///
40  /// @par アプリ終了フロー
41  /// - アプリを終了させてセガブートやシステムテストモードへ遷移する場合、
42  /// まずメンバ関数 #kill を呼び出してDaemonプロセスを終了させ、
43  /// その後速やかにアプリを終了させること。
44  /// - メンバ関数 #kill を呼び出さずにアプリを終了させてしまうとセガブートにて
45  /// ERROR 10 が表示される。
46  /// - アプリが異常終了した場合にもこの挙動となる。
47  /// - セガブートやシステムテストモードへ遷移するわけではなく、続けて別のアプリを
48  /// 起動させる場合は、メンバ関数 #kill を呼び出してはならない。
49  /// - NET配信やLANインストールによるセガブート遷移要求ではなく、
50  /// アプリ都合での再起動が目的である場合、メンバ関数 #kill ではなくメンバ関数
51  /// #reboot を用いてハードウェアリセットすること。
52  /// - メンバ関数 #kill によってセガブート経由でアプリを再起動させた場合、
53  /// 以降電断もしくはハードウェアリセットが行われるまでの間、
54  /// NET配信によるセガブート遷移要求が行われなくなる。
55  /// 即ち、解禁済みのパッチイメージが存在する場合であっても、
56  /// NetDelivery クラスのメンバ関数 NetDelivery#isExitNeeded が true を返さなくなる。
57  ///
58  /// @par アプリの強制終了における注意事項
59  /// メンバ関数 #execute や各種ブロッキング処理の実行中にアプリを強制終了させた場合、
60  /// 内部で用いているプロセス間排他ロック機構が有効なままとなる場合がある。
61  /// 主に、デバッガから終了させた場合等が該当する。
62  /// @par
63  /// その状態で、Daemonプロセスやエミュレータを終了させずに再度アプリを起動すると、
64  /// メンバ関数 #execute を呼び出した時点でデッドロックが発生する。
65  /// この状態に陥った場合、Daemonプロセスやエミュレータを一旦終了させること。
66  /// @par
67  /// 実運用においては、アプリを強制終了させるようなフローを組み込まないようにすること。
68  /// また、前述のアプリ終了フローに従うこと。
69  ///
70  /// @ingroup g_common
71  class Core
72  {
73  public:
74  // 下記は暗黙の定義を用いる。
75  //Core() = default;
76  //‾Core() = default;
77  //Core(const Core&) = default;
78  //Core& operator=(const Core&) = default;
79 
80  /// @brief ライブラリバージョンを表す文字列を取得する。
81  /// @return ライブラリバージョンを表す文字列。
82  ///
83  /// amdaemon.lib のバージョンを表す libver 形式の文字列を返す。
84  /// ただし前後の改行は除く。
85  ///
86  /// 例えば "amdaemonLib Ver.1987 Build:Apr 5 2017 10:01:23" といった文字列になる。
87  ///
88  /// アプリのデバッグ表示やログ出力にそのまま用いることを想定している。
89  const wchar_t* getLibraryVersion() const;
90 
91  /// @brief Daemonライブラリの更新処理を行う。
92  ///
93  /// アプリのメインループ処理内で毎フレーム呼び出すこと。
94  void execute();
95 
96  /// @brief Daemonプロセスの主要な初期化が完了したか否かを取得する。
97  /// @retval true 初期化完了している場合。
98  /// @retval false 初期化未完了であるが、Daemonプロセスが起動していない場合。
99  ///
100  /// 下記のタイミングにおいて、この関数が true を返すまで待機すること。
101  ///
102  /// - Daemonプロセス起動時。
103  /// - Sequence クラスによってゲームテストモードを開始した時。
104  /// - Sequence クラスによってゲームテストモードを終了した時。
105  ///
106  /// ただしDaemonプロセスが生存していない場合、この関数は true を返さず、
107  /// メンバ関数 #isExited が true を返す。
108  ///
109  /// @attention
110  /// この関数が true を返すまで、 Core クラスおよび Error クラスの一部関数を除き、
111  /// @ref g_common "主要クラス" を利用してはならない。
112  ///
113  /// @attention
114  /// この関数が返す値の更新はメンバ関数 #execute によって行われるため、
115  /// この関数が返す値に関わらずメンバ関数 #execute は毎フレーム呼び出すこと。
116  bool isReady() const;
117 
118  /// @brief Daemonプロセスを終了させる。
119  /// @param[in] nextProcess アプリ終了後の遷移先。既定値は NextProcess::Auto 。
120  /// @see #reboot
121  /// @note
122  /// Core#isReady が false を返す状態でも利用可能。
123  /// ただしブロッキング時間は長くなる。
124  ///
125  /// この関数を呼び出した後は速やかにアプリを終了させること。
126  /// Core クラスのアプリ終了フローに関する説明も参照すること。
127  ///
128  /// アプリ都合での再起動を行いたい場合、この関数ではなくメンバ関数
129  /// #reboot によるハードウェアリセットを行うこと。
130  ///
131  /// Daemonプロセス起動直後など、
132  /// Daemonプロセスの準備が完了していないタイミングで呼び出した場合、
133  /// 最長で20秒程度ブロッキングする場合がある。
134  ///
135  /// エミュレータ環境で呼び出した場合、エミュレータが終了するのみである。
136  void kill(NextProcess nextProcess = NextProcess::Auto);
137 
138  /// @brief [非推奨] Daemonプロセスを終了させる。
139  /// @param[in] errorOnSegaBoot
140  /// 現在 Error クラスにエラーが設定されている場合に、
141  /// そのエラーをセガブートで表示させるように設定するならば true 。
142  /// @note
143  /// Core#isReady が false を返す状態でも利用可能。
144  /// ただしブロッキング時間は長くなる。
145  /// @deprecated kill(NextProcess) オーバロードを利用すること。
146  ///
147  /// 現在 Error クラスにエラーが設定されており、
148  /// かつ引数 errorOnSegaBoot に true を指定した場合、
149  /// kill(NextProcess) オーバロードの引数に
150  /// NextProcess::SegaBootError を指定した場合と同一の挙動となる。
151  ///
152  /// 上記の条件を満たさない場合、 kill(NextProcess) オーバロードの引数に
153  /// NextProcess::Auto を指定した場合と同一の挙動となる。
154  AMDAEMON_DEPRECATED("Replace to `kill(NextProcess)`.")
155  void kill(bool errorOnSegaBoot);
156 
157  /// @brief Daemonプロセスが終了済みであるか否かを取得する。
158  /// @retval true 終了済みである場合。
159  /// @retval false 実行中である場合。
160  /// @note メンバ関数 #isReady が false を返す状態でも利用可能。
161  ///
162  /// 次のいずれかの場合に終了済み扱いとなる。
163  ///
164  /// - メンバ関数 #kill を呼び出して終了させた場合。
165  /// - Daemonプロセスの生存が一定時間確認できず、落ちていると判断された場合。
166  ///
167  /// 後者の場合、 Error クラスにエラーが設定される。
168  bool isExited() const;
169 
170  /// @brief プレイヤー数を取得する。
171  /// @return プレイヤー数。
172  /// @see Player
173  ///
174  /// Daemonプロセスの設定ファイルで指定した仮想プレイヤー数が返る。
175  std::size_t getPlayerCount() const;
176 
177  /// @brief 例外をスローする代わりに呼び出される例外フック関数を設定する。
178  /// @param[in] hook フック関数。
179  /// @note メンバ関数 #isReady が false を返す状態でも利用可能。
180  /// @see resetExceptionHook, Exception
181  ///
182  /// この関数でフック関数(コールバック)を設定すると、以降ライブラリ内部で例外が
183  /// 発生した時、それをスローするのではなくフック関数に渡すようになる。
184  ///
185  /// フック関数内で明示的にスローしない限り、例外発生元からもスローされない。
186  /// スローされなくなった場合の挙動は例外カテゴリに依存する。
187  /// 詳細は各 @ref ExceptionCategory 列挙値の説明を参照すること。
188  ///
189  /// フック関数には、第1引数に Exception オブジェクト参照を受け取る関数もしくは
190  /// 関数オブジェクトを指定できる。
191  /// 任意のクラスのメンバ関数を指定したい場合はラムダ式を用いるとよい。
192  ///
193  /// @code
194  /// // MyClass クラスのメンバ関数 doHook を指定する例
195  /// void setHook(MyClass& c)
196  /// {
197  /// amdaemon::Core core;
198  /// core.setExceptionHook(
199  /// [&c](const amdaemon::Exception& e) { c.doHook(e); });
200  /// }
201  ///
202  /// // MyClass クラスのメンバ関数内から指定する例
203  /// void MyClass::setHook()
204  /// {
205  /// amdaemon::Core core;
206  /// core.setExceptionHook(
207  /// [this](const amdaemon::Exception& e) { doHook(e); });
208  /// }
209  /// @endcode
210  void setExceptionHook(std::function<void (const Exception&)> hook);
211 
212  /// @brief 例外フック関数を解除し、例外がスローされるようにする。
213  /// @note メンバ関数 #isReady が false を返す状態でも利用可能。
214  /// @see setExceptionHook
215  void resetExceptionHook();
216 
217  /// @brief 現在設定されている言語名を取得する。
218  /// @return 言語名。
219  const wchar_t* getLanguage() const;
220 
221  /// @brief 言語名の設定と関連リソースのロードを要求する。
222  /// @param[in] language 言語名。設定ファイルの内容を適用するならば nullptr 。
223  /// @retval true 処理に成功した場合。
224  /// @retval false 処理に失敗した場合。
225  ///
226  /// @exception Exception
227  /// 引数 language の文字数が 0 文字または 16 文字以上である場合。
228  ///
229  /// 関連リソースのロードに1箇所でも失敗した場合は処理に失敗する。
230  /// その場合、言語名は変更されない。
231  ///
232  /// 引数 language に nullptr を渡した場合に選択される言語名は
233  /// Daemonプロセスの設定ファイルでの指定に準ずる。
234  /// Daemonプロセスの初期化時にも自動で選択されるため、
235  /// 既定の言語をそのまま用いるのであればこの関数を呼び出す必要はない。
236  ///
237  /// Daemonプロセスが処理完了するまで呼び出し元スレッドをブロックする。
238  /// リソースのロードに数秒掛かる可能性があるため、頻繁に呼び出さないこと。
239  bool changeLanguage(const wchar_t* language);
240 
241  /// @brief ハードウェアリセットを行う。
242  /// @see kill(NextProcess)
243  ///
244  /// ハードウェアリセットを行う。Windowsの再起動とは異なるので注意。
245  ///
246  /// 処理に成功した場合、この関数からは復帰しない。
247  ///
248  /// 下記の場合はこの関数から復帰する。
249  ///
250  /// - 処理に失敗した場合。
251  /// - エミュレータ環境で呼び出した場合。
252  ///
253  /// 処理失敗の主な原因としてはDaemonプロセスが異常終了した場合等が考えられるが、
254  /// 基本的には Error クラスによりエラーが通知されているはずである。
255  ///
256  /// NET配信やLANインストールによるセガブート遷移要求に対応する場合は、
257  /// この関数ではなくメンバ関数 #kill を用いること。
258  /// 詳しくは Core クラスのアプリ終了フローに関する説明を参照すること。
259  void reboot();
260 
261  /// @brief アプリおよび依存DLLの .data セクションを事前ロードする。
262  /// @return 要求状態値。処理中や事前ロード済みの場合は無効値。
263  ///
264  /// このライブラリをリンクしているアプリ、およびそれが依存しているDLLの
265  /// .data セクションを事前ロードする。
266  ///
267  /// @par .data セクションの事前ロードとは
268  /// 実行可能ファイル(*.exe)やDLLは、 .data セクションと呼ばれるバイナリ領域に
269  /// グローバル変数や静的ローカル変数を格納しており、
270  /// プログラム内で初めて利用されるタイミングでそのロード処理が行われる。
271  /// @par
272  /// グローバル変数等を大量に用いているアプリの場合、
273  /// ロード処理によりプログラムの動作が一瞬固まることが確認されている。
274  /// @par
275  /// この関数を用いて .data セクションを事前ロードすることにより、
276  /// 上記の問題を解消できる。
277  ///
278  /// この関数の呼び出し自体は即座に完了し、要求状態値を返す。
279  /// RequestState クラスの各メンバ関数により、
280  /// Daemonプロセスが処理完了済みか否かや処理の成否等を調べることができる。
281  ///
282  /// ただし、下記のいずれかを満たす場合、この関数は無効な要求状態値を返す。
283  ///
284  /// - 既にこの関数による事前ロード処理中である場合。
285  /// - 既にこの関数による事前ロード処理が成功済みである場合。
286  ///
287  /// 無効な要求状態値が返ってきた場合、要求は発行されていない。
288  /// 有効であるか否かは
289  /// RequestState クラスのメンバ関数 RequestState#valid で判別できる。
290  ///
291  /// この関数の処理中はDaemonプロセスがブロッキングされるため、
292  /// 同時に別のAM関連処理を行うことはできない。
293  /// また、アプリのフレームレートが安定しない可能性がある。
294  ///
295  /// 上記の理由から、アプリの初期化シーケンスにおいてメンバ関数 #isReady が
296  /// true を返すようになった直後にこの関数を呼び出し、
297  /// 処理完了までアプリでは簡易的な画面表示に留めることが望ましい。
298  ///
299  /// エミュレータ環境で呼び出した場合、処理は成功となるが、内部的には何も行われない。
301  };
302 
303 /// @}
304 } // amdaemon
305 
306 //--------------------
307 // Doxygen用コメント
308 //--------------------
309 
310 /**
311 @mainpage AM Daemon ライブラリリファレンス
312 
313 @par AM Daemon とは
314 Aime、ALL.Net等、AMゲーム開発で共通して利用されるモジュール群をパッケージングし、
315 ゲームアプリからより簡潔に扱えるようにすることを目的とするプロセス&ライブラリ。
316 
317 @par AM Daemon ライブラリとは
318 AM Daemon プロセスにゲームアプリからアクセスして、
319 情報を取得したり処理を要求したりするためのインタフェースライブラリ。@n
320 AM Daemon プロセスは当ライブラリを通してアクセスされることを前提とした設計になっており、
321 AM Daemon 採用タイトルのゲームアプリは必ず当ライブラリを組み込む必要がある。
322 
323 @par 主要クラス
324 当ライブラリの @ref g_common "主要クラス" はいずれも
325 @ref amdaemon 名前空間に属し、Monostateクラスとなっている。@n
326 ライブラリ利用アプリは好きな場所でインスタンスを作成して利用することができる。@n
327 少なくとも amdaemon::Core クラスのメンバ関数
328 @ref amdaemon::Core::execute "execute"
329 は必ず毎フレーム呼び出す必要がある。
330 
331 @par 例外処理
332 ライブラリ内で例外が発生した場合、既定では
333 amdaemon::Exception クラスのインスタンスがスローされる。
334 @par
335 この動作が好ましくない場合、 amdaemon::Core クラスのメンバ関数
336 @ref amdaemon::Core::setExceptionHook "setExceptionHook"
337 を用いて例外フック関数を設定すること。@n
338 例外フック関数が設定されている場合、例外をスローする代わりに例外フック関数が呼び出される。@n
339 詳しくは amdaemon::Core::setExceptionHook 関数の説明を参照すること。
340 
341 @par ライブラリで用いる文字列について
342 当ライブラリにおいて文字列を引数、戻り値等で用いる場合、その値は const wchar_t* 型あるいは
343 std::wstring 型のワイド文字列となる。@n
344 アプリ側もこれに合わせてワイド文字列ベースで実装を行うことを推奨する。@n
345 Visual C++ 環境においてワイド文字列ベースの実装を行うには、プロジェクトのプロパティから
346 「構成プロパティ→全般→文字セット」の値を「Unicode 文字セットを使用する」に変更すること。
347 @par
348 他ライブラリの都合等により const char* 型や
349 std::string 型の文字列値を当ライブラリとやり取りする必要がある場合、
350 amdaemon::util::WinEncoding クラスを利用すると手軽に文字コード変換を行える。@n
351 詳しくは amdaemon::util::WinEncoding クラスの説明を参照すること。
352 */
353 
354 /**
355 @defgroup g_common common : 主要クラス
356 @brief AM Daemon ライブラリ主要クラス一覧。
357 
358 @defgroup g_util util : ユーティリティ
359 @brief AM Daemon プロセスとは無関係だが便利なクラス、関数等の定義。
360 
361 @defgroup g_exception exception : 例外処理
362 @brief AM Daemon の例外処理関連定義。
363 
364 @defgroup g_dump dump : 共有メモリダンプ
365 @brief 共有メモリ情報のダンプ処理関連定義。
366 
367 @defgroup g_core Core : コア処理
368 @brief Daemonライブラリのコア処理を提供するMonostateクラス Core とその関連定義。
369 
370 @defgroup g_abaas abaas : ABaaS
371 @brief ABaaS(ALL.Net Backend as a Service)関連処理を提供するMonostateクラス abaas::Log とその関連定義。
372 
373 @defgroup g_aime Aime : Aime
374 @brief Aime関連処理を提供するMonostateクラス Aime とその関連定義。
375 
376 @defgroup g_allnet allnet : ALL.Net
377 @brief ALL.Net関連処理を提供するMonostateクラス allnet::Auth, allnet::Accounting とその関連定義。
378 
379 @defgroup g_appimage AppImage : アプリイメージ情報
380 @brief アプリイメージ関連情報を提供するMonostateクラス AppImage とその関連定義。
381 
382 @defgroup g_backup Backup : 不揮発データバックアップ
383 @brief 不揮発データバックアップ処理を提供するMonostateクラス Backup とその関連定義。
384 
385 @defgroup g_boardio BoardIO : ボード入出力
386 @brief 【Nuシリーズ用】DipSwitch、PushSwitch、LEDの情報を提供するMonostateクラス BoardIO とその関連定義。
387 @attention Nuシリーズでのみ利用可能。
388 
389 @defgroup g_can Can : CAN通信
390 @brief 【Nuシリーズ用】CAN通信処理を提供するMonostateクラス Can とその関連定義。
391 @attention Nuシリーズでのみ利用可能。
392 
393 @defgroup g_credit Credit : クレジット
394 @brief ビデオゲームのクレジット処理を提供するMonostateクラス Credit とその関連定義。
395 
396 @defgroup g_emoney EMoney : 電子マネー
397 @brief 【ALLSシリーズ用】電子マネー処理を提供するMonostateクラス EMoney とその関連定義。
398 @attention ALLSシリーズの電子マネー対応版SDKでのみ利用可能。
399 
400 @defgroup g_error Error : エラー
401 @brief Daemonが検出したエラーの情報を提供するMonostateクラス Error とその関連定義。
402 
403 @defgroup g_io I/O : 抽象入出力
404 @brief ID付けされた入出力情報を提供するMonostateクラス Input, Output とその関連定義。
405 
406 @defgroup g_jvs Jvs : JVS入出力
407 @brief 【Nuシリーズ用】JVSの入出力処理を提供するMonostateクラス Jvs とその関連定義。
408 @attention Nuシリーズでのみ利用可能。
409 
410 @defgroup g_laninstall LanInstall : LANインストール
411 @brief LANインストール情報を提供するMonostateクラス LanInstall とその関連定義。
412 
413 @defgroup g_netdelivery NetDelivery : NET配信
414 @brief NET配信情報を提供するMonostateクラス NetDelivery とその関連定義。
415 
416 @defgroup g_network Network : ネットワーク
417 @brief ネットワーク関連処理を提供するMonostateクラス Network とその関連定義。
418 
419 @defgroup g_player Player : プレイヤー
420 @brief プレイヤーに紐付く情報をまとめて提供するMonostateクラス Player とその関連定義。
421 
422 @defgroup g_sequence Sequence : ゲームシーケンス
423 @brief ゲームシーケンスを管理するMonostateクラス Sequence とその関連定義。
424 
425 @defgroup g_system System : システム情報
426 @brief システムの不変情報を提供するMonostateクラス System とその関連定義。
427 
428 @defgroup g_usbdevice UsbDevice : USBデバイス
429 @brief USBデバイス関連処理を提供するMonostateクラス UsbDevice とその関連定義。
430 
431 @defgroup g_usbio UsbIO : USB入出力
432 @brief USBの入出力処理を提供するMonostateクラス UsbIO とその関連定義。
433 */
434 
435 /**
436 @namespace amdaemon
437 @brief AM Daemon ライブラリクラス群の基底名前空間。
438 
439 @namespace amdaemon::allnet
440 @brief ALL.Net関連のクラス等を定義する名前空間。
441 @ingroup g_allnet
442 
443 @namespace amdaemon::abaas
444 @brief ABaaS(ALL.Net Backend as a Service)関連のクラス等を定義する名前空間。
445 @ingroup g_abaas
446 
447 @namespace amdaemon::util
448 @brief AM Daemon プロセスとは無関係だが便利なクラス、関数等を定義する名前空間。
449 @ingroup g_util
450 */
451 
452 #endif // AMDAEMON_CORE_H
bool isReady() const
Daemonプロセスの主要な初期化が完了したか否かを取得する。
void kill(NextProcess nextProcess=NextProcess::Auto)
Daemonプロセスを終了させる。
std::size_t getPlayerCount() const
プレイヤー数を取得する。
const wchar_t * getLanguage() const
現在設定されている言語名を取得する。
Daemonプロセスへの処理要求状態を保持するクラス。
Definition: RequestState.h:37
非推奨機能であることを示す AMDAEMON_DEPRECATED マクロを定義するヘッダ。
Daemonライブラリの環境定義を行うヘッダ。
void setExceptionHook(std::function< void(const Exception &)> hook)
例外をスローする代わりに呼び出される例外フック関数を設定する。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
void execute()
Daemonライブラリの更新処理を行う。
NextProcess
アプリ終了後遷移先列挙。
Definition: NextProcess.h:19
Daemonプロセスへの処理要求状態を保持するクラス RequestState のヘッダ。
void resetExceptionHook()
例外フック関数を解除し、例外がスローされるようにする。
RequestState preloadDataSection()
アプリおよび依存DLLの .data セクションを事前ロードする。
#define AMDAEMON_DEPRECATED(msg)
非推奨機能であることを示す。
Definition: deprecated.h:15
const wchar_t * getLibraryVersion() const
ライブラリバージョンを表す文字列を取得する。
void reboot()
ハードウェアリセットを行う。
AM Daemon の例外クラス。
Definition: Exception.h:42
bool isExited() const
Daemonプロセスが終了済みであるか否かを取得する。
Daemonライブラリのコア処理を提供するMonostateクラス。
Definition: Core.h:71
bool changeLanguage(const wchar_t *language)
言語名の設定と関連リソースのロードを要求する。
Daemonプロセスに遷移先を自動判別させる。
アプリ終了後遷移先列挙 NextProcess のヘッダ。