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