1#include "protocol_ex.h"
2
3#include "config.h"
4#include "uuid_manager.h"
5
6#include <base/system.h>
7
8#include <engine/message.h>
9
10#include <new>
11
12void RegisterUuids(CUuidManager *pManager)
13{
14#define UUID(id, name) pManager->RegisterName(id, name);
15#include "protocol_ex_msgs.h"
16#undef UUID
17}
18
19int UnpackMessageId(int *pId, bool *pSys, CUuid *pUuid, CUnpacker *pUnpacker, CMsgPacker *pPacker)
20{
21 *pId = 0;
22 *pSys = false;
23 mem_zero(block: pUuid, size: sizeof(*pUuid));
24
25 int MsgId = pUnpacker->GetInt();
26
27 if(pUnpacker->Error())
28 {
29 return UNPACKMESSAGE_ERROR;
30 }
31
32 *pId = MsgId >> 1;
33 *pSys = MsgId & 1;
34
35 if(*pId < 0 || *pId >= OFFSET_UUID)
36 {
37 return UNPACKMESSAGE_ERROR;
38 }
39
40 if(*pId != 0) // NETMSG_EX, NETMSGTYPE_EX
41 {
42 return UNPACKMESSAGE_OK;
43 }
44
45 *pId = g_UuidManager.UnpackUuid(pUnpacker, pOut: pUuid);
46
47 if(*pId == UUID_INVALID || *pId == UUID_UNKNOWN)
48 {
49 return UNPACKMESSAGE_ERROR;
50 }
51
52 if(*pSys)
53 {
54 switch(*pId)
55 {
56 case NETMSG_WHATIS:
57 {
58 CUuid Uuid2;
59 int Id2 = g_UuidManager.UnpackUuid(pUnpacker, pOut: &Uuid2);
60 if(Id2 == UUID_INVALID)
61 {
62 break;
63 }
64 if(Id2 == UUID_UNKNOWN)
65 {
66 new(pPacker) CMsgPacker(NETMSG_IDONTKNOW, true);
67 pPacker->AddRaw(pData: &Uuid2, Size: sizeof(Uuid2));
68 }
69 else
70 {
71 new(pPacker) CMsgPacker(NETMSG_ITIS, true);
72 pPacker->AddRaw(pData: &Uuid2, Size: sizeof(Uuid2));
73 pPacker->AddString(pStr: g_UuidManager.GetName(Id: Id2), Limit: 0);
74 }
75 return UNPACKMESSAGE_ANSWER;
76 }
77 case NETMSG_IDONTKNOW:
78 if(g_Config.m_Debug)
79 {
80 CUuid Uuid2;
81 g_UuidManager.UnpackUuid(pUnpacker, pOut: &Uuid2);
82 if(pUnpacker->Error())
83 break;
84 char aBuf[UUID_MAXSTRSIZE];
85 FormatUuid(Uuid: Uuid2, pBuffer: aBuf, BufferLength: sizeof(aBuf));
86 dbg_msg(sys: "uuid", fmt: "peer: unknown %s", aBuf);
87 }
88 break;
89 case NETMSG_ITIS:
90 if(g_Config.m_Debug)
91 {
92 CUuid Uuid2;
93 g_UuidManager.UnpackUuid(pUnpacker, pOut: &Uuid2);
94 const char *pName = pUnpacker->GetString(SanitizeType: CUnpacker::SANITIZE_CC);
95 if(pUnpacker->Error())
96 break;
97 char aBuf[UUID_MAXSTRSIZE];
98 FormatUuid(Uuid: Uuid2, pBuffer: aBuf, BufferLength: sizeof(aBuf));
99 dbg_msg(sys: "uuid", fmt: "peer: %s %s", aBuf, pName);
100 }
101 break;
102 }
103 }
104 return UNPACKMESSAGE_OK;
105}
106