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