/*---------------------------------------------------------------------------* Project: Horizon File: cec_Message.h Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Rev: 38772 $ *---------------------------------------------------------------------------*/ #ifndef NN_CEC_CTR_CEC_MESSAGE_H_ #define NN_CEC_CTR_CEC_MESSAGE_H_ #include #include #include namespace nn { namespace cec { namespace CTR { // Message data structure struct CecMessageHeader; #define CEC_EXHEADER_NUM_MAX (16) #define CEC_EXHEADER_SIZE_MAX (8*1024) /* Please see man pages for details */ struct CecMessageExHeader { u32 exHeaderType; // u32 exHeaderLen; // u8* exHeaderData; // }; #define LOAD_FLAG_POINTER 1 #define LOAD_FLAG_MALLOC 0 /* Please see man pages for details */ class Message { private: struct CecMessageHeader m_cec_mh; struct CecMessageExHeader m_cec_mhex[CEC_EXHEADER_NUM_MAX] NN_ATTRIBUTE_ALIGN(4); s8 numOfExHeader; u8 m_flag_pointer; u8 m_flag_input; NN_PADDING1; u8* m_messBody; u32 m_messBodyLen; u8* m_pMessBody; u8* m_pHash; u32 m_hashSize; u8 m_hmacKey[MESSAGE_HMAC_KEYLEN]; u32 calcCecMessSize(); nn::Result Init_Message(); nn::Result SetExHeaderWithoutCalc(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); nn::Result SetMessageBodyWithoutCalc(const void* dataBody, size_t size); nn::Result SetHmacSha256(void* input); nn::Result GetHmacSha256(void* outBuf, u32 size = CEC_SIZEOF_HASH) const; public: /* Please see man pages for details */ Message(); /* Please see man pages for details */ Message(const void* messData, size_t messSize); /* Please see man pages for details */ ~Message(); // // /* Please see man pages for details */ nn::Result NewMessage( TitleId cecTitleId, u32 groupId, MessageTypeFlag messageTypeFlag, SendMode sendMode, u8 sendCount, u8 propagationCount, const void* icon, size_t iconSize, const wchar_t* infoTextData, size_t infoTextSize); /* Please see man pages for details */ nn::Result NewMessage( TitleId cecTitleId, u32 groupId, MessageTypeFlag messageTypeFlag, SendMode sendMode, u8 sendCount, u8 propagationCount); // // // /* Please see man pages for details */ nn::Result SetCecTitleId(TitleId cecTitleId); /* Please see man pages for details */ inline TitleId GetCecTitleId() const { return m_cec_mh.cecTitleId; } /* Please see man pages for details */ nn::Result SetGroupID(u32 groupId); /* Please see man pages for details */ inline u32 GetGroupID() const { return m_cec_mh.groupId; } /* Please see man pages for details */ nn::Result SetSessionID(u32 sessionId); /* Please see man pages for details */ inline u32 GetSessionID() const { return m_cec_mh.sessionId; } /* Please see man pages for details */ nn::Result SetMessSize(const u32 messSize); /* Please see man pages for details */ inline u32 GetMessSize() const { return m_cec_mh.messSize; } /* Please see man pages for details */ inline u32 GetMessageSize() const { return GetMessSize(); } /* Please see man pages for details */ nn::Result SetHeaderSize(u32 headerSize); /* Please see man pages for details */ inline u32 GetHeaderSize() const { return m_cec_mh.headerSize; } /* Please see man pages for details */ nn::Result SetBodySize(u32 bodySize); /* Please see man pages for details */ inline u32 GetBodySize() const { return m_cec_mh.bodySize; } /* Please see man pages for details */ nn::Result SetMessageId(const MessageId& messageId); /* Please see man pages for details */ MessageId GetMessageId(MessageId* messId) const; nn::Result SetMessageVersion(const u32 messVersion); inline u32 GetMessageVersion() const { return m_cec_mh.messVersion; } /* Please see man pages for details */ nn::Result SetMessageId_Pair(const MessageId& messIdPair); /* Please see man pages for details */ MessageId GetMessageId_Pair(MessageId* messIdPair) const; /* Please see man pages for details */ nn::Result SetMessageTypeFlag(MessageTypeFlag messTypeFlag); /* Please see man pages for details */ inline MessageTypeFlag GetMessageTypeFlag() const { return m_cec_mh.messageTypeFlag; } /* Please see man pages for details */ nn::Result SetSendMode(SendMode sendMode); /* Please see man pages for details */ inline SendMode GetSendMode() const { return m_cec_mh.sendMode; } /* Please see man pages for details */ nn::Result SetSenderID(u64 senderId); /* Please see man pages for details */ inline u64 GetSenderID() const { return m_cec_mh.senderId; } /* Please see man pages for details */ nn::Result SetSendDate(const nn::fnd::DateTimeParameters& date); /* Please see man pages for details */ inline nn::fnd::DateTimeParameters GetSendDate() const { return m_cec_mh.sendDate; } /* Please see man pages for details */ nn::Result SetRecvDate(const nn::fnd::DateTimeParameters& date); /* Please see man pages for details */ inline nn::fnd::DateTimeParameters GetRecvDate() const { return m_cec_mh.recvDate; } /* Please see man pages for details */ nn::Result SetCreateDate(const nn::fnd::DateTimeParameters& date); /* Please see man pages for details */ inline nn::fnd::DateTimeParameters GetCreateDate() const { return m_cec_mh.createDate; } /* Please see man pages for details */ nn::Result SetSendCount(const u8 sendCount); /* Please see man pages for details */ inline u8 GetSendCount() const { return m_cec_mh.sendCount; } /* Please see man pages for details */ nn::Result SetPropagationCount(u8 propagationCount); /* Please see man pages for details */ inline u8 GetPropagationCount() const { return m_cec_mh.propagationCount; } /* Please see man pages for details */ nn::Result SetFlag_Unread(u8 flag); /* Please see man pages for details */ inline u8 GetFlag_Unread() const { return m_cec_mh.flagUnread; } /* Please see man pages for details */ nn::Result SetFlag_New(const u8 flag); /* Please see man pages for details */ inline u8 GetFlag_New() const { return m_cec_mh.flagNew; } /* Please see man pages for details */ void SetTag(u16 tag); /* Please see man pages for details */ inline bit16 GetTag() const { return m_cec_mh.tag; } /* Please see man pages for details */ nn::Result SetExHeader(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); /* Please see man pages for details */ nn::Result GetExHeader(MessageExHeaderType exhType, size_t* exhLen, void** exhBody) const; /* Please see man pages for details */ nn::Result SetModuleFilter_MCR(const u8* filterM,const u8* filterC,const u8* filterR, u8 size); nn::Result SetModuleFilter(const u8* filter, size_t size); u32 GetModuleFilter(void** filter, size_t* size) const; /* Please see man pages for details */ inline nn::Result SetIcon(void* iconData, size_t iconSize) { return SetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); } /* Please see man pages for details */ inline nn::Result GetIcon(void** iconData, size_t* iconSize) const { return GetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); } /* Please see man pages for details */ inline nn::Result SetInfoText(const wchar_t* infoTextData, size_t infoTextSize) { return SetExHeader(MESSAGE_EXHEADER_TYPE_INFO , infoTextSize, infoTextData); } /* Please see man pages for details */ nn::Result GetInfoText(const wchar_t** infoTextData, size_t* infoTextSize) const; /* Please see man pages for details */ nn::Result SetMessageBody(const void* dataBody, size_t size); /* Please see man pages for details */ u32 GetMessageBody(void* dataBody, size_t size) const; /* Please see man pages for details */ void* GetMessageBodyPointer(void** pBody,size_t* size); /* Please see man pages for details */ nn::Result SetMessageBodyPointer(void* p_dataBody, size_t size); // /* Please see man pages for details */ nn::Result InputMessage(const void* mess, size_t size); nn::Result InputMessage(const void* mess); nn::Result InputMessageHeaderWithEx(const void* mess, size_t size); nn::Result InputMessageHeader(const void* mess, size_t size); /* Please see man pages for details */ u32 OutputMessage(void* messData); u32 MakeMessageBinary(void* messData) const; void OutputMessageHeader(void* pHeaderBuf) const; u32 CheckMessageSize(const void* mess); void DumpMessage(); }; } // namespace CTR } // namespace cec } // namespace nn #endif //NN_CEC_CTR_CEC_MESSAGE_H_