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