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: 32992 $ 14 *---------------------------------------------------------------------------*/ 15 #ifndef NN_CEC_CTR_CEC_MESSAGE_H_ 16 #define NN_CEC_CTR_CEC_MESSAGE_H_ 17 18 #include <nn/fnd.h> 19 #include <nn/cec/CTR/cec_Const.h> 20 #include <nn/cec/CTR/cec_Types.h> 21 22 namespace nn { 23 namespace cec { 24 namespace CTR { 25 26 27 // メッセージデータ構造 28 struct CecMessageHeader; 29 30 #define CEC_EXHEADER_NUM_MAX (16) 31 #define CEC_EXHEADER_SIZE_MAX (8*1024) 32 33 /*! 34 :private 35 @struct CecMessageExHeader 36 @brief CEC の Message の拡張ヘッダ形式 37 */ 38 struct CecMessageExHeader 39 { 40 u32 exHeaderType; //!< 拡張ヘッダタイプ @ref CecMessageExHeaderType で指定します。 41 u32 exHeaderLen; //!< 拡張ヘッダデータ長 42 u8* exHeaderData; //!< 拡張ヘッダデータ 43 }; 44 45 #define LOAD_FLAG_POINTER 1 46 #define LOAD_FLAG_MALLOC 0 47 48 /*! 49 @class Message 50 @brief CEC Message を扱うクラスです。 51 */ 52 class Message 53 { 54 private: 55 struct CecMessageHeader m_cec_mh; 56 struct CecMessageExHeader m_cec_mhex[CEC_EXHEADER_NUM_MAX] NN_ATTRIBUTE_ALIGN(4); 57 s8 numOfExHeader; 58 NN_PADDING3; 59 u8* m_messBody; 60 u32 m_messBodyLen; 61 62 u8* m_pMessBody; 63 64 u8* m_pHash; 65 u32 m_hashSize; 66 67 u8 m_flag_pointer; 68 69 u8 m_flag_input; 70 71 u8 m_hmacKey[MESSAGE_HMAC_KEYLEN]; 72 73 NN_PADDING2; 74 75 u32 calcCecMessSize(); 76 nn::Result Init_Message(); 77 nn::Result SetExHeaderWithoutCalc(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); 78 nn::Result SetMessageBodyWithoutCalc(const void* dataBody, size_t size); 79 nn::Result SetHmacSha256(void* input); 80 nn::Result GetHmacSha256(void* outBuf, u32 size = CEC_SIZEOF_HASH) const; 81 public: 82 83 /*! 84 * @brief コンストラクタ 85 * @return 86 */ 87 Message(); 88 89 Message(const void* messData, size_t messSize); 90 ~Message(); 91 92 93 94 //! @name 新規Message作成 95 //@{ 96 /*! 97 * @brief 新規 Message を作成します。 98 99 この関数で基本的なパラメータがセットされます。<br> 100 @ref SetMessageBody で本文部のデータをセットし、 @ref MessageBox::WriteMessage で送信BOXに書き込むと、すれちがい通信時にMessageが送信されます。 101 102 * @param[in] cecTitleId すれちがい通信ID 103 * @param[in] groupId Message グルーピングID<br> @ref SetGroupID でセットされる値と同じです。 104 * @param[in] messageTypeFlag Friend/非Friend宛の指定 を @ref MessageTypeFlag で指定します。<br>Friend/非Friendの関係に関わらず送信する場合は、(MESSAGE_TYPEFLAG_NON_FRIEND | MESSAGE_TYPEFLAG_FRIEND)を指定してください。 105 * @param[in] sendMode 送信モード(受信のみ/送信のみ/送受信/交換)を @ref SendMode で指定します。<br> @ref SetSendMode でセットされる値と同じです。 106 * @param[in] sendCount 送信回数<br> 送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 107 * @param[in] propagationCount 伝播回数<br> 送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 108 * @param[in] icon アイコンを指定します。<br> 109 フォーマット: RGB565 (リトルエンディアン)<br> 110 サイズ: 40×40 (3200Bytes)<br> 111 * @param[in] iconSize アイコンのデータサイズを指定します。 112 * @param[in] infoTextData Message の説明文をセットします。<br> 113 文字コード: UTF16-LE<br> 114 表示サイズ: 全角16文字×2行で表示できる文字数<br> 115 バッファ最大: 128×2Bytes (改行やNULL終端込み)<br> 116 * @param[in] infoTextSize Message の説明文のデータサイズを指定します。 117 * @return nn::Result 118 * @retval ResultSuccess 成功しました。 119 * @retval ResultInvalidArgument 無効な値が設定されています。 120 * @retval ResultInvalidCombination 送信回数と伝播回数の値が共に2以上に設定されています。 121 * @retval 上記以外 失敗しました。 122 */ 123 nn::Result NewMessage( 124 TitleId cecTitleId, u32 groupId, 125 MessageTypeFlag messageTypeFlag, SendMode sendMode, 126 u8 sendCount, u8 propagationCount, 127 void* icon, size_t iconSize, 128 wchar_t* infoTextData, size_t infoTextSize); 129 /*! 130 * @brief 新規 Message を作成します。 131 132 この関数で基本的なパラメータがセットされます。<br> 133 @ref SetMessageBody で本文部のデータをセットし、 @ref MessageBox::WriteMessage で送信BOXに書き込むと、すれちがい通信時にMessageが送信されます。<br> 134 <br> 135 アイコンとMessageの説明文のセットを別途行う必要があります。 136 137 * @param[in] cecTitleId すれちがい通信ID 138 * @param[in] groupId Message グルーピングID<br> @ref SetGroupID でセットされる値と同じです。 139 * @param[in] messageTypeFlag Friend/非Friend を @ref MessageTypeFlag で指定します。 140 * @param[in] sendMode 送信モード(受信のみ/送信のみ/送受信/交換)を @ref SendMode で指定します。<br> @ref SetSendMode でセットされる値と同じです。 141 * @param[in] sendCount 送信回数<br> 送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 142 * @param[in] propagationCount 伝播回数<br> 送信回数と伝播回数は、同時に2以上にすること(複数回送信+伝播)はできません。 143 * @return nn::Result 144 * @retval ResultSuccess 成功しました。 145 * @retval ResultInvalidArgument 無効な値が設定されています。 146 * @retval ResultInvalidCombination 送信回数と伝播回数の値が共に2以上に設定されています。 147 * @retval ResultTooLarge データサイズが大きすぎます。 148 * @retval ResultNotAuthorized 既にMessageIdが割り振られて確定されたメッセージを編集しようとしています。 149 * @retval 上記以外 失敗しました。 150 */ 151 nn::Result NewMessage( 152 TitleId cecTitleId, u32 groupId, 153 MessageTypeFlag messageTypeFlag, SendMode sendMode, 154 u8 sendCount, u8 propagationCount); 155 //@} 156 157 158 //! @name パラメータ 159 //@{ 160 /*! 161 :private 162 * @brief Message に すれちがい通信ID をセットします。 163 * @param[in] cecTitleId Title固有ID 164 * @return nn::Result 165 * @retval ResultSuccess 成功しました。 166 * @retval 上記以外 失敗しました。 167 */ 168 nn::Result SetCecTitleId(TitleId cecTitleId); 169 170 /*! 171 * @brief Message の すれちがい通信ID を取得します。 172 * @return CecTitleId 173 */ 174 u32 GetCecTitleId() const; 175 176 nn::Result SetCecTitleId_Str(const u8* cecTitleId_str); 177 u8* GetCecTitleId_Str() const; 178 179 /*! 180 * @brief Message に Group ID をセットします。送信BOX内の同じGroupIDを持つ Message が 181 グルーピングされ、一緒に送信されます。 182 183 ・1送信の最大サイズ以上はグルーピングされません。<br> 184 ・0 を指定した場合は、グルーピングされず、単独で送信されます。 185 186 * @param[in] groupId Group ID 187 * @return nn::Result 188 * @retval ResultSuccess 成功しました。 189 * @retval 上記以外 失敗しました。 190 */ 191 nn::Result SetGroupID(u32 groupId); 192 193 /*! 194 * @brief Message の Group ID を取得します。送信BOX内の同じGroupIDを持つ Message が 195 グルーピングされ、一緒に送信されます。 196 * @return Group ID 197 */ 198 u32 GetGroupID() const; 199 200 201 nn::Result SetSessionID(u32 sessionId); 202 u32 GetSessionID() const; 203 204 /*! 205 :private 206 * @brief Message のサイズを指定します。 207 * @param[in] messSize サイズ 208 * @return nn::Result 209 */ 210 nn::Result SetMessSize(const u32 messSize); 211 212 /*! 213 * @brief Message の サイズを取得します。 214 * @return サイズの値 215 */ 216 u32 GetMessSize() const; 217 218 /*! 219 :private 220 * @brief Message Header のサイズを指定します。 221 * @param[in] headerSize サイズ 222 * @return nn::Result 223 */ 224 nn::Result SetHeaderSize(u32 headerSize); 225 226 /*! 227 * @brief 拡張ヘッダを含む、Message Header の サイズを取得します。 228 * @return サイズの値 229 */ 230 u32 GetHeaderSize() const; 231 232 /*! 233 :private 234 * @brief Message 本文 のサイズを指定します。 235 * @param[in] bodySize サイズ 236 * @return nn::Result 237 */ 238 nn::Result SetBodySize(u32 bodySize); 239 240 /*! 241 * @brief Message 本文 の サイズを取得します。 242 * @return サイズの値 243 */ 244 u32 GetBodySize() const; 245 246 /*! 247 :private 248 * @brief Message の MessageID を指定します。 249 * @param[in] messId MessageID 250 * @return nn::Result 251 */ 252 nn::Result SetMessageId(const MessageId& messageId); 253 254 /*! 255 * @brief Message の MessageID を取得します。MessageID は、 256 Messageを作成して保存したときに付与されます。 257 * @param[out] messId MessageID 258 * @return MessageId 259 */ 260 MessageId GetMessageId(MessageId* messId) const; 261 262 nn::Result SetMessageVersion(const u32 messVersion); 263 u32 GetMessageVersion() const; 264 265 /*! 266 :private 267 * @brief 交換された Message の MessageID を指定します。 268 * @param[in] messIdPair MessageId 269 * @return nn::Result 270 */ 271 nn::Result SetMessageId_Pair(const MessageId& messIdPair); 272 273 /*! 274 * @brief 交換された Message の MessageID を取得します。通信の方式に「交換」を 275 指定して通信したとき、対になる 送信 Message の MessageID が、受信 Message に記録されます。 276 * @param[out] messIdPair MessageId 277 * @return MessageId 278 */ 279 MessageId GetMessageId_Pair(MessageId* messIdPair) const; 280 281 /*! 282 * @brief 送信対象を @ref MessageTypeFlag で指定します。 283 * @param[in] messTypeFlag @ref MessageTypeFlag 284 * @return nn::Result 285 * @retval ResultSuccess 成功しました。 286 */ 287 nn::Result SetMessageTypeFlag(MessageTypeFlag messTypeFlag); 288 289 /*! 290 * @brief 送信対象の指定の値を取得します。 291 * @return @ref MessageTypeFlag 292 */ 293 MessageTypeFlag GetMessageTypeFlag() const; 294 295 /*! 296 * @brief 送信モード(受信のみ/送信のみ/送受信/交換)を @ref SendMode で指定します。 297 * @param[in] sendMode @ref SendMode 298 * @return nn::Result 299 * @retval ResultSuccess 成功しました。 300 * @retval ResultInvalidArgument 無効な値が指定されています。 301 302 */ 303 nn::Result SetSendMode(SendMode sendMode); 304 305 /*! 306 * @brief 送信モード(受信のみ/送信のみ/送受信/交換)を取得します。 307 * @return @ref MessageTypeFlag 308 */ 309 SendMode GetSendMode() const; 310 311 312 nn::Result SetSenderID(u64 senderId); 313 u64 GetSenderID() const; 314 315 nn::Result SetSendDate(const nn::fnd::DateTimeParameters& date); 316 /*! 317 * @brief 受信 Message の送信時の時刻を取得します。通信相手の時計の時刻が入ります。 318 * @return @ref nn::fnd::DateTimeParameters 319 */ 320 nn::fnd::DateTimeParameters GetSendDate() const; 321 322 nn::Result SetRecvDate(const nn::fnd::DateTimeParameters& date); 323 /*! 324 * @brief 受信 Message の受信時の時刻を取得します。受信者の時計の時刻が入ります。 325 * @return @ref nn::fnd::DateTimeParameters 326 */ 327 nn::fnd::DateTimeParameters GetRecvDate() const; 328 329 nn::Result SetCreateDate(const nn::fnd::DateTimeParameters& date); 330 /*! 331 * @brief Message の作成時の時刻を取得します。 332 * @return @ref nn::fnd::DateTimeParameters 333 */ 334 nn::fnd::DateTimeParameters GetCreateDate() const; 335 336 /*! 337 * @brief 送信回数を指定します。送信されると 1 減算され、0になると送信されなくなります。 338 339 送信が完了し、送信回数が 0 になった後も、Messageは送信BOXに残ります。 340 341 * @param[in] sendCount 送信回数 342 * @return nn::Result 343 * @retval ResultSuccess 成功しました。 344 */ 345 nn::Result SetSendCount(const u8 sendCount); 346 347 /*! 348 * @brief 送信回数を取得します。送信されると 1 減算され、0になると送信されなくなります。 349 350 送信が完了し、送信回数が 0 になった後も、Messageは送信BOXに残ります。 351 352 * @return 送信回数 353 */ 354 u8 GetSendCount() const; 355 356 /*! 357 * @brief 伝播回数を指定します。受信時に 1 減算され、1以上の場合に送信BOXにコピーされます。 358 359 2 を指定した場合は、<br>[自分] ---(2)----> [Aさん] ---(1)----> [Bさん]<br> 360 のように、2回の送信が行われます。自分が送信したデータが、また自分に戻ってくる可能性もあるので注意してください。<br> 361 受信ボックスに既に同じMessageがあった、送信BOXに空きがなかったなどの理由で、送信BOXにコピーされないことがあります。その場合、そのMessageはそれ以上伝播しないことになります。 362 363 * @param[in] propagationCount 伝播回数 364 * @return nn::Result 365 * @retval ResultSuccess 成功しました。 366 */ 367 nn::Result SetPropagationCount(u8 propagationCount); 368 369 /*! 370 * @brief 伝播回数を取得します。受信時に 1 減算され、1以上の場合に送信BOXにコピーされます。 371 * @return 伝播回数 372 */ 373 u8 GetPropagationCount() const; 374 375 /*! 376 :private 377 * @brief 未読フラグの値を指定します。 378 * @param[in] flag 未読 = 1 / 既読 = 0 379 <br>変更した値を保存するには、 @ref MessageBox::WriteMessage で 380 上書きする必要があります。 381 * @return nn::Result 382 */ 383 nn::Result SetFlag_Unread(u8 flag); 384 385 /*! 386 :private 387 * @brief 未読フラグの値を取得します。 388 この値は、受信時に 1 に設定される以外は、自動的に変化しません。 389 * @return 未読 = 1 / 既読 = 0 390 */ 391 u8 GetFlag_Unread() const; 392 393 /*! 394 :private 395 * @brief 新着フラグの値を指定します。 396 * @param[in] flag 新着 = 1 397 <br>変更した値を保存するには、 @ref MessageBox::WriteMessage で 398 上書きする必要があります。 399 400 * @return nn::Result 401 */ 402 nn::Result SetFlag_New(const u8 flag); 403 404 /*! 405 :private 406 * @brief 新着フラグの値を取得します。 407 この値は、受信時に 1 に設定される以外は、自動的に変化しません。 408 * @return 新着 = 1 409 */ 410 u8 GetFlag_New() const; 411 412 /*! 413 * @brief Message のヘッダに 16bit の値を入れておくことができます。 414 415 @ref MessageBox::GetMessageTag でも取得することができ、Messageの検索などに使うことができます。 416 417 * @param[in] tag 16 bit の値 418 * @return 419 */ 420 void SetTag(u16 tag); 421 422 /*! 423 * @brief Message のヘッダの Tag の値を取得します。 424 * @return Tag 425 */ 426 u16 GetTag() const; 427 428 /*! 429 * @brief Message の拡張ヘッダにデータをセットします。 430 431 ※ アイコン・説明文以外の アプリ独自のデータを入れることはできません。 432 433 * @param[in] exhType データ種別 @ref MessageExHeaderType で指定します。 434 * @param[in] exhLen データ長を指定します。最大長は 8KB です。 435 * @param[in] exhBody データ 436 * @return nn::Result 437 * @retval ResultSuccess 成功しました。 438 * @retval ResultTooLarge データサイズが大きすぎます。 439 * @retval ResultNotAuthorized 既にMessageIdが割り振られて確定されたメッセージを編集しようとしています。 440 * @retval 上記以外 失敗しました。 441 */ 442 nn::Result SetExHeader(MessageExHeaderType exhType, size_t exhLen, const void* exhBody); 443 444 /*! 445 * @brief Message の拡張ヘッダからデータを取得します。 446 * @param[in] exhType データ種別 @ref MessageExHeaderType で指定します。 447 * @param[out] exhLen データ長を取得します。 448 * @param[out] exhBody データを取得します。 449 * @return nn::Result 450 * @retval ResultSuccess 成功しました。 451 * @retval ResultNoData データがありません。 452 * @retval 上記以外 失敗しました。 453 */ 454 nn::Result GetExHeader(MessageExHeaderType exhType, size_t* exhLen, void** exhBody) const; 455 456 nn::Result SetModuleFilter(const u8* filter, size_t size); 457 458 /*! 459 :private 460 * @brief Message に Module Filter をセットします。 461 * @param[in] filterM Mask の値 462 * @param[in] filterC Condition の値 463 * @param[in] filterR Request の値 464 * @param[in] size サイズ(=Mのサイズ=Cのサイズ=Rのサイズ) 465 * @return nn::Result 466 */ 467 nn::Result SetModuleFilter_MCR(const u8* filterM,const u8* filterC,const u8* filterR, u8 size); 468 u32 GetModuleFilter(void** filter, size_t* size) const; 469 470 /*! 471 * @brief Message に Icon をセットします。 472 473 SetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData) と同じです。 474 475 * @param[in] iconData データ 476 * @param[in] iconSize データ長を指定します。最大長は 8KB です。 477 * @return nn::Result 478 * @retval ResultSuccess 成功しました。 479 * @retval ResultTooLarge データサイズが大きすぎます。 480 * @retval ResultNotAuthorized 既にMessageIdが割り振られて確定されたメッセージを編集しようとしています。 481 * @retval 上記以外 失敗しました。 482 */ SetIcon(void * iconData,size_t iconSize)483 inline nn::Result SetIcon(void* iconData, size_t iconSize) 484 { 485 return SetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); 486 } 487 488 /*! 489 * @brief Message の Icon を取得します。 490 491 GetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData) と同じです。 492 493 * @param[out] iconData データ 494 * @param[out] iconSize データ長 495 * @return nn::Result 496 * @retval ResultSuccess 成功しました。 497 * @retval ResultNoData データがありません。 498 * @retval 上記以外 失敗しました。 499 */ GetIcon(void ** iconData,size_t * iconSize)500 inline nn::Result GetIcon(void** iconData, size_t* iconSize) const 501 { 502 return GetExHeader(MESSAGE_EXHEADER_TYPE_ICON, iconSize, iconData); 503 } 504 505 /*! 506 * @brief Message の説明文をセットします。 507 508 SetExHeader(MESSAGE_EXHEADER_TYPE_INFO, infoTextSize, infoTextData) と同じです。 509 510 * @param[in] infoTextData データ 511 * @param[in] infoTextSize データ長を指定します。最大長は 8KB です。 512 * @return nn::Result 513 * @retval ResultSuccess 成功しました。 514 * @retval ResultTooLarge データサイズが大きすぎます。 515 * @retval ResultNotAuthorized 既にMessageIdが割り振られて確定されたメッセージを編集しようとしています。 516 * @retval 上記以外 失敗しました。 517 */ SetInfoText(wchar_t * infoTextData,size_t infoTextSize)518 inline nn::Result SetInfoText(wchar_t* infoTextData, size_t infoTextSize) 519 { 520 return SetExHeader(MESSAGE_EXHEADER_TYPE_INFO , infoTextSize, infoTextData); 521 } 522 523 /*! 524 * @brief Message の説明文を取得します。 525 526 GetExHeader(MESSAGE_EXHEADER_TYPE_INFO, infoTextSize, infoTextData) と同じです。 527 528 * @param[out] infoTextData データ 529 * @param[out] infoTextSize データ長 530 * @return nn::Result 531 * @retval ResultSuccess 成功しました。 532 * @retval ResultNoData データがありません。 533 * @retval 上記以外 失敗しました。 534 */ GetInfoText(wchar_t ** infoTextData,size_t * infoTextSize)535 inline nn::Result GetInfoText(wchar_t** infoTextData, size_t* infoTextSize) const 536 { 537 return GetExHeader(MESSAGE_EXHEADER_TYPE_INFO , infoTextSize, reinterpret_cast<void**>(infoTextData)); 538 } 539 /*! 540 * @brief Message に データ本文 をセットします。 541 * @param[in] dataBody データ 542 * @param[in] size サイズを指定します。サイズは4の倍数にする必要があります。最大長は 96KB (ヘッダ/拡張ヘッダを含めて 100KB)です。 543 * @return nn::Result 544 * @retval ResultSuccess 成功しました。 545 * @retval ResultInvalidArgument データが無効です。 546 * @retval ResultMisalignedSize データサイズのアライメントが不正です。サイズは4の倍数にする必要があります。 547 * @retval ResultTooLarge データサイズが大きすぎます。 548 * @retval ResultNotAuthorized 既にMessageIdが割り振られて確定されたメッセージを編集しようとしています。 549 * @retval 上記以外 失敗しました。 550 */ 551 nn::Result SetMessageBody(const void* dataBody, size_t size); 552 553 /*! 554 * @brief Message の データ本文を 取得します。 555 * @param[out] dataBody データを格納するバッファを指定 556 * @param[in] size バッファサイズを指定 557 * @return データ本文のサイズ 558 */ 559 u32 GetMessageBody(void* dataBody, size_t size) const; 560 561 /*! 562 * @brief Message の データ本文のポインタを 取得します。 563 * @param[out] pBody データ本文のポインタ 564 * @param[out] size データ本文のサイズが格納されます 565 * @return データ本文のポインタ 566 */ 567 void* GetMessageBodyPointer(void** pBody,size_t* size); 568 569 nn::Result SetMessageBodyPointer(void* p_dataBody, size_t size); 570 571 /* 572 void OpenMessage(); 573 void OpenMessage(u8* messId); 574 */ 575 //@} 576 577 void SetHmacKey(char* hmacKey); 578 579 /*! 580 :private 581 @brief バイナリデータ列を このクラスで扱うことができるようにします。 582 583 主に内部処理用です。通常はこのAPIを使用する必要はありません。 584 585 * @param[in] mess データバイナリ列 586 * @param[out] size データバイナリ列のサイズ 587 @return 588 */ 589 nn::Result InputMessage(const void* mess, size_t size); 590 591 nn::Result InputMessage(const void* mess); 592 593 nn::Result InputMessageHeaderWithEx(const void* mess, size_t size); 594 595 nn::Result InputMessageHeader(const void* mess, size_t size); 596 /*! 597 :private 598 @brief Message データを バイナリデータ列として出力します。 599 ネットワーク/ファイルへの出力を想定しています。 600 601 主に内部処理用です。通常はこのAPIを使用する必要はありません。 602 603 * @param[out] messData データバイナリ列 604 @return 605 */ 606 u32 OutputMessage(void* messData); 607 608 u32 MakeMessageBinary(void* messData) const; 609 void OutputMessageHeader(void* pHeaderBuf) const; 610 611 u32 CheckMessageSize(const void* mess); 612 613 void DumpMessage(); 614 NN_PADDING4; 615 }; 616 617 618 619 } // namespace CTR 620 } // namespace cec 621 } // namespace nn 622 623 624 625 626 627 628 #endif //NN_CEC_CTR_CEC_MESSAGE_H_ 629 630