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: 33924 $
14  *---------------------------------------------------------------------------*/
15 #ifndef NN_CEC_CTR_CEC_TYPES_H_
16 #define NN_CEC_CTR_CEC_TYPES_H_
17 
18 #include <nn/types.h>
19 #include <nn/cec/CTR/cec_Const.h>
20 #include <nn/cec/CTR/cec_MessageId.h>
21 
22 namespace nn {
23 namespace cec {
24 namespace CTR {
25     /*!
26         @brief   すれちがい通信IDの形式です。@ref MakeCecTitleId で、この 32ビットの値を生成することができます。
27     */
28     typedef u32 TitleId;
29     typedef u32 GroupId;
30     typedef bit64 SenderId;
31 
32     //! @name SendMode
33     //@{
34     /*!
35      * @brief Messageの送信方式です。Messageに指定します。
36 
37               SENDMODE_RECV : 受信のみ<br>
38               SENDMODE_SEND : 送信のみ<br>
39               SENDMODE_SENDRECV : 送受信<br>
40               SENDMODE_EXCHANGE : 交換<br>
41               <br>
42               「受信のみ」に設定されたMessageは送信されず、相手の送信を待つのみになります。<br>
43               「交換」に設定されたMessageは、送信が成功しなかった場合(※)、
44               そのとき受信したMessageは保存されません。<br>
45               また、受信したMessageには、交換で送信されたMessageのMessageIdが記録され、どのMessageと交換されたかを追跡することができます。このMessageIdは、Message::GetMessageId_Pair で取得できます。<br><br>
46               ※ 送信が完了したときに成功と判定し、相手のデータ保存が完了したことの確認は行われません。
47               受信データ保存中に中断された( @ref CecControl::StopScanning )、相手側の受信ボックス内で重複していた等で、
48               相手側が受信したと判定できなかったときも、送信は成功として処理されます。
49 
50      */
51     typedef u8 SendMode;
52 
53         static const u8 SENDMODE_RECV           = 0x1;                  //!< 受信のみ
54         static const u8 SENDMODE_SEND           = 0x2;                  //!< 送信のみ
55         static const u8 SENDMODE_SENDRECV       = 0x3;                  //!< 送受信
56         static const u8 SENDMODE_EXCHANGE       = 0x0;                  //!< 交換
57 
58         static const u8 CEC_SENDMODE_RECV       = SENDMODE_RECV;
59         static const u8 CEC_SENDMODE_SEND       = SENDMODE_SEND;
60         static const u8 CEC_SENDMODE_SENDRECV   = SENDMODE_SENDRECV;
61         static const u8 CEC_SENDMODE_EXCHANGE   = SENDMODE_EXCHANGE;
62     //@}
63 
64 
65     //! @name MessageTypeFlag
66     //@{
67 
68     /*!
69      * @brief 送信相手によって Message を切り替える為のフラグです。Messageに指定します。
70 
71             ・MESSAGE_TYPEFLAG_ANYONE = (MESSAGE_TYPEFLAG_NON_FRIEND | MESSAGE_TYPEFLAG_FRIEND) <br>
72              Friend であるかどうかを区別せずに送信する場合に設定します。<br>
73              通常はこの設定を使用します。<br>
74             <br>
75             ・MESSAGE_TYPEFLAG_NON_FRIEND <br>
76              通信相手が Friend ではない場合に<u>限定して</u>送信します。<br>
77             <br>
78             ・MESSAGE_TYPEFLAG_FRIEND <br>
79              通信相手が Friend の場合に送信します。<br>
80             <br>
81             GroupId と組み合わせることで、送信相手が Friend か非 Friend かで Message
82             を切り替えて送信することができます。<br>
83             例)<br>
84             (1)[Group:1/MESSAGE_TYPEFLAG_NON_FRIEND/Body:MESSAGE1], <br>
85             (2)[Group:1/MESSAGE_TYPEFLAG_FRIEND/Body:MESSAGE2] の2つのメッセージを送信ボックスにセット。<br>
86             → 発見した通信相手が Friendのときは (2)、Friendではないときには (1) が送信される。
87 
88      */
89     typedef u8 MessageTypeFlag;
90 
91     static const u8 MESSAGE_TYPEFLAG_NON_FRIEND     = 0x1;          //!< 非Friendが受信可
92     static const u8 MESSAGE_TYPEFLAG_FRIEND         = 0x2;          //!< Friendが受信可
93     static const u8 MESSAGE_TYPEFLAG_ANYONE         = MESSAGE_TYPEFLAG_NON_FRIEND|MESSAGE_TYPEFLAG_FRIEND;//!< Friend/非Friendを問わず受信可
94 
95     typedef MessageTypeFlag CecMessageTypeFlag;
96     //@}
97 
98 
99     //! @name MessageExHeaderType
100     //@{
101 
102     /*!
103      * @brief Message の拡張Headerのデータ種別です。
104      */
105     typedef u32 MessageExHeaderType;
106 
107         static const u32 MESSAGE_EXHEADER_TYPE_MFILTER  = 0x00000001;    // ModuleFilter
108         static const u32 MESSAGE_EXHEADER_TYPE_ICON     = 0x00000002;   //!< 個々の Message のアイコン
109         static const u32 MESSAGE_EXHEADER_TYPE_NAME     = 0x00000003;    // アプリ名
110         static const u32 MESSAGE_EXHEADER_TYPE_INFO     = 0x00000004;   //!< 個々の Message のデータの説明
111         static const u32 MESSAGE_EXHEADER_TYPE_REGION   = 0x00000005;    // REGION
112 
113     typedef MessageExHeaderType CecMessageExHeaderType;
114     //@}
115 
116     #define MESSAGE_MAGIC       (0x6060)
117     #define MESSAGE_VERSION     (0x00000000)
118     struct CecMessageHeader
119     {
120         u16 magic16;                //!< マジックコード。固定値。
121         NN_PADDING2;
122 
123         u32 messSize;               //!< メッセージ全体のサイズ  (messSize = headerSize + bodySize + hashSize)
124         u32 headerSize;             //!< ヘッダのサイズ(ExHeaderを含む)
125         u32 bodySize;                //!< Message 本文のサイズ
126 
127         u32 cecTitleId;                 //!< Title固有ID
128         u32 cecTitleId_reserve;         //!< Title固有ID(予備)
129         u32 groupId;                //!< Title固有サブID
130         u32 sessionId;              //!< 送信時に付与されるID(同時に送信されたMessageは同じIDになる)
131         u8  messageId[CEC_SIZEOF_MESSAGEID];          //!< メッセージ固有ID
132         u32 messVersion;            //!< Messageバージョン
133         u8  messageId_pair[CEC_SIZEOF_MESSAGEID];     //!< メッセージ交換をした場合、対になるメッセージのID
134         u8  messageTypeFlag;        //!< Friend/Anybody
135         u8  sendMode;               //!< 送信/受信
136         bit8    flagUnread;                 //!< フラグ1
137         bit8    flagNew;                    //!< フラグ2
138         u64  senderId;              //!< 送信者のID
139         u64  senderId2;             //!< 送信者のID(予備)
140         nn::fnd::DateTimeParameters     sendDate;               //!< 送信日時(ms)
141         nn::fnd::DateTimeParameters     recvDate;               //!< 受信日時(ms)
142         nn::fnd::DateTimeParameters     createDate;             //!< 作成日時(ms)
143         u8  sendCount;              //!< 送信回数
144         u8  propagationCount;       //!< 伝播回数
145         bit16   tag;                //!< タグ
146         //u32   PAD[4]; // 16 bytes
147     };
148 
149 
150 } // namespace CTR
151 } // namespace cec
152 } // namespace nn
153 
154 #endif  //NN_CEC_CTR_CEC_TYPES_H_
155