1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: cec_Message.h 4 5 Copyright (C)2009 Nintendo Co., Ltd. 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 $Rev: 38772 $ 14 *---------------------------------------------------------------------------*/ 15 #ifndef NN_CEC_CTR_CEC_MESSAGE_H_ 16 #define NN_CEC_CTR_CEC_MESSAGE_H_ 17 18 #include <nn/fnd.h> 19 #include <nn/cec/CTR/cec_Const.h> 20 #include <nn/cec/CTR/cec_Types.h> 21 22 namespace nn { 23 namespace cec { 24 namespace CTR { 25 26 27 // Message data structure 28 struct CecMessageHeader; 29 30 #define CEC_EXHEADER_NUM_MAX (16) 31 #define CEC_EXHEADER_SIZE_MAX (8*1024) 32 33 /* Please see man pages for details 34 35 36 37 */ 38 struct CecMessageExHeader 39 { 40 u32 exHeaderType; // 41 u32 exHeaderLen; // 42 u8* exHeaderData; // 43 }; 44 45 #define LOAD_FLAG_POINTER 1 46 #define LOAD_FLAG_MALLOC 0 47 48 /* Please see man pages for details 49 50 51 */ 52 class Message 53 { 54 private: 55 struct CecMessageHeader m_cec_mh; 56 struct CecMessageExHeader m_cec_mhex[CEC_EXHEADER_NUM_MAX] NN_ATTRIBUTE_ALIGN(4); 57 s8 numOfExHeader; 58 u8 m_flag_pointer; 59 u8 m_flag_input; 60 NN_PADDING1; 61 u8* m_messBody; 62 u32 m_messBodyLen; 63 u8* m_pMessBody; 64 u8* m_pHash; 65 u32 m_hashSize; 66 u8 m_hmacKey[MESSAGE_HMAC_KEYLEN]; 67 68 u32 calcCecMessSize(); 69 nn::Result Init_Message(); 70 nn::Result SetExHeaderWithoutCalc(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); 71 nn::Result SetMessageBodyWithoutCalc(const void* dataBody, size_t size); 72 nn::Result SetHmacSha256(void* input); 73 nn::Result GetHmacSha256(void* outBuf, u32 size = CEC_SIZEOF_HASH) const; 74 public: 75 76 /* Please see man pages for details 77 78 79 */ 80 Message(); 81 82 /* Please see man pages for details 83 84 85 86 87 88 */ 89 Message(const void* messData, size_t messSize); 90 91 /* Please see man pages for details 92 93 94 */ 95 ~Message(); 96 97 98 99 // 100 // 101 /* Please see man pages for details 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 */ 138 nn::Result NewMessage( 139 TitleId cecTitleId, u32 groupId, 140 MessageTypeFlag messageTypeFlag, SendMode sendMode, 141 u8 sendCount, u8 propagationCount, 142 const void* icon, size_t iconSize, 143 const wchar_t* infoTextData, size_t infoTextSize); 144 /* Please see man pages for details 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 */ 176 nn::Result NewMessage( 177 TitleId cecTitleId, u32 groupId, 178 MessageTypeFlag messageTypeFlag, SendMode sendMode, 179 u8 sendCount, u8 propagationCount); 180 // 181 182 183 // 184 // 185 /* Please see man pages for details 186 187 188 189 190 191 192 */ 193 nn::Result SetCecTitleId(TitleId cecTitleId); 194 195 /* Please see man pages for details 196 197 198 */ GetCecTitleId()199 inline TitleId GetCecTitleId() const 200 { 201 return m_cec_mh.cecTitleId; 202 } 203 204 /* Please see man pages for details 205 206 207 208 209 210 211 212 213 214 215 216 217 */ 218 nn::Result SetGroupID(u32 groupId); 219 220 /* Please see man pages for details 221 222 223 224 */ GetGroupID()225 inline u32 GetGroupID() const 226 { 227 return m_cec_mh.groupId; 228 } 229 230 /* Please see man pages for details 231 232 233 234 235 */ 236 nn::Result SetSessionID(u32 sessionId); 237 238 /* Please see man pages for details 239 240 241 242 243 244 245 */ GetSessionID()246 inline u32 GetSessionID() const 247 { 248 return m_cec_mh.sessionId; 249 } 250 251 /* Please see man pages for details 252 253 254 255 256 */ 257 nn::Result SetMessSize(const u32 messSize); 258 259 /* Please see man pages for details 260 261 262 263 264 265 266 */ GetMessSize()267 inline u32 GetMessSize() const 268 { 269 return m_cec_mh.messSize; 270 } 271 /* Please see man pages for details 272 273 274 */ GetMessageSize()275 inline u32 GetMessageSize() const 276 { 277 return GetMessSize(); 278 } 279 280 281 /* Please see man pages for details 282 283 284 285 286 */ 287 nn::Result SetHeaderSize(u32 headerSize); 288 289 /* Please see man pages for details 290 291 292 */ GetHeaderSize()293 inline u32 GetHeaderSize() const 294 { 295 return m_cec_mh.headerSize; 296 } 297 298 /* Please see man pages for details 299 300 301 302 303 */ 304 nn::Result SetBodySize(u32 bodySize); 305 306 /* Please see man pages for details 307 308 309 */ GetBodySize()310 inline u32 GetBodySize() const 311 { 312 return m_cec_mh.bodySize; 313 } 314 315 316 /* Please see man pages for details 317 318 319 320 321 */ 322 nn::Result SetMessageId(const MessageId& messageId); 323 324 /* Please see man pages for details 325 326 327 328 329 */ 330 MessageId GetMessageId(MessageId* messId) const; 331 332 nn::Result SetMessageVersion(const u32 messVersion); GetMessageVersion()333 inline u32 GetMessageVersion() const 334 { 335 return m_cec_mh.messVersion; 336 } 337 338 339 /* Please see man pages for details 340 341 342 343 344 */ 345 nn::Result SetMessageId_Pair(const MessageId& messIdPair); 346 347 /* Please see man pages for details 348 349 350 351 352 */ 353 MessageId GetMessageId_Pair(MessageId* messIdPair) const; 354 355 /* Please see man pages for details 356 357 358 359 360 */ 361 nn::Result SetMessageTypeFlag(MessageTypeFlag messTypeFlag); 362 363 /* Please see man pages for details 364 365 366 */ GetMessageTypeFlag()367 inline MessageTypeFlag GetMessageTypeFlag() const 368 { 369 return m_cec_mh.messageTypeFlag; 370 } 371 372 /* Please see man pages for details 373 374 375 376 377 378 379 */ 380 nn::Result SetSendMode(SendMode sendMode); 381 382 /* Please see man pages for details 383 384 385 */ GetSendMode()386 inline SendMode GetSendMode() const 387 { 388 return m_cec_mh.sendMode; 389 } 390 391 392 /* Please see man pages for details 393 394 395 */ 396 nn::Result SetSenderID(u64 senderId); 397 /* Please see man pages for details 398 399 400 */ GetSenderID()401 inline u64 GetSenderID() const 402 { 403 return m_cec_mh.senderId; 404 } 405 406 /* Please see man pages for details 407 408 409 410 */ 411 nn::Result SetSendDate(const nn::fnd::DateTimeParameters& date); 412 /* Please see man pages for details 413 414 415 */ GetSendDate()416 inline nn::fnd::DateTimeParameters GetSendDate() const 417 { 418 return m_cec_mh.sendDate; 419 } 420 421 /* Please see man pages for details 422 423 424 425 */ 426 nn::Result SetRecvDate(const nn::fnd::DateTimeParameters& date); 427 /* Please see man pages for details 428 429 430 */ GetRecvDate()431 inline nn::fnd::DateTimeParameters GetRecvDate() const 432 { 433 return m_cec_mh.recvDate; 434 } 435 436 /* Please see man pages for details 437 438 439 440 */ 441 nn::Result SetCreateDate(const nn::fnd::DateTimeParameters& date); 442 /* Please see man pages for details 443 444 445 */ GetCreateDate()446 inline nn::fnd::DateTimeParameters GetCreateDate() const 447 { 448 return m_cec_mh.createDate; 449 } 450 451 452 /* Please see man pages for details 453 454 455 456 457 458 459 460 */ 461 nn::Result SetSendCount(const u8 sendCount); 462 463 /* Please see man pages for details 464 465 466 467 468 469 */ GetSendCount()470 inline u8 GetSendCount() const 471 { 472 return m_cec_mh.sendCount; 473 } 474 475 /* Please see man pages for details 476 477 478 479 480 481 482 483 484 485 */ 486 nn::Result SetPropagationCount(u8 propagationCount); 487 488 /* Please see man pages for details 489 490 491 */ GetPropagationCount()492 inline u8 GetPropagationCount() const 493 { 494 return m_cec_mh.propagationCount; 495 } 496 497 498 /* Please see man pages for details 499 500 501 502 503 504 505 */ 506 nn::Result SetFlag_Unread(u8 flag); 507 508 /* Please see man pages for details 509 510 511 512 513 */ GetFlag_Unread()514 inline u8 GetFlag_Unread() const 515 { 516 return m_cec_mh.flagUnread; 517 } 518 519 520 /* Please see man pages for details 521 522 523 524 525 526 527 528 */ 529 nn::Result SetFlag_New(const u8 flag); 530 531 /* Please see man pages for details 532 533 534 535 536 */ GetFlag_New()537 inline u8 GetFlag_New() const 538 { 539 return m_cec_mh.flagNew; 540 } 541 542 543 /* Please see man pages for details 544 545 546 547 548 549 550 */ 551 void SetTag(u16 tag); 552 553 /* Please see man pages for details 554 555 556 */ GetTag()557 inline bit16 GetTag() const 558 { 559 return m_cec_mh.tag; 560 } 561 562 563 /* Please see man pages for details 564 565 566 567 568 569 570 571 572 573 574 575 576 */ 577 nn::Result SetExHeader(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); 578 579 /* Please see man pages for details 580 581 582 583 584 585 586 587 588 */ 589 nn::Result GetExHeader(MessageExHeaderType exhType, size_t* exhLen, void** exhBody) const; 590 591 592 /* Please see man pages for details 593 594 595 596 597 598 599 600 */ 601 nn::Result SetModuleFilter_MCR(const u8* filterM,const u8* filterC,const u8* filterR, u8 size); 602 nn::Result SetModuleFilter(const u8* filter, size_t size); 603 u32 GetModuleFilter(void** filter, size_t* size) const; 604 605 /* Please see man pages for details 606 607 608 609 610 611 612 613 614 615 616 617 */ SetIcon(void * iconData,size_t iconSize)618 inline nn::Result SetIcon(void* iconData, size_t iconSize) 619 { 620 return SetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); 621 } 622 623 /* Please see man pages for details 624 625 626 627 628 629 630 631 632 633 634 */ GetIcon(void ** iconData,size_t * iconSize)635 inline nn::Result GetIcon(void** iconData, size_t* iconSize) const 636 { 637 return GetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); 638 } 639 640 /* Please see man pages for details 641 642 643 644 645 646 647 648 649 650 651 652 */ SetInfoText(const wchar_t * infoTextData,size_t infoTextSize)653 inline nn::Result SetInfoText(const wchar_t* infoTextData, size_t infoTextSize) 654 { 655 return SetExHeader(MESSAGE_EXHEADER_TYPE_INFO , infoTextSize, infoTextData); 656 } 657 658 /* Please see man pages for details 659 660 661 662 663 664 665 666 667 668 669 */ 670 nn::Result GetInfoText(const wchar_t** infoTextData, size_t* infoTextSize) const; 671 672 /* Please see man pages for details 673 674 675 676 677 678 679 680 681 682 683 */ 684 nn::Result SetMessageBody(const void* dataBody, size_t size); 685 686 /* Please see man pages for details 687 688 689 690 691 */ 692 u32 GetMessageBody(void* dataBody, size_t size) const; 693 694 /* Please see man pages for details 695 696 697 698 699 */ 700 void* GetMessageBodyPointer(void** pBody,size_t* size); 701 702 /* Please see man pages for details 703 704 705 706 707 708 */ 709 nn::Result SetMessageBodyPointer(void* p_dataBody, size_t size); 710 711 // 712 713 /* Please see man pages for details 714 715 716 717 718 719 720 721 722 */ 723 nn::Result InputMessage(const void* mess, size_t size); 724 725 nn::Result InputMessage(const void* mess); 726 727 nn::Result InputMessageHeaderWithEx(const void* mess, size_t size); 728 729 nn::Result InputMessageHeader(const void* mess, size_t size); 730 /* Please see man pages for details 731 732 733 734 735 736 737 738 739 */ 740 u32 OutputMessage(void* messData); 741 742 u32 MakeMessageBinary(void* messData) const; 743 void OutputMessageHeader(void* pHeaderBuf) const; 744 745 u32 CheckMessageSize(const void* mess); 746 747 void DumpMessage(); 748 }; 749 750 751 752 } // namespace CTR 753 } // namespace cec 754 } // namespace nn 755 756 757 758 759 760 761 #endif //NN_CEC_CTR_CEC_MESSAGE_H_ 762 763