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