1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     friends_Types.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: 35786 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_FRIENDS_CTR_FRIENDS_TYPES_H_
17 #define NN_FRIENDS_CTR_FRIENDS_TYPES_H_
18 
19 #include <nn/types.h>
20 #include <nn/fnd.h>
21 
22 /*!
23   @defgroup nn_friends friends
24   @{
25 */
26 
27 #define NN_FRIENDS_INVALID_PRINCIPAL_ID             (0)     //!< 無効な PrincipalId です。
28 #define NN_FRIENDS_INVALID_LOCAL_FRIEND_CODE        (0ULL)  //!< 無効な LocalFriendCode です。
29 
30 #define NN_FRIENDS_SCREEN_NAME_SIZE                 (11)    //!< 表示名のバッファ要素数です。終端文字の分を含みます。
31 #define NN_FRIENDS_MODE_DESCRIPTION_SIZE            (128)   //!< ゲームモード説明文字列のバッファ要素数です。終端文字の分を含みます。
32 #define NN_FRIENDS_MII_SIZE                         (96)    //!< Mii のバイナリデータのサイズです。
33 #define NN_FRIENDS_APPLICATION_ARG_SIZE             (20)
34 #define NN_FRIENDS_FRIEND_LIST_SIZE                 (100)   //!< フレンドリストのサイズです。最大でこの数までのユーザをフレンドリストに登録できます。
35 
36 #define NN_FRIENDS_INVALID_GAME_ID                   (0)
37 
38 /*!
39   @brief プラットフォームの種類を表す列挙体です。
40 */
41 enum nnfriendsPlatformCode
42 {
43     NN_FRIENDS_PLATFORM_CTR = 2        //!< CTR を表すプラットフォームコードです。
44 };
45 typedef enum nnfriendsPlatformCode nnfriendsPlatformCode;
46 
47 /*!
48   @brief フレンドとの関係を属性のフラグで表す列挙体です。
49 */
50 enum nnfriendsAttributeFlag
51 {
52     NN_FRIENDS_ATTRIBUTE_FLAG_ESTABLISHED           = 1 << 0,   //!< フレンド関係が成立したことがあることを表すビットです。
53     NN_FRIENDS_ATTRIBUTE_FLAG_REMOTE_ACCESSIBLE     = 1 << 1    //!< オンライン上のフレンドのリソースにアクセスしてよいことを表すビットです。
54 };
55 typedef enum nnfriendsAttributeFlag nnfriendsAttributeFlag;
56 
57 /*!
58   @brief 通知の種類を表す列挙体です。
59 */
60 enum nnfriendsNotificationType
61 {
62     NN_FRIENDS_NOTIFICATION_NONE = 0,                   //!< 無効な通知です。
63     NN_FRIENDS_NOTIFICATION_ONLINE,                     //!< 自分がオンラインになったことを表します。
64     NN_FRIENDS_NOTIFICATION_OFFLINE,                    //!< 自分がオフラインになったことを表します。
65     NN_FRIENDS_NOTIFICATION_FRIEND_ONLINE,              //!< フレンドがオンラインになったことを表します。
66     NN_FRIENDS_NOTIFICATION_FRIEND_PRESENCE,            //!< フレンドのプレゼンスが変更されたことを表します。
67     NN_FRIENDS_NOTIFICATION_FRIEND_MII,                 //!< フレンドの Mii が変更されたことを表します。
68     NN_FRIENDS_NOTIFICATION_FRIEND_PROFILE,             //!< フレンドのプロフィールが変更されたことを表します。
69     NN_FRIENDS_NOTIFICATION_FRIEND_OFFLINE,             //!< フレンドがオフラインになったことを表します。
70     NN_FRIENDS_NOTIFICATION_BECOME_FRIEND,              //!< フレンドとフレンド関係が成立したことを表します。
71     NN_FRIENDS_NOTIFICATION_INVITATION                  //!< フレンドからお誘いが来たことを表します。
72 };
73 typedef enum nnfriendsNotificationType nnfriendsNotificationType;
74 
75 /*!
76   @brief 通知のビットマスクを表す列挙体です。
77 */
78 enum nnfriendsNotificationMask
79 {
80     NN_FRIENDS_NOTIFICATION_MASK_ONLINE                  = 1 << 0,                                                  //!< 自分がオンラインになった通知を受け取るための通知マスクです。
81     NN_FRIENDS_NOTIFICATION_MASK_OFFLINE                 = 1 << 1,                                                  //!< 自分がオフラインになった通知を受け取るための通知マスクです。
82     NN_FRIENDS_NOTIFICATION_MASK_FRIEND_ONLINE           = 1 << 2,                                                  //!< フレンドがオンラインになった通知を受け取るための通知マスクです。
83     NN_FRIENDS_NOTIFICATION_MASK_FRIEND_PRESENCE         = 1 << 3,                                                  //!< フレンドのプレゼンス変更通知を受け取るための通知マスクです。
84     NN_FRIENDS_NOTIFICATION_MASK_FRIEND_MII              = 1 << 4,                                                  //!< フレンドの Mii 変更通知を受け取るための通知マスクです。
85     NN_FRIENDS_NOTIFICATION_MASK_FRIEND_PROFILE          = 1 << 5,                                                  //!< フレンドのプロフィール変更通知を受け取るための通知マスクです。
86     NN_FRIENDS_NOTIFICATION_MASK_FRIEND_OFFLINE          = 1 << 6,                                                  //!< フレンドがオフラインになった通知を受け取るための通知マスクです。
87     NN_FRIENDS_NOTIFICATION_MASK_BECOME_FRIEND           = 1 << 7,                                                  //!< フレンドとのフレンド関係成立通知を受け取るための通知マスクです。
88     NN_FRIENDS_NOTIFICATION_MASK_INVITATION              = 1 << 8,                                                  //!< フレンドからのお誘い通知を受け取るための通知マスクです。。
89 
90     NN_FRIENDS_NOTIFICATION_MASK_DEFAULT                 = NN_FRIENDS_NOTIFICATION_MASK_ONLINE          |
91                                                            NN_FRIENDS_NOTIFICATION_MASK_OFFLINE         |
92                                                            NN_FRIENDS_NOTIFICATION_MASK_FRIEND_ONLINE   |
93                                                            NN_FRIENDS_NOTIFICATION_MASK_FRIEND_MII      |
94                                                            NN_FRIENDS_NOTIFICATION_MASK_FRIEND_PROFILE  |
95                                                            NN_FRIENDS_NOTIFICATION_MASK_FRIEND_OFFLINE  |
96                                                            NN_FRIENDS_NOTIFICATION_MASK_BECOME_FRIEND               //!< デフォルトの通知マスクです。
97 };
98 typedef enum nnfriendsNotificationMask nnfriendsNotificationMask;
99 
100 enum nnfriendsFontRegion
101 {
102     NN_FRIENDS_FONT_REGION_JP_US_EU,
103     NN_FRIENDS_FONT_REGION_CHINA,
104     NN_FRIENDS_FONT_REGION_KOREA,
105     NN_FRIENDS_FONT_REGION_TAIWAN,
106 
107     NN_FRIENDS_FONT_REGION_UNKNOWN = 255
108 };
109 typedef enum nnfriendsFontRegion nnfriendsFontRegion;
110 
111 /////////////////////////////////////////////////////////////////////////
112 
113 /*! @brief プリンシパル ID を表します。 */
114 typedef u32 nnfriendsPrincipalId;
115 /*! @brief ローカルフレンドコードを表します。 */
116 typedef u64 nnfriendsLocalFriendCode;
117 
118 /*!
119   @brief ユーザのプリンシパル ID とローカルフレンドコードを包括的に扱うための構造体です。
120 */
121 struct nnfriendsFriendKey
122 {
123     nnfriendsPrincipalId     principalId;           //!< プリンシパル ID が入っています。
124     NN_PADDING4;                                    //!<
125     nnfriendsLocalFriendCode localFriendCode;       //!< ローカルフレンドコードが入っています。
126 
127 #ifdef __cplusplus
initializennfriendsFriendKey128     inline void initialize()
129     {
130         this->principalId     = NN_FRIENDS_INVALID_PRINCIPAL_ID;
131         this->localFriendCode = NN_FRIENDS_INVALID_LOCAL_FRIEND_CODE;
132     }
133 
initializennfriendsFriendKey134     inline void initialize( nnfriendsPrincipalId principalId )
135     {
136         this->principalId     = principalId;
137         this->localFriendCode = NN_FRIENDS_INVALID_LOCAL_FRIEND_CODE;
138     }
139 
initializennfriendsFriendKey140     inline void initialize( nnfriendsLocalFriendCode localFriendCode )
141     {
142         this->principalId     = NN_FRIENDS_INVALID_PRINCIPAL_ID;
143         this->localFriendCode = localFriendCode;
144     }
145 
initializennfriendsFriendKey146     inline void initialize( nnfriendsPrincipalId principalId, nnfriendsLocalFriendCode localFriendCode )
147     {
148         this->principalId     = principalId;
149         this->localFriendCode = localFriendCode;
150     }
151 
nnfriendsFriendKeynnfriendsFriendKey152     inline nnfriendsFriendKey() {}
nnfriendsFriendKeynnfriendsFriendKey153     inline nnfriendsFriendKey( nnfriendsPrincipalId     principalId )     { initialize(principalId);     }
nnfriendsFriendKeynnfriendsFriendKey154     inline nnfriendsFriendKey( nnfriendsLocalFriendCode localFriendCode ) { initialize(localFriendCode); }
nnfriendsFriendKeynnfriendsFriendKey155     inline nnfriendsFriendKey( nnfriendsPrincipalId principalId, nnfriendsLocalFriendCode localFriendCode ) { initialize(principalId, localFriendCode); }
156 #endif
157 };
158 typedef struct nnfriendsFriendKey nnfriendsFriendKey;
159 
160 /*!
161   @brief ユーザのプロフィール情報が格納された構造体です。
162 */
163 struct nnfriendsProfile
164 {
165     u8 region;      //!< 本体仕向地のリージョンコードです。
166     u8 country;     //!< 国コードです。
167     u8 area;        //!< 地域コードです。
168     u8 language;    //!< 言語コードです。
169     u8 platform;    //!< プラットフォームコードです。 CTR では常に @ref nn::friends::CTR::PLATFORM_CTR が入ります。
170     NN_PADDING3;    //!<
171 };
172 typedef struct nnfriendsProfile nnfriendsProfile;
173 
174 /*!
175   @brief Mii のデータが格納された構造体です。
176 
177          この構造体の内容を利用するには、別途「似顔絵ライブラリ」が必要です。
178 */
179 struct nnfriendsMiiData
180 {
181     union {
182         u8  data[NN_FRIENDS_MII_SIZE];                      //!< Mii のバイナリデータです。フレンド関係が成立するまでは無効なデータが入ります。
183         u32 value32[NN_FRIENDS_MII_SIZE / sizeof(u32)];     //!<
184     };
185 };
186 typedef struct nnfriendsMiiData nnfriendsMiiData;
187 
188 /*!
189   @brief フレンドが合流するために必要な、自分がプレイ中のゲームに関する情報を格納する構造体です。
190 
191          ローンチではこの構造体を使用する機能は提供されません。
192 */
193 struct nnfriendsGameMode
194 {
195     u32                  joinAvailabilityFlag;                              //!< 自分の参加しているマッチメイクグループにフレンドが合流可能かどうかを示します。
196     u32                  matchmakeSystemType;                               //!< 自分の参加しているマッチメイクの種類です。
197     u32                  joinGameId;                                        //!< 合流可能なゲームタイトルを識別するための ID です。合流可能なゲームタイトル間では、いずれかのタイトルコードを共用します。
198     u32                  joinGameMode;                                      //!< 合流可能なゲームモードを識別するための値です。 0 から 63 までが指定可能です。
199     nnfriendsPrincipalId ownerPrincipalId;                                  //!< 自分が参加しているマッチメイクグループのオーナーのプリンシパル ID を指定します。
200     u32                  joinGroupId;                                       //!< 自分が参加しているマッチメイクグループの ID を指定します。
201     u8                   applicationArg[NN_FRIENDS_APPLICATION_ARG_SIZE];   //!< アプリケーションが任意に定義できる情報です。
202 };
203 typedef struct nnfriendsGameMode nnfriendsGameMode;
204 
205 /*!
206   @brief 自分のプレゼンス情報が格納された構造体です。
207 */
208 struct nnfriendsMyPresence
209 {
210     nnfriendsGameMode gameMode;                                             //!< 自分がフレンドに公開しているゲームモード情報が入っています。
211     char16            modeDescription[NN_FRIENDS_MODE_DESCRIPTION_SIZE];    //!< 自分がフレンドに公開しているゲームモード説明文字列が入っています。
212 };
213 typedef struct nnfriendsMyPresence nnfriendsMyPresence;
214 
215 /*!
216   @brief フレンドのプレゼンス情報が格納された構造体です。
217 */
218 struct nnfriendsFriendPresence
219 {
220     nnfriendsGameMode gameMode;         //!< フレンドが公開しているゲームモード情報が入っています。
221     bool              isOnline;         //!< フレンドがオンラインであれば true 、そうでなければ false が入っています。
222     bool              isInvitingMe;     //!< フレンドが自分をお誘い中であれば true 、そうでなければ false が入っています。ローンチではこの値を使用する機能は提供されません。
223     bool              isValid;          //!< 取得した構造体のデータが有効であれば true 、無効であれば false が入っています。
224     NN_PADDING1;                        //!<
225 };
226 typedef struct nnfriendsFriendPresence nnfriendsFriendPresence;
227 
228 /*!
229   @brief 自分のオンライン状態や、フレンドの状態変更の通知が格納された構造体です。
230 */
231 struct nnfriendsEventNotification
232 {
233     u8                 type;            //!< 通知の種類が入っています。 @ref nn::friends::CTR::NotificationType の値が入ります。
234     NN_PADDING3;                        //!<
235     NN_PADDING4;                        //!<
236     nnfriendsFriendKey friendKey;       //!< 変更のあったフレンドのフレンドキーが入っています。フレンドに関係のない通知の場合は無効なフレンドキーが入っています。
237 };
238 typedef struct nnfriendsEventNotification nnfriendsEventNotification;
239 
240 /*!
241   @}
242 */
243 
244 #ifdef __cplusplus
245 
246 namespace nn {
247 namespace friends {
248 namespace CTR {
249 
250     namespace detail {
251 
252     } // end of namespace detail
253 
254     /*! @brief プリンシパル ID を表します。 */
255     typedef ::nnfriendsPrincipalId                    PrincipalId;
256     /*! @brief ローカルフレンドコードを表します。 */
257     typedef ::nnfriendsLocalFriendCode                LocalFriendCode;
258 
259     static const PrincipalId     INVALID_PRINCIPAL_ID         = NN_FRIENDS_INVALID_PRINCIPAL_ID;            //!< 無効な PrincipalId です。
260     static const LocalFriendCode INVALID_LOCAL_FRIEND_CODE    = NN_FRIENDS_INVALID_LOCAL_FRIEND_CODE;       //!< 無効な LocalFriendCode です。
261 
262     static const u32 SCREEN_NAME_SIZE         = NN_FRIENDS_SCREEN_NAME_SIZE;        //!< 表示名のバッファ要素数です。終端文字の分を含みます。
263     static const u32 MODE_DESCRIPTION_SIZE    = NN_FRIENDS_MODE_DESCRIPTION_SIZE;   //!< ゲームモード説明文字列のバッファ要素数です。終端文字の分を含みます。
264     static const u32 MII_SIZE                 = NN_FRIENDS_MII_SIZE;                //!< Mii のバイナリデータのサイズです。
265     static const u32 APPLICATION_ARG_SIZE     = NN_FRIENDS_APPLICATION_ARG_SIZE;
266     static const u32 FRIEND_LIST_SIZE         = NN_FRIENDS_FRIEND_LIST_SIZE;        //!< フレンドリストのサイズです。最大でこの数までのユーザをフレンドリストに登録できます。
267 
268     static const u32 INVALID_GAME_ID          = NN_FRIENDS_INVALID_GAME_ID;
269 
270     /////////////////////////////////////////////////////////////////////////
271 
272     /*!
273       @brief プラットフォームの種類を表す列挙体です。
274     */
275     enum PlatformCode
276     {
277         PLATFORM_CTR = 2        //!< CTRを表すプラットフォームコードです。
278     };
279     typedef enum PlatformCode PlatformCode;
280 
281     /*!
282       @brief フレンドとの関係を属性のフラグで表す列挙体です。
283     */
284     enum AttributeFlag
285     {
286         ATTRIBUTE_FLAG_ESTABLISHED          = 1 << 0,   //!< フレンド関係が成立したことがあることを表すビットです。
287         ATTRIBUTE_FLAG_REMOTE_ACCESSIBLE    = 1 << 1    //!< オンライン上のフレンドのリソースにアクセスしてよいことを表すビットです。
288     };
289     typedef enum AttributeFlag AttributeFlag;
290 
291     /*!
292       @brief 通知の種類を表す列挙体です。
293     */
294     enum NotificationType
295     {
296         NOTIFICATION_NONE = 0,                  //!< 無効な通知です。
297         NOTIFICATION_ONLINE,                    //!< 自分がオンラインになったことを表します。
298         NOTIFICATION_OFFLINE,                   //!< 自分がオフラインになったことを表します。
299         NOTIFICATION_FRIEND_ONLINE,             //!< フレンドがオンラインになったことを表します。
300         NOTIFICATION_FRIEND_PRESENCE,           //!< フレンドのプレゼンスが変更されたことを表します。
301         NOTIFICATION_FRIEND_MII,                //!< フレンドの Mii が変更されたことを表します。
302         NOTIFICATION_FRIEND_PROFILE,            //!< フレンドのプロフィールが変更されたことを表します。
303         NOTIFICATION_FRIEND_OFFLINE,            //!< フレンドがオフラインになったことを表します。
304         NOTIFICATION_BECOME_FRIEND,             //!< フレンドとフレンド関係が成立したことを表します。
305         NOTIFICATION_INVITATION                 //!< フレンドからお誘いが来たことを表します。
306     };
307     typedef enum NotificationType NotificationType;
308 
309     /*!
310       @brief 通知のビットマスクを表す列挙体です。
311     */
312     enum NotificationMask
313     {
314         NOTIFICATION_MASK_ONLINE                  = 1 << 0,                                         //!< 自分がオンラインになった通知を受け取るための通知マスクです。
315         NOTIFICATION_MASK_OFFLINE                 = 1 << 1,                                         //!< 自分がオフラインになった通知を受け取るための通知マスクです。
316         NOTIFICATION_MASK_FRIEND_ONLINE           = 1 << 2,                                         //!< フレンドがオンラインになった通知を受け取るための通知マスクです。
317         NOTIFICATION_MASK_FRIEND_PRESENCE         = 1 << 3,                                         //!< フレンドのプレゼンス変更通知を受け取るための通知マスクです。
318         NOTIFICATION_MASK_FRIEND_MII              = 1 << 4,                                         //!< フレンドの Mii 変更通知を受け取るための通知マスクです。
319         NOTIFICATION_MASK_FRIEND_PROFILE          = 1 << 5,                                         //!< フレンドのプロフィール変更通知を受け取るための通知マスクです。
320         NOTIFICATION_MASK_FRIEND_OFFLINE          = 1 << 6,                                         //!< フレンドがオフラインになった通知を受け取るための通知マスクです。
321         NOTIFICATION_MASK_BECOME_FRIEND           = 1 << 7,                                         //!< フレンドとのフレンド関係成立通知を受け取るための通知マスクです。
322         NOTIFICATION_MASK_INVITATION              = 1 << 8,                                         //!< フレンドからのお誘い通知を受け取るための通知マスクです。
323 
324         NOTIFICATION_MASK_DEFAULT                 = NOTIFICATION_MASK_ONLINE          |
325                                                     NOTIFICATION_MASK_OFFLINE         |
326                                                     NOTIFICATION_MASK_FRIEND_ONLINE   |
327                                                     NOTIFICATION_MASK_FRIEND_MII      |
328                                                     NOTIFICATION_MASK_FRIEND_PROFILE  |
329                                                     NOTIFICATION_MASK_FRIEND_OFFLINE  |
330                                                     NOTIFICATION_MASK_BECOME_FRIEND                 //!< デフォルトの通知マスクです。
331     };
332     typedef enum NotificationMask NotificationMask;
333 
334     enum FontRegion
335     {
336         FONT_REGION_JP_US_EU,
337         FONT_REGION_CHINA,
338         FONT_REGION_KOREA,
339         FONT_REGION_TAIWAN,
340 
341         FONT_REGION_UNKNOWN = 255
342     };
343     typedef enum FontRegion FontRegion;
344 
345     /*! @brief ユーザのプリンシパル ID とローカルフレンドコードを包括的に扱うための構造体です。 */
346     typedef ::nnfriendsFriendKey               FriendKey;
347     /*! @brief ユーザのプロフィール情報が格納された構造体です。 */
348     typedef ::nnfriendsProfile                 Profile;
349     /*! @brief Mii のデータが格納された構造体です。
350 
351                この構造体の内容を利用するには、別途「似顔絵ライブラリ」が必要です。 */
352     typedef ::nnfriendsMiiData                 MiiData;
353 
354     /*! @brief フレンドが合流するために必要な、自分がプレイ中のゲームに関する情報を格納する構造体です。
355 
356                ローンチではこの構造体を使用する機能は提供されません。
357     */
358     typedef ::nnfriendsGameMode                GameMode;
359     /*! @brief 自分のプレゼンス情報が格納された構造体です。 */
360     typedef ::nnfriendsMyPresence              MyPresence;
361     /*! @brief フレンドのプレゼンス情報が格納された構造体です。 */
362     typedef ::nnfriendsFriendPresence          FriendPresence;
363 
364     /*! @brief 自分のオンライン状態や、フレンドの状態変更の通知が格納された構造体です。 */
365     typedef ::nnfriendsEventNotification       EventNotification;
366 
367 } // end of namespace CTR
368 } // end of namespace friends
369 } // end of namespace nn
370 
371 #endif // __cplusplus
372 
373 #endif  // NN_FRIENDS_CTR_FRIENDS_TYPES_H_
374