1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     cec_MessageBox.h
4 
5   Copyright 2009 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2011-01-24#$
14   $Rev: 33743 $
15   $Author: sato_yoshinobu $
16  *---------------------------------------------------------------------------*/
17 #ifndef __MESSAGE_BOX_H__
18 #define __MESSAGE_BOX_H__
19 
20 
21 /*
22     CEC/
23     |
24     +-- MessageBoxList
25     \-- Message_BOX1/
26     |   |
27     |   +-- MessageBoxInfo
28     |   \-- InBox/
29     |   |   |
30     |   |   +-- InBoxInfo
31     |   |   +-- Message1
32     |   |
33     |   \-- OutBox/
34     |       |
35     |       +-- OutBoxIndex
36     |       +-- OutBoxInfo
37     |       +-- Message2
38     |
39     \-- Message_BOX2/
40     |
41 
42 */
43 
44 #define CEC_INBOX_SIZE_DEFAULT         (512*1024)   //! 受信Box サイズ初期値
45 #define CEC_OUTBOX_SIZE_DEFAULT        (512*1024)   //! 送信Box サイズ初期値
46 #define CEC_INBOX_MESSNUM_DEFAULT      (99)
47 #define CEC_OUTBOX_MESSNUM_DEFAULT     (99)
48 #define CEC_MESSSIZEMAX_DEFAULT        (100*1024)
49 
50 #define CEC_BOX_DATA_SIZE_MAX           (10*1024)
51 
52 #define CEC_BOXNUMMAX_APPLICATION      (12)        // 一般アプリケーション用 Box 最大数
53 #define CEC_BOXNUMMAX_SYSTEM           (6)        // System アプリケーション用 Box 最大数
54 #define CEC_BOXNUMMAX_SYSTEM2          (6)         // System アプリケーション その2 用 Box 最大数
55 #define MESSAGE_BOX_NUM_MAX     (CEC_BOXNUMMAX_APPLICATION + CEC_BOXNUMMAX_SYSTEM + CEC_BOXNUMMAX_SYSTEM2)
56 
57 #define CEC_BOXDIR_NAMELEN_MAX (16)
58 
59 #include <nn/cec/CTR/cec_Api.h>
60 namespace nn {
61 namespace cec {
62 namespace CTR {
63 //! @name MessageBoxFlag
64 //@{
65 /*!
66  * @typedef  MessageBoxFlag
67  * @brief MessageBox の属性を示すフラグです。
68  */
69 typedef bit8 MessageBoxFlag;
70 /*! @brief      一般アプリケーション用<br>デフォルトでこの値が指定されています。 */
71     static const bit8 MESSAGE_BOX_FLAG_APPLICATION  =  (0x1);
72 /* @brief      System アプリケーション用  */
73     static const bit8 MESSAGE_BOX_FLAG_SYSTEM  =  (0x2);
74 /* @brief      System アプリケーション用 その2  */
75     static const bit8 MESSAGE_BOX_FLAG_SYSTEM2  =  (0x4);
76 /* @brief      接続時にBOXの存在を通知しない  */
77     static const bit8 MESSAGE_BOX_FLAG_HIDDEN  =  (0x80);
78 
79 //@}
80 
81 
82 /*!
83  * @enum  CecBoxType
84  * @brief 受信BOX/ 送信BOX の種別
85  */
86 enum CecBoxType
87 {
88     CEC_BOXTYPE_INBOX  = (0x0),     //!< 受信BOX
89     CEC_BOXTYPE_OUTBOX = (0x1)      //!< 送信BOX
90 };
91 
92 
93 // 構造体
94 #define MESSAGEBOXLIST_MAGIC        0x6868
95 #define CEC_BOX_VERSION             0x00000001
96 struct MessageBoxList
97 {
98     u16     magic16;
99     NN_PADDING2;
100     u32     CecBoxVersion;
101     u32     DirNum;
102     u8      DirName[MESSAGE_BOX_NUM_MAX][CEC_BOXDIR_NAMELEN_MAX];
103 };
104 
105 //ローカル管理用メッセージリスト
106 #define MESSAGEBOXINFO_MAGIC        0x6363
107 struct MessageBoxInfo
108 {
109     u16 magic16;
110     NN_PADDING2;
111     u32 cecTitleId;                     // Title固有ID
112     u32 privateId;                  // アプリがつける固有ID。アクセスする為のキーとなる。
113     MessageBoxFlag MessageBoxInfoFlag;         // MessageBoxInfoのフラグ(Systemなど)
114     bool isActive;
115     NN_PADDING2;
116     char  hmacKey[MESSAGE_HMAC_KEYLEN];    // HMACで署名を付けるときに使用するKey
117     u32 MessageBoxInfoSize;         // MessageBoxInfoのサイズ(Byte)
118     nn::fnd::DateTimeParameters lastOpened;     // アクセス時の時刻を記録
119     u8   flag1;                 // アクセス時に変更するフラグ1 未読フラグ
120     u8   flag2;                 // アクセス時に変更するフラグ2 新着フラグ
121     NN_PADDING2;
122     nn::fnd::DateTimeParameters lastReceived;     // 受信時の時刻を記録
123     u8  reserved[16];             // reserved (名称・iconなどは別ファイルに書く)
124 };
125 
126 
127 // 送信/受信 ボックス情報ファイル データ構造
128 
129 /*
130   File : InBoxInfo/OutBoxInfo
131   +----------------------+
132   |  CEC Box Info Header |
133   +----------------------+ -+
134   |  CEC Message Header1 |  |
135   +----------------------+  | CecMessageHeader_List
136   |  CEC Message Header2 |  |
137   +----------------------+  |
138   |  CEC Message Header3 |  |
139   +----------------------+  |
140   |    ..........        |  |
141   |                      |  |
142   +----------------------+ -+
143 */
144 
145 
146 
147 #define CEC_BOXINFO_MAGIC        0x6262
148 #define CEC_SIZEOF_BOXINFO_HEADER (sizeof(struct CecBoxInfoHeader))
149 struct CecBoxInfoHeader
150 {
151     u16 magic16;
152     NN_PADDING2;
153     u32 boxInfoSize;                // BoxInfoのサイズ
154     u32 boxSizeMax;                 // MessageBoxのサイズ(Byte)最大値
155     u32 boxSize;                    // MessageBoxのサイズ(使用量)(Byte)
156     u32 messNumMax;                 // ボックスに格納可能な message数 の最大値
157     u32 messNum;                    // ボックスに格納されているmessage数
158     u32 groupNumMax;                // ボックスに格納可能な Message Group 数 の最大値
159     u32 messSizeMax;                // 1つのMessageの最大サイズ
160 };
161 
162 
163 // 送信ボックス Index ファイル (送信順を示す)
164 #define CEC_OUTBOXINDEX_MAGIC        0x6767
165 struct CecOutBoxIndexHeader
166 {
167     u16 magic16;
168     NN_PADDING2;
169     size_t messageNum;                // Message の 個数
170 };
171 
172 
173 
174 /*!
175     @brief CEC MessageBox にアクセスするためのクラスです。
176 
177            Box の作成・削除、Messageの書き込み・読み込み、Boxの情報取得などを行うことができます。<br>
178            @ref CreateMessageBox でBoxを作成、@ref OpenMessageBox で そのBoxを開くことで、Box内のMessageにアクセスすることが可能になります。<br>
179            @ref WriteMessage でMessageをBoxに書き込みます。送信BOXに書き込んだMessageが送信されます。
180            受信したMessageは受信BOXに格納され、 @ref ReadMessage で読み込むことができます。<br>
181            Boxへのアクセス終了時には @ref CloseMessageBox を呼び出してください。CloseMessageBox/CommitMessageBoxを呼び出したときに変更がコミットされます。コミットする前にプログラムが終了されたときは、それまでの変更は巻き戻される可能性があります。スリープなど、通信の制御がシステムに戻ったときに、変更が巻き戻される可能性もあるため、注意してください。<br>
182            Open ~ Close までを 1 単位の処理とし、その間をスリープと排他にするのが安全な実装です。<br>
183            <br>
184            Messageを作成して書き込むとき、Messageに MessageId が付与されます。MessageId はランダムに生成されるユニークな値になっており、この値をキーとして各Messageにアクセスします。<br>
185            <br>
186            個々のMessageの属性などの情報を、GetMessageXXX 関数で取得することができます。<br>
187            GetMessageXXX 関数はシステム内部に保持されているMessageリストから情報を取り出すため、
188            ReadMessage で、Message実体にアクセスするより高速に情報取得できます。この情報は、OpenMessageBoxを呼んだときにシステムから読み出されます。<br>
189            予期せぬ電源断等で、システムが保持するMessageリストと、Message実体の情報がずれる可能性があります。(MessageIdの取得はできるが、ReadMessage に失敗する等) WriteMessage でMessageの書き込みを行うことでMessageリストの再生成が行われますが、復旧できないような状態に陥ったときは、
190            DeleteAllMessages , DeleteMessageBox で削除を行ってください。<br>
191            <br>
192            @ref WriteMessage でMessageを書き込むとき、EULAの同意バージョンチェックが行われます。<br>
193            チェックには fs の機能を使用しますので、事前にfsライブラリの初期化を行う必要があります。
194 
195 */
196 
197 class MessageBox
198 {
199  protected:
200     u32     currentCecTitleId;
201 
202     bool    m_Initialized;
203     NN_PADDING3;
204 
205     u8* cecBoxBuf;
206 
207     struct MessageBoxList       cecMessageBoxList;
208     struct MessageBoxInfo       cecMessageBoxInfo;
209 
210     struct CecBoxInfoHeader       cecInboxInfo;
211     CecMessageHeader*             cecInboxInfo_body[CEC_INBOX_MESSNUM_DEFAULT];
212     u8*                           cecInboxInfoBuf;
213     struct CecBoxInfoHeader       cecOutboxInfo;
214     CecMessageHeader*             cecOutboxInfo_body[CEC_OUTBOX_MESSNUM_DEFAULT];
215     u8*                           cecOutboxInfoBuf;
216 
217     CecOutBoxIndexHeader          cecOutboxIndex_header;
218     //u8*                           cecOutboxIndex[CEC_OUTBOX_MESSNUM_DEFAULT];
219     CECMessageId                    cecOutboxIndex[CEC_OUTBOX_MESSNUM_DEFAULT];
220 //    u8*                           cecOutboxIndexBuf;
221 
222     bool    m_BoxAccessible;
223 
224     NN_PADDING3;
225     static bool b_SkipedWriteInboxInfo;
226     static bool b_SkipedWriteOutboxInfo;
227     static struct CecBoxInfoHeader       tmp_cecInboxInfo;
228     static struct CecBoxInfoHeader       tmp_cecOutboxInfo;
229 
230 
231  public:
232 
233     MessageBox(bool NoInitialize = false);
234     virtual ~MessageBox();
235 
236     nn::Result      Initialize();
237     nn::Result      Finalize();
238 
239     nn::Result     WriteMessageBoxList();
240     size_t     ReadMessageBoxList();
241     size_t     ReadMessageBoxList(void* bufOut, size_t size);
242 
243     u32         GetMessageBoxNum(MessageBoxFlag flag);
244     nn::Result  DeleteOldestMessageBox(MessageBoxFlag flag);
245 
GetCurrentCecTitleId()246     inline  u32 GetCurrentCecTitleId() const{return currentCecTitleId;}
247 
248 
249     //! @name Boxの作成/削除
250     //@{
251 
252     /*!
253       @brief        MessageBoxを作成します。Box内に 受信BOX と 送信BOX が作成されます。<br>
254                     送信BOX に Message をセットすることで、すれちがい通信時にデータ送信が行われ、受信BOXに相手からのデータが保持されます。
255 
256                     MessageBoxは、NAND領域に作成されます。1アプリにつき、作成できるBOXは1つです。BOXの最大数は12で、これを超える場合は新規にBOXを作成することはできません。<br>
257                     作成した直後はBOXをオープンした状態( @ref OpenMessageBox )になります。
258                     <br>
259                     privateId, hmacKey はアクセス可能な範囲を制限する為の値です。アプリ側で値を決めて、設定してください。<br>
260                     privateId はBOXをOpenするために必要なキーで、1本体内に閉じられた値を想定しています。<br>
261                     hmacKey は同一アプリが共通して持つキー(秘密鍵)で、データの改竄・アプリの偽装を防ぐ目的にも使用されます。類推されない値を設定してください。このキーはBOXに保持されます。<br>
262                     複数セーブデータ・複数アプリから同一のBOXにアクセスする必要がある場合は、適切な範囲で共通するキーを作成して設定してください。<br>
263                     <br>
264                     この関数を呼ぶと、バックグラウンドで動作している CECデーモンが停止します。<br>
265                     バックグラウンドで行われている通信が中断される可能性があることに注意してください。→ @ref CecControl::StopScanning <br>
266                     <br>
267                     すれちがい通信関連で、本体管理画面等で扱われるアイコンには2種類あります。<br>
268                     Boxに付随するアイコン・個々のMessageに付随するアイコンがあり、これらを設定しておく必要があります。<br>
269                     この関数では、Boxのアイコンをセットします。
270 
271       @param[in]    cecTitleId      32ビットの すれちがい通信ID です。
272                                     @ref MakeCecTitleId で生成することが可能です。
273       @param[in]    privateId       BOXをOpenするために必要なキーとなります。→ @ref OpenMessageBox <br>
274                                     BOXにアクセスするアプリが保持している値を使用する必要があります。
275 
276       @param[in]    hmacKey         Message を読み出すときに必要なキーを指定します。32文字の文字列で指定します。
277                                     通信相手と共通のキー(秘密鍵)である必要があります。<br>
278                                     この値は、送受信されるデータの改竄をチェックするために使用されます。送受信されるデータには、このキーを使用して生成された署名が付けられます。<br>
279                                     アプリ内で保持している値を使用してください。
280 
281       @param[in]    icon            アイコンを指定します。<br>
282                                 フォーマット: RGB565 (リトルエンディアン)<br>
283                                 サイズ:       48×48 (4.5KBytes) <br>
284       @param[in]    iconSize        アイコンのデータサイズを指定します。
285       @param[in]    name            アプリ名称を指定します。<br>
286                                 文字コード:   UTF16-LE<br>
287                                 表示サイズ:   全角17文字で表示できる文字数<br>
288                                 バッファ最大: 64×2Bytes (NULL終端込み)<br>
289       @param[in]    nameSize        アプリ名称のデータサイズを指定します。
290       @param[in]    inboxSizeMax    受信ボックスの最大保存サイズを指定します。受信BOXと送信BOXで合わせて 1MB 以内にする必要があります。デフォルトは 512*1024 バイトです。
291       @param[in]    outboxSizeMax    送信ボックスの最大保存サイズを指定します。受信BOXと送信BOXで合わせて 1MB 以内にする必要があります。デフォルトは 512*1024 バイトです。
292       @param[in]    inboxMessNumMax    受信ボックスの最大保存Message数を指定します。デフォルトは 99 で、この値より多い値を指定することはできません。
293       @param[in]    outboxMessNumMax    送信ボックスの最大保存Message数を指定します。デフォルトは 99 で、この値より多い値を指定することはできません。
294       @param[in]    messageSizeMax    Messageの最大サイズを指定します。このサイズを超えるMessageは保存できず、WriteMessage でエラーとなります。
295       @return       nn::Result
296         @retval       ResultSuccess                 成功しました。
297         @retval       ResultBoxAlreadyExists        既にボックスが存在する為、BOXを作成することができません。<br>
298                                                     OpenMessageBox == nn::cec::ResultNoData() の状態でこのエラーが
299                                                     返ってきたときは、CecTitleIdの下位 8bit が異なる BOX が作成されていることが原因の可能性があります。 → @ref MakeCecTitleId , @ref OpenMessageBox
300 
301         @retval       ResultBoxNumFull              ボックスを作成できる上限に達しています。
302                                                     新しくボックスを作る場合は、他のタイトルのボックスを
303                                                     削除する必要があります。
304         @retval       ResultInvalidArgument         引数の指定に誤りがあります。
305         @retval       ResultInvalidData             セットしているデータ(アイコン・名称)に問題があります。
306         @retval       ResultTooLarge                セットしているデータサイズに問題があります。
307         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。時間を空けて再アクセスすることで成功する可能性があります。
308         @retval       上記以外                      失敗しました。
309     */
310     nn::Result  CreateMessageBox(
311                     const TitleId cecTitleId, const u32 privateId,
312                     const char* hmacKey,
313                     void*       icon,   size_t  iconSize,
314                     wchar_t*    name,   size_t  nameSize,
315                     size_t  inboxSizeMax = CEC_INBOX_SIZE_DEFAULT,
316                     size_t  outboxSizeMax = CEC_OUTBOX_SIZE_DEFAULT,
317                     size_t  inboxMessNumMax = CEC_INBOX_MESSNUM_DEFAULT,
318                     size_t  outboxMessNumMax = CEC_OUTBOX_MESSNUM_DEFAULT,
319                     size_t  messageSizeMax = CEC_MESSSIZEMAX_DEFAULT
320                 );
321 
322     /*!
323       :private
324       @brief        MessageBoxを作成します。Box内に 受信BOX と 送信BOX が作成されます。<br>
325 
326                     (最終バージョンでは、アイコンとアプリ名称の設定が必須になります。この形式は過去のバージョンとの互換性のために残されています。)
327 
328       @param[in]    cecTitleId      すれちがい通信ID
329       @param[in]    privateId       BOXをOpenするために必要なキーとなります。→ @ref OpenMessageBox <br>
330                                     BOXにアクセスするアプリが保持している値を使用する必要があります。
331 
332       @param[in]    hmacKey         Message を読み出すときに必要なキーを指定します。32文字の文字列で指定します。
333                                     通信相手と共通のキーである必要があります。<br>
334                                     この値は、送受信されるデータの改竄をチェックするために使用されます。送受信されるデータには、このキーを使用して生成された署名が付けられます。
335                                     アプリ内で保持している値を使用してください。
336 
337       @param[in]    inboxSizeMax    受信ボックスの最大保存サイズを指定します。受信BOXと送信BOXで合わせて 1MB 以内にする必要があります。デフォルトは 512*1024 バイトです。
338       @param[in]    outboxSizeMax    送信ボックスの最大保存サイズを指定します。受信BOXと送信BOXで合わせて 1MB 以内にする必要があります。デフォルトは 512*1024 バイトです。
339       @param[in]    inboxMessNumMax    受信ボックスの最大保存Message数を指定します。デフォルトは 99 で、この値より多い値を指定することはできません。
340       @param[in]    outboxMessNumMax    送信ボックスの最大保存Message数を指定します。デフォルトは 99 で、この値より多い値を指定することはできません。
341       @param[in]    messageSizeMax    Messageの最大サイズを指定します。このサイズを超えるMessageは保存できず、WriteMessage でエラーとなります。
342       @return       nn::Result
343         @retval       ResultSuccess                 成功しました。
344         @retval       ResultBoxAlreadyExists        既にボックスが存在します。
345         @retval       ResultBoxNumFull              ボックスを作成できる上限に達しています。
346                                                     新しくボックスを作る場合は、他のタイトルのボックスを
347                                                     削除する必要があります。
348         @retval       ResultInvalidArgument         引数の指定に誤りがあります。
349         @retval       ResultInvalidData             セットしているデータに問題があります。
350         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。時間を空けて再アクセスすることで成功する可能性があります。
351         @retval       上記以外                      失敗しました。
352     */
353     nn::Result  CreateMessageBox(
354                     const TitleId cecTitleId, const u32 privateId,
355                     const char* hmacKey,
356                     size_t  inboxSizeMax = CEC_INBOX_SIZE_DEFAULT,
357                     size_t  outboxSizeMax = CEC_OUTBOX_SIZE_DEFAULT,
358                     size_t  inboxMessNumMax = CEC_INBOX_MESSNUM_DEFAULT,
359                     size_t  outboxMessNumMax = CEC_OUTBOX_MESSNUM_DEFAULT,
360                     size_t  messageSizeMax = CEC_MESSSIZEMAX_DEFAULT
361                 );
362 
363     void       CreateInBox(const TitleId cecTitleId);
364     void       CreateOutBox(const TitleId cecTitleId);
365 
366     /*!
367       @brief        MessageBox を削除します。
368 
369                     @ref OpenMessageBox で開いているBoxを削除します。<br>
370 
371       @return       nn::Result
372         @retval       ResultSuccess                 成功しました。
373         @retval       ResultNotAuthorized           ボックスがOpenされていません。
374         @retval       上記以外                      失敗しました。
375     */
376     nn::Result      DeleteMessageBox();
377 
378     /*!
379       @brief        MessageBox を削除します。すれちがい通信ID を指定して削除します。
380                     MessageBoxをOpenできないときに強制的に削除するといった用途に使用します。別アプリのMessageBoxを削除しないでください。
381 
382       @param[in]    cecTitleId          すれちがい通信ID
383       @return       nn::Result
384         @retval       ResultSuccess                 成功しました。
385         @retval       上記以外                      失敗しました。
386     */
387     nn::Result      DeleteMessageBox(const TitleId cecTitleId);
388 
389     nn::Result      DeleteAllBoxes();
390 
391     /*!
392       @brief        MessageBox を開きます。Box内のMessageにアクセスするために、まずこの関数でBoxを開く必要があります。
393 
394                     この関数を呼ぶと、バックグラウンドで動作している CECデーモンが停止します。<br>
395                     バックグラウンドで行われている通信が中断される可能性があることに注意してください。 → @ref CecControl::StopScanning <br>
396                     Boxへのアクセス終了時には @ref CloseMessageBox を呼び出してください。<br>
397                     この関数を呼んだ後、CloseMessageBoxを呼ぶまでは、CECデーモンは動作を開始しない状態
398                     のままになります。送信メッセージのセット時、受信メッセージの取得時以外は、Open したままの状態にならないようにしてください。
399                     <br>
400                     Open ~ Close までを 1 単位の処理とし、その間をスリープと排他にするのが安全な実装です。
401 
402       @param[in]   cecTitleId          すれちがい通信ID
403       @param[in]   privateId        @ref CreateMessageBox でBOXを作成したときに指定した値と同じ値を指定します。
404                                    値が異なる場合はアクセスできません。
405       @return       nn::Result
406         @retval       ResultSuccess                 成功しました。
407         @retval       ResultNoData                  ボックスが存在しません。
408         @retval       ResultNotAuthorized           PrivateIdが異なる為、アクセスできません。
409         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。時間を空けて再アクセスすることで成功する可能性があります。
410         @retval       上記以外                      失敗しました。
411     */
412     nn::Result      OpenMessageBox(const TitleId cecTitleId, const u32 privateId);
413 
414 
415     void            CloseMessageBox(bool bWithoutCommit);
416 
417     /*!
418       @brief        MessageBox を閉じます。以後はMessageへのアクセスはできません。
419 
420                     @ref OpenMessageBox を呼んだときにバックグラウンドのデーモンの動作を停止したときは、この関数を呼ぶと動作開始します。<br>
421                     @ref CommitMessageBox の処理も行われます。MessageBoxへのアクセスが終わったときに呼び出してください。
422 
423       @return       なし
424     */
425     void            CloseMessageBox();
426 
427     /*!
428       @brief        MessageBox が既にOpenされているかを取得します。
429 
430       @return       既にOpenされていれば true
431     */
432     bool            IsOpened();
433 
434     //@}
435 
436     /*!
437       @brief       MessageBox の 有効/無効 を指定します。無効にされているBOXのデータは送受信されません。
438       @param[in]   active           有効: true / 無効: false
439       @return       nn::Result
440         @retval       ResultSuccess                 成功しました。
441         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。
442         @retval       上記以外                      失敗しました。
443     */
444     nn::Result      SetBoxActivate(bool active);
445 
446     /*!
447       @brief       MessageBox の 有効/無効 を取得します。無効にされているBOXのデータは送受信されません。
448       @return      有効: true / 無効: false
449     */
450     bool            GetBoxActivate();
451 
452     nn::Result     ReadMessageBoxInfo(struct MessageBoxInfo* outbuf) const;
453 
454     nn::Result    GetBoxInfo(struct CecBoxInfoHeader* boxinfo, CecMessageHeader** boxInfoBody, CecBoxType boxType) const ;
455     nn::Result     ReadBoxInfo(struct CecBoxInfoHeader* boxinfo, CecMessageHeader** boxInfoBody, u8* buf, CecBoxType boxType);
456 
457  protected:
458     nn::Result     ReadMessageBoxInfo(struct MessageBoxInfo* outbuf, TitleId cecTitleId) const;
459     nn::Result     ReadMessageBoxInfo() const;
460     nn::Result     WriteMessageBoxInfo();
461 
462     nn::Result     WriteBoxInfo( CecBoxType boxType ,CecBoxInfoHeader& boxInfo , CecMessageHeader** boxInfoBody);
463     nn::Result     ReadInBoxInfo();
464 
465     nn::Result     WriteInBoxInfo();
466     nn::Result     ReadOutBoxInfo();
467     nn::Result     WriteOutBoxInfo();
468 
469 
470  public:
471     //! @name Message操作
472     //@{
473     /*!
474       @brief        Message を読み出します。
475       @param[out]  cecMessage   読み出し先の @ref Message クラスのオブジェクト
476       @param[out]  buf          Message のバイナリ列を格納するバッファ
477       @param[in]   bufLen       バッファのサイズ
478       @param[in]   boxType      受信BOX/送信BOXの指定
479       @param[in]   messageId    MessageId の指定
480       @return       nn::Result
481         @retval       ResultSuccess                 成功しました。
482         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。時間を空けて再アクセスすることで成功する可能性があります。
483         @retval       ResultNotAuthorized           ボックスがOpenされていません。
484         @retval       ResultInvalidArgument         引数の指定に誤りがあるため、読み出すことができません。
485         @retval       上記以外                      失敗しました。
486     */
487     nn::Result  ReadMessage(
488         Message& cecMessage, void* buf, const size_t bufLen, const CecBoxType boxType, const MessageId& messageId);
489     /*!
490     :private
491       @brief        Message を読み出します。
492       @param[out]   bufOut      Message のバイナリ列を格納するバッファ
493       @param[in]   bufLen       バッファのサイズ
494       @param[in]   boxType      受信BOX/送信BOXの指定
495       @param[in]   messageId    MessageId の指定
496       @return       nn::Result
497     */
498     nn::Result  ReadMessage(
499         void* bufOut, const size_t bufLen, const CecBoxType boxType, const MessageId& messageId);
500 
501     /*!
502       @brief        Message を本体保存領域に書きこみます。
503 
504                     Messageのサイズが 100KB(ヘッダ・アイコン等を含む) を超える場合、またはBOXの最大保存容量/個数 をオーバーする場合は書き込むことができません。<br>
505                     NAND(保存領域)のブロックサイズは 4KB であるため、Messageのサイズによっては、最大保存容量まで書き込むことができない場合があります。<br>
506                     書き込みの後、CloseMessageBox または CommitMessageBox を呼んだときに、書き込んだデータを確実なものとします。
507                    <br>
508                    Messageを書き込むとき、EULAの同意バージョンチェックが行われますので、ROMにアイコンファイル(ICNファイル)を設定していないと ResultNotAgreeEula が返ります。<br>
509                    チェックには fs の機能を使用しますので、事前にfsライブラリの初期化を行う必要があります。
510 
511       @param[in]    cecMessage      @ref Message クラスのオブジェクト
512       @param[in]    boxType         受信BOX/送信BOXの指定
513       @param[out]   messageIdOut    書き込むときに付与される MessageId が返ります。
514       @return       nn::Result
515         @retval       ResultSuccess                 成功しました。
516         @retval       ResultNotAuthorized           ボックスがOpenされていません。
517         @retval       ResultMessTooLarge            Messageが大きすぎます。
518         @retval       ResultBoxSizeFull             ボックスの容量をオーバーしています。
519         @retval       ResultBoxMessNumFull          ボックスの最大個数をオーバーしています。
520         @retval       ResultNoData                  Messageに本文/アイコンが設定されていません。
521         @retval       ResultInvalidCombination      送信回数と伝播回数の値が共に2以上に設定されています。
522         @retval       ResultNotAgreeEula            EULAに同意されていない、もしくはROMにアイコンファイル(ICNファイル)が設定されていません。
523         @retval       ResultParentalControlCec      ParentalControlで許可されていません。
524         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。時間を空けて再アクセスすることで成功する可能性があります。
525         @retval       上記以外                      失敗しました。
526     */
527     nn::Result  WriteMessage(
528         const Message& cecMessage,const CecBoxType boxType, MessageId& messageIdOut);
529 
530     /*!
531       @brief        Message を本体保存領域に書きこみます。
532 
533                     Messageのサイズが 100KB(ヘッダ・アイコン等を含む) を超える場合、またはBOXの最大保存容量/個数 をオーバーする場合は書き込むことができません。<br>
534                     NAND(保存領域)のブロックサイズは 4KB であるため、Messageのサイズによっては、最大保存容量まで書き込むことができない場合があります。<br>
535                     書き込みの後、CloseMessageBox または CommitMessageBox を呼んだときに、書き込んだデータを確実なものとします。 <br>
536                     <br>
537                     withWriteBoxInfo を false にすると、内部のMessageリストの更新をスキップします。連続で複数のMessageを書き込むときの処理時間を短くすることができます。リストが更新されていない状態では、GetMessageBoxXXX 関数で正しい情報を取得できなくなるので注意してください。
538                    <br>
539                    Messageを書き込むとき、EULAの同意バージョンチェックが行われますので、ROMにアイコンファイル(ICNファイル)を設定していないと ResultNotAgreeEula が返ります。<br>
540                    チェックには fs の機能を使用しますので、事前にfsライブラリの初期化を行う必要があります。
541 
542       @param[in]    cecMessage      @ref Message クラスのオブジェクト
543       @param[in]    boxType         受信BOX/送信BOXの指定
544       @param[out]   messageIdOut    書き込むときに付与される MessageId が返ります。
545       @param[in]    withWriteBoxInfo         false を指定すると、内部のMessageリストの更新をスキップします。
546                                              リストは、CommitMessageBox または CloseMessageBox を呼んだときに更新されます。
547 
548       @return       nn::Result
549         @retval       ResultSuccess                 成功しました。
550         @retval       ResultNotAuthorized           ボックスがOpenされていません。
551         @retval       ResultNoData                  Message/Message本文が設定されていません。
552         @retval       ResultMessTooLarge            Messageが大きすぎます。
553         @retval       ResultBoxSizeFull             ボックスの容量をオーバーしています。
554         @retval       ResultBoxMessNumFull          ボックスの最大個数をオーバーしています。
555         @retval       ResultNoData                  Messageに本文/アイコンが設定されていません。
556         @retval       ResultInvalidCombination      送信回数と伝播回数の値が共に2以上に設定されています。
557         @retval       ResultNotAgreeEula            EULAに同意されていない、もしくはROMにアイコンファイル(ICNファイル)が設定されていません。
558         @retval       ResultParentalControlCec      ParentalControlで許可されていません。
559         @retval       ResultStateBusy               デーモンがBUSY状態の為、アクセスできません。時間を空けて再アクセスすることで成功する可能性があります。
560         @retval       上記以外                      失敗しました。
561     */
562     nn::Result  WriteMessage(
563         const Message& cecMessage,const CecBoxType boxType, MessageId& messageIdOut, bool withWriteBoxInfo);
564 
WriteMessage(const Message & cecMessage,const CecBoxType boxType)565     nn::Result  WriteMessage(
566         const Message& cecMessage,const CecBoxType boxType)
567     {
568         MessageId messageIdOut;
569         return WriteMessage(cecMessage, boxType, messageIdOut);
570     }
571 
572 
573     /*!
574     :private
575       @brief        Message を本体保存領域に書きこみます。
576 
577                     Messageのサイズが 100KB を超える場合、またはBOXの最大保存容量/個数 をオーバーする場合は書き込むことができません。<br>
578 
579       @param[in]   message      Message のバイナリ列を格納するバッファ
580       @param[in]    messageLen      バッファのサイズ
581       @param[in]    boxType     受信BOX/送信BOXの指定
582       @param[out]   messageIdOut    書き込むときに付与される MessageId が返ります。
583       @return       nn::Result
584     */
585     nn::Result  WriteMessage(
586         const void* message, const size_t messageLen ,const CecBoxType boxType, MessageId& messageIdOut);
587 
588     /*!
589       @brief        Message を削除します。
590 
591                     変更の後、CloseMessageBox または CommitMessageBox を呼んだときに、書き込んだデータを確実なものとします。 <br>
592 
593       @param[in]    boxType         受信BOX/送信BOXの指定
594       @param[in]    messageId       MessageId の指定
595       @return       nn::Result
596         @retval       ResultSuccess                 成功しました。
597         @retval       ResultNotAuthorized           ボックスがOpenされていません。
598         @retval       上記以外                      失敗しました。
599     */
600     nn::Result  DeleteMessage( const CecBoxType boxType, const MessageId& messageId);
601 
602     /*!
603       @brief        Message を削除します。
604 
605                     変更の後、CloseMessageBox または CommitMessageBox を呼んだときに、書き込んだデータを確実なものとします。 <br>
606                     <br>
607                     withWriteBoxInfo を false にすると、内部のMessageリストの更新をスキップします。連続で複数のMessageを削除するときの処理時間を短くすることができます。リストが更新されていない状態では、GetMessageBoxXXX 関数で正しい情報を取得できなくなるので注意してください。
608 
609       @param[in]    boxType         受信BOX/送信BOXの指定
610       @param[in]    messageId       MessageId の指定
611       @param[in]    withWriteBoxInfo         false を指定すると、内部のMessageリストの更新をスキップします。
612                                              リストは、CommitMessageBox または CloseMessageBox を呼んだときに更新されます。
613       @return       nn::Result
614         @retval       ResultSuccess                 成功しました。
615         @retval       ResultNotAuthorized           ボックスがOpenされていません。
616         @retval       上記以外                      失敗しました。
617     */
618     nn::Result  DeleteMessage( const CecBoxType boxType, const MessageId& messageId, bool withWriteBoxInfo);
619 
620     /*!
621       @brief        Box内の全Message を削除します。
622 
623       @param[in]    boxType         受信BOX/送信BOXの指定
624       @return       nn::Result
625         @retval       ResultSuccess                 成功しました。
626         @retval       ResultNotAuthorized           ボックスがOpenされていません。
627         @retval       上記以外                      失敗しました。
628     */
629     nn::Result  DeleteAllMessages(const CecBoxType boxType);
630 
631     u32  DeleteSentMessages();
632 
633     /*!
634       @brief        本体保存領域に書き込んだデータを確実なものとします。
635 
636                     この関数を呼ばずにプログラムが停止した場合、 前回のコミットからこれまでの変更(ボックスの作成、メッセージの書き込み・削除など)は全て巻き戻される可能性があります。<br>
637                     (システムが通信で受信したデータを保存したときにもコミットは行われるので、
638                     この関数でコミットを行わないと必ず前の状態に戻ってしまうというわけではありません。)<br>
639                     スリープ・HOMEメニューへの移行など、通信の制御がシステムに戻った後で、
640                     変更が巻き戻される可能性があるため、注意してください。<br>
641                     @ref CloseMessageBox の呼んだときにもコミットは行われます。
642 
643       @return       nn::Result
644         @retval       ResultSuccess                 成功しました。
645         @retval       上記以外                      失敗しました。
646     */
647     nn::Result  CommitMessageBox();
648 
649     //@}
650 
651  protected:
652     u8      ReadInBoxMessage(void* bufOut, const size_t messageLen, const MessageId& messageId);
653     u8     WriteInBoxMessage(const void* message, const size_t messageLen, MessageId* pMessageIdOut);
654     u8     WriteInBoxMessage(Message& cecMessage, MessageId* pMessageId);
655     u8      DeleteInBoxMessage(const CECMessageId messageId);
656     u8      ReadOutBoxMessage(void* bufOut, const size_t messageLen, const MessageId& messageId);
657     u8     WriteOutBoxMessage(const void* message, const size_t messageLen, MessageId* pMessageIdOut);
658     u8     WriteOutBoxMessage(Message& cecMessage, MessageId* pMessageIdOut);
659     u8      DeleteOutBoxMessage(const MessageId& messageId);
660 
661     nn::Result      CheckEulaParentalControl();
662 
663 
664  public:
665     // Box List
666 
667     //! @name BOX制御・情報取得
668     //@{
669 
670     /*!
671       @brief       MessageBox に付随するデータを取得します。
672       @param[in]   datatype     データ種別を指定します。 @ref CecBoxDataType で指定します。
673       @param[out]   dataBuf     バッファを指定します。
674       @param[in]   dataBufSize      バッファサイズを指定します。
675       @return      nn::Result
676         @retval       ResultSuccess                 成功しました。
677         @retval       上記以外                      失敗しました。
678     */
679     nn::Result  GetMessageBoxData(u32 datatype, void* dataBuf, size_t dataBufSize);
680 
681     /*!
682       @brief       MessageBox に付随するデータサイズを取得します。
683       @param[in]   datatype     データ種別を指定します。 @ref CecBoxDataType で指定します。
684       @return      データサイズ
685     */
686     size_t      GetMessageBoxDataSize(const u32 datatype);
687 
688     /*!
689       @brief       MessageBox に付随するデータをセットします。
690       @param[in]   datatype     データ種別を指定します。 @ref CecBoxDataType で指定します。
691       @param[in]   data         データを指定します。
692       @param[in]   dataSize     データサイズを指定します。最大長は 10KB です。
693       @return      nn::Result
694         @retval       ResultSuccess                 成功しました。
695         @retval       ResultNotAuthorized           ボックスがOpenされていません。
696         @retval       ResultTooLarge                データサイズが大きすぎます。
697         @retval       上記以外                      失敗しました。
698     */
699     nn::Result  SetMessageBoxData(u32 datatype, const void* data, size_t dataSize);
700 
701     /*!
702       @brief       MessageBox の名称をセットします。
703       @param[in]   data         本体管理画面等で表示される名称を指定します。<br>
704                                 文字コード:   UTF16-LE<br>
705                                 表示サイズ:   全角17文字で表示できる文字数<br>
706                                 バッファ最大: 64×2Bytes (NULL終端込み)<br>
707       @param[in]   dataSize     データサイズを指定します。
708       @return      nn::Result
709         @retval       ResultSuccess                 成功しました。
710         @retval       ResultNotAuthorized           ボックスがOpenされていません。
711         @retval       ResultInvalidData              データサイズが大きすぎます。
712         @retval       上記以外                      失敗しました。
713     */
714     nn::Result  SetMessageBoxName(const wchar_t* data, size_t dataSize);
715 
716     /*!
717       @brief       MessageBox のアイコンをセットします。
718 
719                    すれちがい通信関連で、本体管理画面等で扱われるアイコンには2種類あります。<br>
720                    Boxに付随するアイコン・個々のMessageに付随するアイコンがあり、これらを設定しておく必要があります。<br>
721                    この関数では、Boxのアイコンをセットします。
722 
723       @param[in]   data         本体管理画面等で表示されるアイコンデータを指定します。<br>
724                                 フォーマット: RGB565 (リトルエンディアン)<br>
725                                 サイズ:       48×48 (4.5KBytes) <br>
726       @param[in]   dataSize     データサイズを指定します。
727       @return      nn::Result
728         @retval       ResultSuccess                 成功しました。
729         @retval       ResultNotAuthorized           ボックスがOpenされていません。
730         @retval       上記以外                      失敗しました。
731     */
732     nn::Result  SetMessageBoxIcon(const void* data, size_t dataSize);
733 
734     /*!
735       @brief       MessageBox の名称を取得します。
736       @param[out]   dataBuf         バッファを指定します。<br>
737                                 文字コード:   UTF16-LE<br>
738                                 表示サイズ:   全角17文字で表示できる文字数<br>
739                                 バッファ最大: 64×2Bytes (NULL終端込み)<br>
740       @param[in]   dataBufSize     バッファサイズを指定します。
741       @return      nn::Result
742         @retval       ResultSuccess                 成功しました。
743         @retval       上記以外                      失敗しました。
744     */
745     nn::Result  GetMessageBoxName(wchar_t* dataBuf, size_t dataBufSize);
746 
747     /*!
748       @brief       MessageBox のアイコンを取得します。
749       @param[out]   dataBuf         バッファを指定します。<br>
750                                 フォーマット: RGB565 (リトルエンディアン)<br>
751                                 サイズ:       48×48 (4.5KBytes) <br>
752       @param[in]   dataBufSize     バッファサイズを指定します。
753       @return      nn::Result
754         @retval       ResultSuccess                 成功しました。
755         @retval       上記以外                      失敗しました。
756     */
757     nn::Result  GetMessageBoxIcon(void* dataBuf, size_t dataBufSize);
758 
759 
760     /*-----------------------------------------------*/
761 
762     //! @name BOX情報取得
763     //@{
764 
765     /*!
766       @brief       MessageBox の属性 を取得します。
767       @return      @ref MessageBoxFlag
768     */
769     MessageBoxFlag     GetBoxFlag();
770 
771     u32     GetInBoxSizeMax();
772     u32     GetInBoxSize();
773 
774     u32     GetOutBoxSizeMax();
775     u32     GetOutBoxSize();
776 
777     /*!
778       @brief       送信 BOX / 受信BOX の容量を取得します。
779       @param[in]   boxType        送信 BOX / 受信BOXの指定
780       @return      容量の値が返ります。(BOX作成時に指定したものと同じです。)
781     */
782     u32     GetBoxSizeMax(CecBoxType boxType);
783     /*!
784       @brief       送信 BOX / 受信BOX の使用量を取得します。
785       @param[in]   boxType        送信 BOX / 受信BOXの指定
786       @return      使用量の値が返ります。
787     */
788     u32     GetBoxSize(CecBoxType boxType);
789 
790 
791     /*-----------------------------------------------*/
792     u32     GetInBoxMessNumMax();
793     u32     GetInBoxMessNum();
794 
795     u32     GetOutBoxMessNumMax();
796     u32     GetOutBoxMessNum();
797 
798     /*!
799       @brief       送信 BOX / 受信BOX の最大 Message 数を取得します。
800       @param[in]   boxType        送信 BOX / 受信BOXの指定
801       @return      個数の値が返ります。(BOX作成時に指定したものと同じです。)
802     */
803     u32     GetBoxMessNumMax(CecBoxType boxType);
804     /*!
805       @brief       送信 BOX / 受信BOX の Message 数を取得します。
806       @param[in]   boxType        送信 BOX / 受信BOXの指定
807       @return      個数の値が返ります。
808     */
809     u32     GetBoxMessNum(CecBoxType boxType);
810 
811 
812     /*-----------------------------------------------*/
813     u32     GetInBoxGroupNumMax();
814     u32     GetInBoxGroupNum();
815 
816     u32     GetOutBoxGroupNumMax();
817     u32     GetOutBoxGroupNum();
818 
819     /*!
820       @brief       送信 BOX / 受信BOX の最大 Message Group 数を取得します。
821       @param[in]   boxType        送信 BOX / 受信BOXの指定
822       @return      Message Group 数の値が返ります。(SetBoxGroupNumMax で指定した値です。)
823     */
824     u32     GetBoxGroupNumMax(CecBoxType boxType);
825     /*!
826       @brief       送信 BOX / 受信BOX の Message Group 数を取得します。
827       @param[in]   boxType        送信 BOX / 受信BOXの指定
828       @return      Message Group 数の値が返ります。
829     */
830     u32     GetBoxGroupNum(CecBoxType boxType);
831 
832     /*!
833       @brief       送信 BOX / 受信BOX の 最大 Message Group 数を指定します。
834 
835                     <br>
836                    実際にこの値でGroup数が制限されることはありません。<br>
837                    保存可能数としての目安の値です。<br>
838                    受信BOXのサイズ(GetBoxSizeMax(CEC_BOXTYPE_INBOX)) ÷ 1Group のサイズ、<br>
839                    または、 受信BOX の最大 Message 数(GetBoxMessNumMax(CEC_BOXTYPE_INBOX)) ÷ 1GroupのMessage数 の値を指定するのが目安となります。
840 
841       @param[in]   num            最大 Group 数
842       @param[in]   boxType        送信 BOX / 受信BOXの指定
843       @return      nn::Result
844         @retval       ResultSuccess                 成功しました。
845         @retval       ResultNotAuthorized           ボックスがOpenされていません。
846         @retval       ResultInvalidArgument         Group数の値が無効です。
847         @retval       上記以外                      失敗しました。
848     */
849     nn::Result     SetBoxGroupNumMax(u32 num, CecBoxType boxType);
850     nn::Result     SetInBoxGroupNumMax(u32 num);
851     nn::Result     SetOutBoxGroupNumMax(u32 num);
852 
853     /*-----------------------------------------------*/
854 
855     //u32     GetInBoxSessionNumMax();
856     u32     GetInBoxSessionNum();
857 
858     //u32     GetOutBoxSessionNumMax();
859     //u32     GetOutBoxSessionNum();
860 
861     /*!
862       @brief       受信BOX の Session ID 数(=受信した回数)を取得します。
863 
864                   Session ID は、通信相手の検索に入る前に乱数で生成されます。<br>
865                   相手を発見して通信するときに、相手にその ID を渡します。<br>
866                   データ受信側は、相手の Session ID を 受信Message に書き込みます。<br>
867                   1回のすれちがい通信で受信したデータ全てに、同じSession ID が書き込まれます。<br>
868                   GroupIDが同じでも、Session ID が異なる場合は、別の通信で受信したデータであることがわかります。BOX内のMessageの Session 数をカウントすることで、受信した回数を知ることができます。<br>
869 
870 
871       @param[in]   boxType        CecBoxType で指定します。CEC_BOXTYPE_INBOX を指定します。
872       @return      Session ID 数の値が返ります。
873     */
874     u32     GetBoxSessionNum(CecBoxType boxType);
875     /*-----------------------------------------------*/
876     //@}
877 
878 #if 1 // BoxInfoReader の Message情報取得部を使用する。重複するため、元々Boxクラスにあった部分を将来的に削除。
879     //! @name Message情報取得(旧API)
880     //@{
881 
882     u32     GetInBoxMessHeader(CecMessageHeader& messHeader, const MessageId& messageId);
883     u32     GetInBoxMessHeaderByIndex(CecMessageHeader& messHeader, u32 messIndex);
884 
885     /*!
886       @brief       受信BOXの n 番目 の Message の MessageID を取得します。
887 
888                    GetMessageMessId で取得できる値と同じです。
889 
890       @param[in]   messIndex                n 番目
891       @return      @ref CECMessageId が返ります。
892     */
893     u8*     GetInBoxMessIdByIndex(u32 messIndex);
894 
895     u32     GetOutBoxMessHeader(CecMessageHeader& messHeader, const MessageId& messageId);
896     u32     GetOutBoxMessHeaderByIndex(CecMessageHeader& messHeader, u32 messIndex);
897 
898     /*!
899       @brief       送信BOXの n 番目 の Message の MessageID を取得します。
900 
901                    GetMessageMessId で取得できる値と同じです。
902 
903       @param[in]   messIndex                n 番目(n=0が先頭を示します。)
904       @return      @ref CECMessageId が返ります。
905     */
906     u8*     GetOutBoxMessIdByIndex(u32 messIndex);
907 
908     /*!
909       @brief       MessageID を指定して Message のサイズを取得します。
910 
911                    GetMessageMessSize で取得できる値と同じです。
912 
913       @param[in]   boxType        送信 BOX / 受信BOXの指定
914       @param[in]   messId               MessageId
915       @return      サイズの値が返ります。
916     */
917     size_t      GetMessSizeByMessId(CecBoxType boxType, const MessageId& messageId);
918     size_t      GetBodySizeByMessId(CecBoxType boxType, const MessageId& messageId);
919     //@}
920 #endif
921 
922     CecMessageHeader*     GetMessHeaderByMessId(const CecBoxType boxType, const MessageId& messId);
923     CecMessageHeader*     GetMessHeader(const CecBoxType boxType, const u32 messIndex);
924 
925     bool        MessageExists(CecBoxType boxType, const MessageId& messageId);
926     //! @name Message の情報取得
927     //@{
928 
929     /*!
930      * @brief       BoxのMessageのサイズを取得します。
931      * @param[in]   boxType          @ref CecBoxType
932      * @param[in]   messIndex        n番目のMessage
933      * @return      Messageのサイズ
934      */
935     u32     GetMessageMessSize(const CecBoxType boxType, const u32 messIndex);
936 
937     /*!
938      * @brief       BoxのMessageの本文サイズを取得します。
939      * @param[in]   boxType          @ref CecBoxType
940      * @param[in]   messIndex        n番目のMessage
941      * @return      Messageの本文サイズ
942      */
943     u32     GetMessageBodySize(const CecBoxType boxType, const u32 messIndex);
944 
945     /*!
946      * @brief       BoxのMessageの Group ID を取得します。
947      * @param[in]   boxType          @ref CecBoxType
948      * @param[in]   messIndex        n番目のMessage
949      * @return      Messageの Group ID
950      */
951     u32     GetMessageGroupId(const CecBoxType boxType, const u32 messIndex);
952 
953     /*!
954      * @brief       受信BoxのMessageの Session ID を取得します。(受信時に付与されるIDです)
955      * @param[in]   boxType          @ref CecBoxType
956      * @param[in]   messIndex        n番目のMessage
957      * @return      Messageの Session ID
958      */
959     u32     GetMessageSessionId(const CecBoxType boxType, const u32 messIndex);
960 
961     /*!
962      * @brief       BoxのMessageの @ref CecMessageTypeFlag を取得します。
963      * @param[in]   boxType          @ref CecBoxType
964      * @param[in]   messIndex        n番目のMessage
965      * @return      @ref CecMessageTypeFlag
966      */
967     MessageTypeFlag      GetMessageMessTypeFlag(const CecBoxType boxType, const u32 messIndex);
968 
969     /*!
970      * @brief       BoxのMessageの @ref SendMode を取得します。
971      * @param[in]   boxType          @ref CecBoxType
972      * @param[in]   messIndex        n番目のMessage
973      * @return      @ref SendMode
974      */
975     SendMode      GetMessageSendMode(const CecBoxType boxType, const u32 messIndex);
976 
977     /*!
978      * @brief       BoxのMessageの 送信回数 を取得します。
979      * @param[in]   boxType          @ref CecBoxType
980      * @param[in]   messIndex        n番目のMessage
981      * @return      送信回数
982      */
983     u8      GetMessageSendCount(const CecBoxType boxType, const u32 messIndex);
984 
985     /*!
986      * @brief       BoxのMessageの 伝播回数 を取得します。
987      * @param[in]   boxType          @ref CecBoxType
988      * @param[in]   messIndex        n番目のMessage
989      * @return      伝播回数
990      */
991     u8      GetMessagePropagationCount(const CecBoxType boxType, const u32 messIndex);
992 
993     /*!
994     :private
995      * @brief       BoxのMessageの 未読フラグ を取得します。
996      * @param[in]   boxType          @ref CecBoxType
997      * @param[in]   messIndex        n番目のMessage
998      * @return      未読フラグ
999      */
1000     bit8      GetMessageFlag_Unread(const CecBoxType boxType, const u32 messIndex);
1001 
1002     /*!
1003     :private
1004      * @brief       BoxのMessageの 新着フラグ を取得します。
1005      * @param[in]   boxType          @ref CecBoxType
1006      * @param[in]   messIndex        n番目のMessage
1007      * @return      新着フラグ
1008      */
1009     bit8      GetMessageFlag_New(const CecBoxType boxType, const u32 messIndex);
1010 
1011     /*!
1012      * @brief       BoxのMessageの Tag を取得します。
1013      * @param[in]   boxType          @ref CecBoxType
1014      * @param[in]   messIndex        n番目のMessage
1015      * @return      Tag
1016      */
1017     bit16      GetMessageTag(const CecBoxType boxType, const u32 messIndex);
1018 
1019     /*!
1020      * @brief       Boxの受信Messageの 送信日時 を取得します。
1021      * @param[in]   boxType          @ref CecBoxType
1022      * @param[in]   messIndex        n番目のMessage
1023      * @return      @ref nn::fnd::DateTimeParameters
1024      */
1025     nn::fnd::DateTimeParameters     GetMessageSendDate(const CecBoxType boxType, const u32 messIndex);
1026 
1027     /*!
1028      * @brief       Boxの受信Messageの 受信日時 を取得します。
1029      * @param[in]   boxType          @ref CecBoxType
1030      * @param[in]   messIndex        n番目のMessage
1031      * @return      @ref nn::fnd::DateTimeParameters
1032      */
1033     nn::fnd::DateTimeParameters     GetMessageRecvDate(const CecBoxType boxType, const u32 messIndex);
1034 
1035     /*!
1036      * @brief       BoxのMessageの 作成日時 を取得します。
1037      * @param[in]   boxType          @ref CecBoxType
1038      * @param[in]   messIndex        n番目のMessage
1039      * @return      @ref nn::fnd::DateTimeParameters
1040      */
1041     nn::fnd::DateTimeParameters     GetMessageCreateDate(const CecBoxType boxType, const u32 messIndex);
1042 
1043     /*!
1044      * @brief       交換された Message の 対になる MessageID を取得します。
1045 
1046                     通信の方式に「交換」を 指定して通信したとき、対になる 送信 Message の MessageID が、受信 Message に記録されます。
1047 
1048      * @param[out]   messId          @ref MessageId
1049      * @param[in]   boxType          @ref CecBoxType
1050      * @param[in]   messIndex        n番目のMessage
1051      * @return      nn::Result
1052         @retval       ResultSuccess                 成功しました。
1053         @retval       ResultNoData                  MessageIdの値がありません。
1054         @retval       上記以外                      失敗しました。
1055      */
1056     nn::Result  GetMessageMessIdPair(MessageId* messId, const CecBoxType boxType, const u32 messIndex);
1057     MessageId       GetMessageMessIdPair(const CecBoxType boxType, const u32 messIndex);
1058 
1059 
1060     /*!
1061      * @brief       BoxのMessageの MessageID を取得します。
1062      * @param[out]   messId          @ref MessageId
1063      * @param[in]   boxType          @ref CecBoxType
1064      * @param[in]   messIndex        n番目のMessage
1065      * @return      nn::Result
1066         @retval       ResultSuccess                 成功しました。
1067         @retval       ResultNoData                  MessageIdの値がありません。
1068         @retval       上記以外                      失敗しました。
1069      */
1070     nn::Result  GetMessageMessId(MessageId* messId, const CecBoxType boxType, const u32 messIndex);
1071     MessageId       GetMessageMessId(const CecBoxType boxType, const u32 messIndex);
1072 
1073 
1074     /*!
1075      * @brief       MessageID から、何番目のMessageであるか(messIndex)を取得します。
1076      * @param[in]   boxType          @ref CecBoxType
1077      * @param[in]   messId        MessageId
1078      * @return      messIndex
1079      */
1080     u32     GetMessIndex(CecBoxType boxType, MessageId& messId);
1081     u32     GetMessIndex(CecBoxType boxType, u8* messId);
1082     //@}
1083 
1084     /*!
1085       :private
1086       @brief       送信BOX の Message 送信順リストの末尾に MessageID を追加します。
1087                    ( @ref WriteMessage で Message をセットした時点で自動的に追加されるので、
1088                     通常はこのAPIを使う必要はありません。)
1089       @param[in]   messageId        MessageID を指定します。
1090       @return      リストの MessageID 数 が返ります。
1091     */
1092     u32             AppendOutBoxIndex(const MessageId& messageId);
1093 
1094     /*!
1095       :private
1096       @brief       送信BOX の Message 送信順リストから MessageID を削除します。
1097                    ( Message を削除した時点で自動的にリストから削除されるので、
1098                     通常はこのAPIを使う必要はありません。)
1099       @param[in]   messageId        MessageID を指定します。
1100       @return      リストの MessageID 数 が返ります。
1101     */
1102     u32             RemoveOutBoxIndex(const MessageId& messageId);
1103 
1104     /*!
1105       @brief       送信BOX の Message 送信順リスト内で、指定した MessageID の Message を末尾に回します。
1106                    ( Message を送信した時点で自動的に順番を変更されるので、
1107                     通常はこのAPIを使う必要はありません。)
1108 
1109       @param[in]   messageId        MessageID を指定します。
1110       @return      リストの MessageID 数 が返ります。
1111     */
1112     u32             RoundOutBoxIndex(const MessageId& messageId);
1113 
1114     u32             ResetOutBoxIndex();
1115     u32             ReadOutBoxIndex();
1116     nn::Result      WriteOutBoxIndex();
1117 
1118     bool            IsAgreeEulaAppRequired();
1119 
1120  protected:
1121     //IPC
1122     virtual nn::Result OpenFile(const u32 cecTitleId, const u32 dataType, const u32 option, size_t* filesize ) const ;
1123     virtual nn::Result ReadFile(void* readBuf, size_t readBufLen, size_t* readLen) const;
1124     virtual nn::Result WriteFile(const void* writeBuf, const size_t writeBufLen) const;
1125     virtual nn::Result ReadMessageFile(
1126         u32 cecTitleId,
1127         u8 boxType,
1128         const u8* pMessId,
1129         size_t messIdLen,
1130         size_t* pReadLen,
1131         u8* pReadBuf,
1132         size_t len);
1133 
1134     virtual nn::Result ReadMessageFileWithHmac(
1135         u32 cecTitleId,
1136         u8 boxType,
1137         const u8* pMessId,
1138         size_t messIdLen,
1139         size_t* pReadLen,
1140         u8* pReadBuf,
1141         size_t len, u8* pHmac);
1142 
1143     virtual nn::Result WriteMessageFile(
1144         u32 cecTitleId,
1145         u8 boxType,
1146         u8* pMessId,
1147         size_t messIdLen,
1148         const u8* pWriteBuf,
1149         size_t len);
1150 
1151     virtual nn::Result WriteMessageFileWithHmac(
1152         u32 cecTitleId,
1153         u8 boxType,
1154         u8* pMessId,
1155         size_t messIdLen,
1156         const u8* pWriteBuf,
1157         size_t len, u8* pHmac);
1158 
1159     virtual nn::Result Delete( u32 cecTitleId, u32 dataType, u8 boxType, const u8 pMessId[], size_t messIdLen );
1160     virtual nn::Result SetData(u32 cecTitleId, const u8* pSetBuf, size_t len, u32 option);
1161     virtual nn::Result ReadData(u8 *pReadBuf, size_t len, u32 option, const u8 optionData[], size_t optionDataLen);
1162 
1163 };
1164 
1165 } // namespace CTR
1166 } // namespace cec
1167 } // namespace nn
1168 
1169 
1170 #endif  //__MESSAGE_BOX_H__
1171 
1172