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