/*---------------------------------------------------------------------------* 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: 26599 $ *---------------------------------------------------------------------------*/ #ifndef NN_CEC_CTR_CEC_MESSAGE_H_ #define NN_CEC_CTR_CEC_MESSAGE_H_ #include #include #include namespace nn { namespace cec { namespace CTR { // メッセージデータ構造 struct CecMessageHeader; #define CEC_EXHEADER_NUM_MAX (16) #define CEC_EXHEADER_SIZE_MAX (8*1024) /*! :private @struct CecMessageExHeader @brief CEC の Message の拡張ヘッダ形式 */ struct CecMessageExHeader { u32 exHeaderType; //!< 拡張ヘッダタイプ @ref CecMessageExHeaderType で指定します。 u32 exHeaderLen; //!< 拡張ヘッダデータ長 u8* exHeaderData; //!< 拡張ヘッダデータ }; #define LOAD_FLAG_POINTER 1 #define LOAD_FLAG_MALLOC 0 /*! @class Message @brief CEC Message を扱うクラスです。 */ class Message { private: struct CecMessageExHeader m_cec_mhex[CEC_EXHEADER_NUM_MAX] NN_ATTRIBUTE_ALIGN(4); s8 numOfExHeader; NN_PADDING3; u8* m_messBody; u32 m_messBodyLen; u8* m_pMessBody; u8* m_pHash; u32 m_hashSize; u8 m_flag_pointer; u8 m_flag_input; u8 m_hmacKey[MESSAGE_HMAC_KEYLEN]; NN_PADDING2; 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: /*! * @brief コンストラクタ * @return */ Message(); Message(const void* messData, size_t messSize); ~Message(); //! @name 新規Message作成 //@{ /*! * @brief 新規 Message を作成します。 この関数で基本的なパラメータがセットされます。
@ref SetMessageBody で本文部のデータをセットし、 @ref MessageBox::WriteMessage で送信BOXに書き込むと、すれちがい通信時にMessageが送信されます。 * @param[in] cecTitleId Title固有ID * @param[in] groupId Message グルーピングID
@ref SetGroupID でセットされる値と同じです。 * @param[in] messageTypeFlag Friend/非Friend を @ref MessageTypeFlag で指定します。 * @param[in] sendMode 送信モード(受信のみ/送信のみ/送受信/交換)を @ref SendMode で指定します。
@ref SetSendMode でセットされる値と同じです。 * @param[in] sendCount 送信回数
送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 * @param[in] propagationCount 伝播回数
送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 * @param[in] icon アイコンを指定します。
フォーマット: RGB565 (リトルエンディアン)
サイズ: 40×40 (3200Bytes)
* @param[in] iconSize アイコンのデータサイズを指定します。 * @param[in] infoTextData Message の説明文をセットします。
文字コード: UTF16-LE
表示サイズ: 全角16文字×2行で表示できる文字数
バッファ最大: 128×2Bytes (改行やNULL終端込み)
* @param[in] infoTextSize Message の説明文のデータサイズを指定します。 * @return nn::Result */ nn::Result NewMessage( TitleId cecTitleId, u32 groupId, MessageTypeFlag messageTypeFlag, SendMode sendMode, u8 sendCount, u8 propagationCount, void* icon, size_t iconSize, wchar_t* infoTextData, size_t infoTextSize); /*! * @brief 新規 Message を作成します。 この関数で基本的なパラメータがセットされます。
@ref SetMessageBody で本文部のデータをセットし、 @ref MessageBox::WriteMessage で送信BOXに書き込むと、すれちがい通信時にMessageが送信されます。

アイコンとMessageの説明文のセットを別途行う必要があります。 * @param[in] cecTitleId Title固有ID * @param[in] groupId Message グルーピングID
@ref SetGroupID でセットされる値と同じです。 * @param[in] messageTypeFlag Friend/非Friend を @ref MessageTypeFlag で指定します。 * @param[in] sendMode 送信モード(受信のみ/送信のみ/送受信/交換)を @ref SendMode で指定します。
@ref SetSendMode でセットされる値と同じです。 * @param[in] sendCount 送信回数
送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 * @param[in] propagationCount 伝播回数
送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 * @return nn::Result */ nn::Result NewMessage( TitleId cecTitleId, u32 groupId, MessageTypeFlag messageTypeFlag, SendMode sendMode, u8 sendCount, u8 propagationCount); //@} //! @name パラメータ //@{ /*! :private * @brief Message に CecTitleId をセットします。 * @param[in] cecTitleId Title固有ID * @return nn::Result */ nn::Result SetCecTitleId(TitleId cecTitleId); /*! * @brief Message の CecTitleId を取得します。 * @return CecTitleId */ u32 GetCecTitleId() const; nn::Result SetCecTitleId_Str(const u8* cecTitleId_str); u8* GetCecTitleId_Str() const; /*! * @brief Message に Group ID をセットします。送信BOX内の同じGroupIDを持つ Message が グルーピングされ、一緒に送信されます。 ・1送信の最大サイズ以上はグルーピングされません。
・0 を指定した場合は、グルーピングされず、単独で送信されます。 * @param[in] groupId Group ID * @return nn::Result */ nn::Result SetGroupID(u32 groupId); /*! * @brief Message の Group ID を取得します。送信BOX内の同じGroupIDを持つ Message が グルーピングされ、一緒に送信されます。 * @return Group ID */ u32 GetGroupID() const; nn::Result SetSessionID(u32 sessionId); u32 GetSessionID() const; /*! :private * @brief Message のサイズを指定します。 * @param[in] messSize サイズ * @return nn::Result */ nn::Result SetMessSize(const u32 messSize); /*! * @brief Message の サイズを取得します。 * @return サイズの値 */ u32 GetMessSize() const; /*! :private * @brief Message Header のサイズを指定します。 * @param[in] headerSize サイズ * @return nn::Result */ nn::Result SetHeaderSize(u32 headerSize); /*! * @brief 拡張ヘッダを含む、Message Header の サイズを取得します。 * @return サイズの値 */ u32 GetHeaderSize() const; /*! :private * @brief Message 本文 のサイズを指定します。 * @param[in] bodySize サイズ * @return nn::Result */ nn::Result SetBodySize(u32 bodySize); /*! * @brief Message 本文 の サイズを取得します。 * @return サイズの値 */ u32 GetBodySize() const; /*! :private * @brief Message の MessageID を指定します。 * @param[in] messId MessageID * @return nn::Result */ nn::Result SetMessageId(const MessageId& messageId); /*! * @brief Message の MessageID を取得します。MessageID は、 Messageを作成して保存したときに付与されます。 * @param[out] messId MessageID * @return CECMessageId */ u8* GetMessageId(MessageId& messId) const; nn::Result SetMessageVersion(const u32 messVersion); u32 GetMessageVersion() const; /*! :private * @brief 交換された Message の MessageID を指定します。 * @param[in] messIdPair MessageId * @return nn::Result */ nn::Result SetMessageId_Pair(const MessageId& messIdPair); /*! * @brief 交換された Message の MessageID を取得します。通信の方式に「交換」を 指定して通信したとき、対になる 送信 Message の MessageID が、受信 Message に記録されます。 * @param[out] messIdPair MessageId * @return CECMessageId */ u8* GetMessageId_Pair(MessageId& messIdPair) const; /*! * @brief 送信対象を @ref MessageTypeFlag で指定します。 * @param[in] messTypeFlag @ref MessageTypeFlag * @return nn::Result */ nn::Result SetMessageTypeFlag(MessageTypeFlag messTypeFlag); /*! * @brief 送信対象の指定の値を取得します。 * @return @ref MessageTypeFlag */ MessageTypeFlag GetMessageTypeFlag() const; /*! * @brief 送信モード(受信のみ/送信のみ/送受信/交換)を @ref SendMode で指定します。 * @param[in] sendMode @ref SendMode * @return nn::Result */ nn::Result SetSendMode(SendMode sendMode); /*! * @brief 送信モード(受信のみ/送信のみ/送受信/交換)を取得します。 * @return @ref MessageTypeFlag */ SendMode GetSendMode() const; nn::Result SetSenderID(u64 senderId); u64 GetSenderID() const; nn::Result SetSendDate(const nn::fnd::DateTimeParameters& date); /*! * @brief 受信 Message の送信時の時刻を取得します。通信相手の時計の時刻が入ります。 * @return @ref nn::fnd::DateTimeParameters */ nn::fnd::DateTimeParameters GetSendDate() const; nn::Result SetRecvDate(const nn::fnd::DateTimeParameters& date); /*! * @brief 受信 Message の受信時の時刻を取得します。受信者の時計の時刻が入ります。 * @return @ref nn::fnd::DateTimeParameters */ nn::fnd::DateTimeParameters GetRecvDate() const; nn::Result SetCreateDate(const nn::fnd::DateTimeParameters& date); /*! * @brief Message の作成時の時刻を取得します。 * @return @ref nn::fnd::DateTimeParameters */ nn::fnd::DateTimeParameters GetCreateDate() const; /*! * @brief 送信回数を指定します。送信されると 1 減算され、0になると送信されなくなります。 送信が完了し、送信回数が 0 になった後も、Messageは送信BOXに残ります。 * @param[in] sendCount 送信回数 * @return nn::Result */ nn::Result SetSendCount(const u8 sendCount); /*! * @brief 送信回数を取得します。送信されると 1 減算され、0になると送信されなくなります。 送信が完了し、送信回数が 0 になった後も、Messageは送信BOXに残ります。 * @return 送信回数 */ u8 GetSendCount() const; /*! * @brief 伝播回数を指定します。受信時に 1 減算され、1以上の場合に送信BOXにコピーされます。 2 を指定した場合は、
[自分] ---(2)----> [Aさん] ---(1)----> [Bさん]
のように、2回の送信が行われます。 * @param[in] propagationCount 伝播回数 * @return nn::Result */ nn::Result SetPropagationCount(u8 propagationCount); /*! * @brief 伝播回数を取得します。受信時に 1 減算され、1以上の場合に送信BOXにコピーされます。 * @return 伝播回数 */ u8 GetPropagationCount() const; /*! :private * @brief 未読フラグの値を指定します。 * @param[in] flag 未読 = 1 / 既読 = 0
変更した値を保存するには、 @ref MessageBox::WriteMessage で 上書きする必要があります。 * @return nn::Result */ nn::Result SetFlag_Unread(u8 flag); /*! :private * @brief 未読フラグの値を取得します。 この値は、受信時に 1 に設定される以外は、自動的に変化しません。 * @return 未読 = 1 / 既読 = 0 */ u8 GetFlag_Unread() const; /*! :private * @brief 新着フラグの値を指定します。 * @param[in] flag 新着 = 1
変更した値を保存するには、 @ref MessageBox::WriteMessage で 上書きする必要があります。 * @return nn::Result */ nn::Result SetFlag_New(const u8 flag); /*! :private * @brief 新着フラグの値を取得します。 この値は、受信時に 1 に設定される以外は、自動的に変化しません。 * @return 新着 = 1 */ u8 GetFlag_New() const; /*! * @brief Message のヘッダに 16bit の値を入れておくことができます。 @ref MessageBox::GetMessageTag でも取得することができ、Messageの検索などに使うことができます。 * @param[in] tag 16 bit の値 * @return */ void SetTag(u16 tag); /*! * @brief Message のヘッダの Tag の値を取得します。 * @return Tag */ u16 GetTag() const; /*! * @brief Message の拡張ヘッダにデータをセットします。 * @param[in] exhType データ種別 @ref MessageExHeaderType で指定します。 * @param[in] exhLen データ長を指定します。最大長は 8KB です。 * @param[in] exhBody データ * @return nn::Result */ nn::Result SetExHeader(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); /*! * @brief Message の拡張ヘッダからデータを取得します。 * @param[in] exhType データ種別 @ref MessageExHeaderType で指定します。 * @param[out] exhLen データ長を取得します。 * @param[out] exhBody データを取得します。 * @return nn::Result */ nn::Result GetExHeader(MessageExHeaderType exhType, size_t* exhLen, void** exhBody) const; nn::Result SetModuleFilter(const u8* filter, size_t size); /*! :private * @brief Message に Module Filter をセットします。 * @param[in] filterM Mask の値 * @param[in] filterC Condition の値 * @param[in] filterR Request の値 * @param[in] size サイズ(=Mのサイズ=Cのサイズ=Rのサイズ) * @return nn::Result */ nn::Result SetModuleFilter_MCR(const u8* filterM,const u8* filterC,const u8* filterR, u8 size); u32 GetModuleFilter(void** filter, size_t* size) const; /*! * @brief Message に Icon をセットします。 SetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData) と同じです。 * @param[in] iconData データ * @param[in] iconSize データ長を指定します。最大長は 8KB です。 * @return nn::Result */ inline nn::Result SetIcon(void* iconData, size_t iconSize) { return SetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); } /*! * @brief Message の Icon を取得します。 GetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData) と同じです。 * @param[out] iconData データ * @param[out] iconSize データ長 * @return nn::Result */ inline nn::Result GetIcon(void** iconData, size_t* iconSize) const { return GetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); } /*! * @brief Message の説明文をセットします。 SetExHeader(MESSAGE_EXHEADER_TYPE_INFO, infoTextSize, infoTextData) と同じです。 * @param[in] infoTextData データ * @param[in] infoTextSize データ長を指定します。最大長は 8KB です。 * @return nn::Result */ inline nn::Result SetInfoText(wchar_t* infoTextData, size_t infoTextSize) { return SetExHeader(MESSAGE_EXHEADER_TYPE_INFO , infoTextSize, infoTextData); } /*! * @brief Message の説明文を取得します。 GetExHeader(MESSAGE_EXHEADER_TYPE_INFO, infoTextSize, infoTextData) と同じです。 * @param[out] infoTextData データ * @param[out] infoTextSize データ長 * @return nn::Result */ inline nn::Result GetInfoText(wchar_t** infoTextData, size_t* infoTextSize) const { return GetExHeader(MESSAGE_EXHEADER_TYPE_INFO , infoTextSize, reinterpret_cast(infoTextData)); } /*! * @brief Message に データ本文 をセットします。 * @param[in] dataBody データ * @param[in] size サイズを指定します。最大長はヘッダを含めて 100KB です。 * @return nn::Result */ nn::Result SetMessageBody(const void* dataBody, size_t size); /*! * @brief Message の データ本文を 取得します。 * @param[out] dataBody データを格納するバッファを指定 * @param[in] size バッファサイズを指定 * @return データ本文のサイズ */ u32 GetMessageBody(void* dataBody, size_t size) const; /*! * @brief Message の データ本文のポインタを 取得します。 * @param[out] pBody データ本文のポインタ * @param[out] size データ本文のサイズが格納されます * @return データ本文のポインタ */ void* GetMessageBodyPointer(void** pBody,size_t* size); nn::Result SetMessageBodyPointer(void* p_dataBody, size_t size); /* void OpenMessage(); void OpenMessage(u8* messId); */ //@} void SetHmacKey(char* hmacKey); /*! :private @brief バイナリデータ列を このクラスで扱うことができるようにします。 主に内部処理用です。通常はこのAPIを使用する必要はありません。 * @param[in] mess データバイナリ列 * @param[out] size データバイナリ列のサイズ @return */ 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); /*! :private @brief Message データを バイナリデータ列として出力します。 ネットワーク/ファイルへの出力を想定しています。 主に内部処理用です。通常はこのAPIを使用する必要はありません。 * @param[out] messData データバイナリ列 @return */ u32 OutputMessage(void* messData); u32 MakeMessageBinary(void* messData) const; void OutputMessageHeader(void* pHeaderBuf) const; u32 CheckMessageSize(const void* mess); void DumpMessage(); NN_PADDING4; }; } // namespace CTR } // namespace cec } // namespace nn #endif //NN_CEC_CTR_CEC_MESSAGE_H_