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