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