AM Daemon ライブラリリファレンス
Backup.h
[詳解]
1 /// @file
2 /// @brief 不揮発データバックアップ処理を提供するMonostateクラス Backup のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_BACKUP_H
7 #define AMDAEMON_BACKUP_H
8 
9 #include "amdaemon/env.h"
10 #include "amdaemon/BackupRecord.h"
12 #include "amdaemon/RequestState.h"
13 
14 #include <vector>
15 #include <cstddef>
16 
17 namespace amdaemon
18 {
19 /// @addtogroup g_backup
20 /// @{
21 
22  /// @brief 不揮発メモリアクセス処理を提供するMonostateクラス。
23  ///
24  /// Core クラスのメンバ関数 Core#execute 呼び出しによって内容が更新される。
25  ///
26  /// @par 初期化手順
27  /// -# 必要であれば、メンバ関数 #setAsync により非同期モード設定を行う。
28  /// -# メンバ関数 #setupRecords によりバックアップレコード情報配列の登録を要求する。
29  /// - この段階ではまだ実際の登録処理は行われていない。
30  /// -# Core クラスのメンバ関数 Core#execute 呼び出しにより登録処理が行われる。
31  /// - 非同期モードの場合、1回の呼び出しでは完了せず、
32  /// 完了するまでの間メンバ関数 #isBusy が true を返し続ける。
33  /// -# メンバ関数 #isSetupSucceeded により登録が成功したか否か取得できる。
34  /// メンバ関数 #getRecordStatus により個々のレコードの状態が取得できる。
35  ///
36  /// @par データ保存手順
37  /// -# レコード情報に登録したデータアドレス先のデータを必要に応じて書き換える。
38  /// -# 書き換えたデータのレコードに対してメンバ関数 #saveRecord を呼び出す。
39  /// - この段階ではまだ実際の保存処理は行われていない。
40  /// - 即時書き出しを行いたい場合はメンバ関数 #executeSave を呼び出す。
41  /// -# Core クラスのメンバ関数 Core#execute 呼び出しにより保存処理が行われる。
42  /// - 非同期モードの場合、1回の呼び出しでは完了せず、
43  /// 完了するまでの間メンバ関数 #isBusy が true を返し続ける。
44  /// - アクセスエラーで書き込み失敗した場合は Error クラスにエラーが設定される。
45  ///
46  /// @par 要求関数について
47  /// RequestState インスタンスを返す各メンバ関数は、即座に処理を行うわけではなく、
48  /// 処理要求を内部キューに登録することのみを行う。
49  /// 要求が実際にDaemonプロセスへ送信されるのは
50  /// Core クラスのメンバ関数 Core#execute を呼び出した時点となる。
51  /// RequestState インスタンスの各メンバ関数により、
52  /// 対象の要求が処理完了済みか否かや処理の成否等を調べることができる。
53  /// @par
54  /// メンバ関数 #setupRecords を1フレーム内で連続して複数回呼び出した場合、
55  /// その度に要求が上書きされ、最後に行った要求のみがDaemonプロセスへ送られる。
56  /// @par
57  /// メンバ関数 #saveRecord および #saveRecordByAddress を1フレーム内で連続して
58  /// 複数回呼び出した場合、それらの要求は一度にまとめてDaemonプロセスへ送られる。
59  /// @par
60  /// メンバ関数 #setupRecords と #saveRecord, #saveRecordByAddress を互いの要求が
61  /// 処理未完了の状態で混在して呼び出すことはできない。
62  /// 呼び出そうとした場合、その関数は無効な RequestState インスタンスを返す。
63  /// 意図しないデータ書き出しを防ぐためにこのような処理になっている。
64  ///
65  /// @par 同期モードについて
66  /// メンバ関数 #setAsync によって処理を同期または非同期で行うように設定できる。
67  /// 既定では同期モード(false)になっている。
68  /// @par
69  /// 同期モードでは、 Core クラスのメンバ関数 Core#execute を呼び出した時点で、
70  /// 現在要求している処理がすべて完了するまで呼び出し元スレッドをブロックする。
71  /// @par
72  /// 非同期モードでは、 Core クラスのメンバ関数 Core#execute
73  /// を何度か呼び出すまで処理が完了しない。具体的な回数はDaemonプロセスの処理速度による。
74  /// 未処理の要求が存在するか否かはメンバ関数 #isBusy で取得できる。
75  /// 処理中に新たな要求を行った場合、現在の処理が完了するまで保留される。
76  ///
77  /// @ingroup g_common
78  class Backup
79  {
80  public:
81  /// @brief 登録可能な最大レコード数を取得する。
82  /// @return 登録可能な最大レコード数。
83  static std::size_t getMaxRecordCount();
84 
85  public:
86  // 下記は暗黙の定義を用いる。
87  //Backup() = default;
88  //‾Backup() = default;
89  //Backup(const Backup&) = default;
90  //Backup& operator=(const Backup&) = default;
91 
92  /// @brief 処理要求を非同期モードで行うか否かを取得する。
93  /// @retval true 非同期モードで行う場合。
94  /// @retval false 同期モードで行う場合。(既定値)
95  bool isAsync() const;
96 
97  /// @brief 処理要求を非同期モードで行うか否かを設定する。
98  /// @param[in] async
99  /// 非同期モードで行うならば true 。同期モードで行うならば false 。
100  ///
101  /// 既定では同期モードになっている。
102  void setAsync(bool async);
103 
104  /// @brief 処理未完了の要求があるか否かを取得する。
105  /// @retval true 処理未完了の要求がある場合。
106  /// @retval false アイドル状態の場合。
107  ///
108  /// 初期状態では false を返す。
109  ///
110  /// 下記のメンバ関数が正常に完了すると true を返すようになる。
111  ///
112  /// - #setupRecords
113  /// - #saveRecord
114  /// - #saveRecordByAddress
115  /// - #saveAllRecords
116  ///
117  /// その後、 Core クラスのメンバ関数 Core#execute 呼び出し等によって
118  /// 実際の処理が完了すると、再び false を返すようになる。
119  bool isBusy() const;
120 
121  /// @brief バックアップレコード情報配列をセットアップするように要求する。
122  /// @param[in] records バックアップレコード情報配列。
123  /// @param[in] count records の有効要素数。
124  /// @param[in] gameId
125  /// バックアップデータのゲームID。キーチップから取得させるなら nullptr 。
126  /// 別ゲームIDのバックアップデータを取得したい場合は明示する必要がある。
127  /// @return 要求状態値。引数や状態が不正な場合は無効値。
128  /// @see isBusy
129  ///
130  /// @exception Exception
131  /// - 引数 records に nullptr を指定した場合。
132  /// - 引数 records に不正な値の要素が含まれている場合。
133  /// - 引数 count に登録可能な最大レコード数よりも大きい値を指定した場合。
134  /// 登録可能な最大レコード数は静的メンバ関数 #getMaxRecordCount で取得できる。
135  /// - 引数 gameId に文字数が 4 文字以外の文字列を指定した場合。
136  ///
137  /// この関数はセットアップ処理の要求のみを行う。
138  /// 実際の処理は、 Core クラスのメンバ関数 Core#execute 呼び出しによって行われる。
139  ///
140  /// 下記のいずれかを満たす場合、この関数は無効な要求状態値を返す。
141  ///
142  /// - メンバ関数 #saveRecord または #saveRecordByAddress によるデータ保存要求が
143  /// 完了していない。
144  /// - 例外フック関数によって例外スローが抑止された。
145  ///
146  /// 無効な要求状態値が返ってきた場合、要求は発行されていない。
147  /// 有効であるか否かは
148  /// RequestState クラスのメンバ関数 RequestState#valid で判別できる。
149  ///
150  /// 要求が成功すると、即座にレコード情報が無効となり、下記のように動作する。
151  ///
152  /// - メンバ関数 #isSetupSucceeded は false を返す。
153  /// - メンバ関数 #getRecordCount は 0 を返す。
154  /// - メンバ関数 #getRecordStatus は BackupRecordStatus::InvalidCall を返す。
155  ///
156  /// 要求がDaemonプロセスによって正常に処理されることで有効になる。
157  ///
158  /// この関数を1フレーム内で連続して複数回呼び出した場合、
159  /// その度に要求が上書きされ、最後に行った要求のみがDaemonプロセスへ送られる。
161  const BackupRecord records[],
162  std::size_t count,
163  const wchar_t* gameId = nullptr);
164 
165  /// @brief バックアップレコード情報配列をセットアップするように要求する。
166  /// @param[in] records バックアップレコード情報配列。
167  /// @param[in] gameId
168  /// バックアップデータのゲームID。キーチップから取得させるなら nullptr 。
169  /// 別ゲームIDのバックアップデータを取得したい場合は明示する必要がある。
170  /// @return 要求状態値。引数や状態が不正な場合は無効値。
171  /// @see setupRecords(const BackupRecord[], std::size_t, const wchar_t*)
172  /// @note std::vector<BackupRecord> による登録を行うオーバロード。
174  const std::vector<BackupRecord>& records,
175  const wchar_t* gameId = nullptr)
176  {
177  return setupRecords(records.data(), records.size(), gameId);
178  }
179 
180  /// @brief バックアップレコード情報配列をセットアップするように要求する。
181  /// @tparam Count 配列要素数。
182  /// @param[in] records バックアップレコード情報配列。
183  /// @param[in] gameId
184  /// バックアップデータのゲームID。キーチップから取得させるなら nullptr 。
185  /// 別ゲームIDのバックアップデータを取得したい場合は明示する必要がある。
186  /// @return 要求状態値。引数や状態が不正な場合は無効値。
187  /// @see setupRecords(const BackupRecord[], std::size_t, const wchar_t*)
188  /// @note 組み込み配列による登録を行うオーバロード。
189  template<std::size_t Count>
191  const BackupRecord (&records)[Count],
192  const wchar_t* gameId = nullptr)
193  {
194  return setupRecords(records, Count, gameId);
195  }
196 
197  /// @brief 直近のセットアップ処理が成功したか否かを取得する。
198  /// @retval true 成功した場合。
199  /// @retval false 失敗したか、まだ完了していない場合。
200  ///
201  /// 個々のレコードのデータが壊れていたりする場合でもこの関数は true を返す。
202  /// 個々のレコードの状態はメンバ関数 #getRecordStatus で取得すること。
203  ///
204  /// この関数が false を返すのは、デバイス容量に対してレコードサイズの指定が
205  /// 大きすぎる等、レコード情報自体に不備がある場合のみである。
206  bool isSetupSucceeded() const;
207 
208  /// @brief 現在の有効レコード数を取得する。
209  /// @return 有効レコード数。セットアップが未完了ならば 0 。
210  std::size_t getRecordCount() const;
211 
212  /// @brief 直近のセットアップにおけるバックアップレコードステータスを取得する。
213  /// @param[in] recordIndex バックアップレコードインデックス。
214  /// @return バックアップレコードステータス。
215  ///
216  /// @exception Exception
217  /// - セットアップが未完了である場合。
218  /// - 引数 recordIndex に現在の有効レコード数以上の値を指定した場合。
219  /// 現在の有効レコード数はメンバ関数 #getRecordCount で取得できる。
220  ///
221  /// 例外フック関数によって例外スローが抑止された場合は
222  /// BackupRecordStatus::InvalidCall を返す。
223  BackupRecordStatus getRecordStatus(std::size_t recordIndex) const;
224 
225  /// @brief 直近のセットアップにおけるバックアップレコードステータスを取得する。
226  /// @param[in] recordAddress バックアップレコードデータのアドレス。
227  /// @return バックアップレコードステータス。
228  ///
229  /// @exception Exception
230  /// - セットアップが未完了である場合。
231  /// - 引数 recordAddress に nullptr を指定した場合。
232  /// - 引数 recordAddress に指定した値が有効なデータアドレスを指していない場合。
233  /// - 引数 recordAddress に指定した値を持つレコードが複数存在する場合。
234  ///
235  /// バックアップレコードデータのアドレスを指定して保存要求を行う。
236  /// アドレスとは、 BackupRecord 構造体の
237  /// BackupRecord#address メンバに設定したものである。
238  ///
239  /// 内部でバックアップレコードデータが先頭から順に検索され、
240  /// 該当レコードが見つかった後はメンバ関数 #getRecordStatus と同等の処理を行う。
241  ///
242  /// 該当レコードが見つからなかった場合や複数見つかった場合は例外をスローする。
243  /// 例外フック関数によって例外スローが抑止された場合は
244  /// BackupRecordStatus::InvalidCall を返す。
245  BackupRecordStatus getRecordStatusByAddress(const void* recordAddress) const;
246 
247  /// @brief バックアップレコードデータを保存するように要求する。
248  /// @param[in] recordIndex バックアップレコードインデックス。
249  /// @return 要求状態値。引数や状態が不正な場合は無効値。
250  /// @see executeSave, isBusy
251  ///
252  /// @exception Exception
253  /// - セットアップが未完了である場合。
254  /// - 引数 recordIndex に現在の有効レコード数以上の値を指定した場合。
255  /// 現在の有効レコード数はメンバ関数 #getRecordCount で取得できる。
256  ///
257  /// この関数は保存処理の要求のみを行う。
258  /// 実際の処理は、 Core クラスのメンバ関数 Core#execute 呼び出しか、
259  /// 当クラスのメンバ関数 #executeSave 呼び出しによって行われる。
260  ///
261  /// 下記のいずれかを満たす場合、この関数は無効な要求状態値を返す。
262  ///
263  /// - メンバ関数 #setupRecords によるセットアップ要求が完了していない。
264  /// - 例外フック関数によって例外スローが抑止された。
265  ///
266  /// 無効な要求状態値が返ってきた場合、要求は発行されていない。
267  /// 有効であるか否かは
268  /// RequestState クラスのメンバ関数 RequestState#valid で判別できる。
269  ///
270  /// この関数を1フレーム内で連続して複数回呼び出した場合、
271  /// それらの要求は一度にまとめてDaemonプロセスへ送られる。
272  RequestState saveRecord(std::size_t recordIndex);
273 
274  /// @brief バックアップレコードデータを保存するように要求する。
275  /// @param[in] recordAddress バックアップレコードデータのアドレス。
276  /// @return 要求状態値。引数や状態が不正な場合は無効値。
277  /// @see executeSave, isBusy
278  ///
279  /// @exception Exception
280  /// - セットアップが未完了である場合。
281  /// - 引数 recordAddress に nullptr を指定した場合。
282  /// - 引数 recordAddress に指定した値が有効なデータアドレスを指していない場合。
283  ///
284  /// バックアップレコードデータのアドレスを指定して保存要求を行う。
285  /// アドレスとは、 BackupRecord 構造体の
286  /// BackupRecord#address メンバに設定したものである。
287  ///
288  /// 内部でバックアップレコードデータが先頭から順に検索され、
289  /// 該当レコードが見つかった後はメンバ関数 #saveRecord と同等の処理を行う。
290  /// 該当レコードが複数見つかった場合はそれらすべてを対象とする。
291  ///
292  /// 該当レコードが見つからなかった場合は例外をスローする。
293  /// 例外フック関数によって例外スローが抑止された場合は無効な要求状態値を返す。
294  RequestState saveRecordByAddress(const void* recordAddress);
295 
296  /// @brief すべてのバックアップレコードデータを保存するように要求する。
297  /// @return 要求状態値。状態が不正な場合は無効値。
298  /// @see executeSave, isBusy
299  ///
300  /// @exception Exception
301  /// セットアップが未完了である場合。
302  ///
303  /// 登録されている全バックアップレコードの保存要求を行う。
304  ///
305  /// この関数は保存処理の要求のみを行う。
306  /// 実際の処理は、 Core クラスのメンバ関数 Core#execute 呼び出しか、
307  /// 当クラスのメンバ関数 #executeSave 呼び出しによって行われる。
308  ///
309  /// メンバ関数 #setupRecords によるセットアップ要求が完了していない場合、
310  /// この関数は無効な要求状態値を返す。
311  /// 無効な要求状態値が返ってきた場合、要求は発行されていない。
312  /// 有効であるか否かは
313  /// RequestState クラスのメンバ関数 RequestState#valid で判別できる。
314  ///
315  /// この関数を1フレーム内で連続して複数回呼び出した場合、
316  /// 2回目以降は何もせずに有効な要求状態値を返す。
318 
319  /// @brief バックアップレコードデータの保存要求を即座に完了させる。
320  /// @retval true 保存処理に成功した場合。
321  /// @retval false 保存処理に失敗したか、保存要求が行われていない場合。
322  ///
323  /// メンバ関数 #saveRecord 等によるバックアップレコードデータの保存要求は、
324  /// 通常 Core クラスのメンバ関数 Core#execute が呼び出されるまで実施されない。
325  ///
326  /// この関数を呼び出すと、その時点で未完了の保存要求を、
327  /// Core#execute の呼び出しを待たず即座に完了させる。
328  ///
329  /// この関数は同期モード、非同期モードには依存しない。
330  /// どちらのモードであっても動作に違いはない。
331  ///
332  /// 未完了の保存要求が存在しない場合、この関数は何も行わずに false を返す。
333  ///
334  /// Daemonプロセスが処理完了するまで呼び出し元スレッドをブロックする。
335  bool executeSave();
336  };
337 
338 /// @}
339 } // namespace amdaemon
340 
341 #endif // AMDAEMON_BACKUP_H
RequestState saveRecord(std::size_t recordIndex)
バックアップレコードデータを保存するように要求する。
bool isBusy() const
処理未完了の要求があるか否かを取得する。
Daemonプロセスへの処理要求状態を保持するクラス。
Definition: RequestState.h:37
BackupRecordStatus
バックアップレコード状態列挙。
Definition: BackupRecordStatus.h:17
bool isSetupSucceeded() const
直近のセットアップ処理が成功したか否かを取得する。
不揮発データバックアップレコード情報構造体。
Definition: BackupRecord.h:25
不揮発データバックアップレコード情報構造体 BackupRecord のヘッダ。
Daemonライブラリの環境定義を行うヘッダ。
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
Daemonプロセスへの処理要求状態を保持するクラス RequestState のヘッダ。
std::size_t getRecordCount() const
現在の有効レコード数を取得する。
RequestState saveAllRecords()
すべてのバックアップレコードデータを保存するように要求する。
RequestState setupRecords(const BackupRecord records[], std::size_t count, const wchar_t *gameId=nullptr)
バックアップレコード情報配列をセットアップするように要求する。
RequestState saveRecordByAddress(const void *recordAddress)
バックアップレコードデータを保存するように要求する。
不揮発メモリアクセス処理を提供するMonostateクラス。
Definition: Backup.h:78
RequestState setupRecords(const std::vector< BackupRecord > &records, const wchar_t *gameId=nullptr)
バックアップレコード情報配列をセットアップするように要求する。
Definition: Backup.h:173
BackupRecordStatus getRecordStatus(std::size_t recordIndex) const
直近のセットアップにおけるバックアップレコードステータスを取得する。
RequestState setupRecords(const BackupRecord(&records)[Count], const wchar_t *gameId=nullptr)
バックアップレコード情報配列をセットアップするように要求する。
Definition: Backup.h:190
void setAsync(bool async)
処理要求を非同期モードで行うか否かを設定する。
バックアップレコード状態列挙 BackupRecordStatus のヘッダ。
static std::size_t getMaxRecordCount()
登録可能な最大レコード数を取得する。
bool executeSave()
バックアップレコードデータの保存要求を即座に完了させる。
BackupRecordStatus getRecordStatusByAddress(const void *recordAddress) const
直近のセットアップにおけるバックアップレコードステータスを取得する。
bool isAsync() const
処理要求を非同期モードで行うか否かを取得する。