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