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