1+ #include < libkiwi.h>
2+
3+ namespace kiwi {
4+ namespace ap {
5+
6+ /* *
7+ * @brief Constructor
8+ *
9+ * @param pParser Message parser
10+ * @param port Local port
11+ */
12+ Server::Server (IMessageParser* pParser, u16 port)
13+ : mpSocket(nullptr ), mpConnection(nullptr ), mpParser(pParser) {
14+
15+ K_ASSERT_PTR (mpParser);
16+
17+ mpSocket = new kiwi::SyncSocket (SO_PF_INET , SO_SOCK_DGRAM );
18+ K_ASSERT_PTR (mpSocket);
19+ mpSocket->SetBlocking (false );
20+
21+ // Variable packets only enforce an upper size bound
22+ kiwi::IPacketFactory* pPacketFactory =
23+ new kiwi::VariablePacketFactory<MAX_PACKET_SIZE >();
24+ K_ASSERT_PTR (pPacketFactory);
25+
26+ mpConnection = new kiwi::NetServer (mpSocket, pPacketFactory);
27+ K_ASSERT_PTR (mpConnection);
28+
29+ // Bind to any available local address
30+ kiwi::SockAddr4 addr (port);
31+ bool success = mpConnection->Bind (addr);
32+ ASSERT_EX (success, " Can't bind server socket on port %d" , addr.port );
33+
34+ mpConnection->SetRecvCallback (PacketCallback, this );
35+
36+ // Show IP address in the console
37+ u16 portSave = addr.port ;
38+ mpSocket->GetHostAddr (addr);
39+ addr.port = portSave;
40+ K_LOG_EX (" Server listening on: %s\n " , kiwi::ToString (addr).CStr ());
41+ }
42+
43+ /* *
44+ * @brief Destructor
45+ */
46+ Server::~Server () {
47+ delete mpConnection;
48+ mpConnection = nullptr ;
49+
50+ delete mpSocket;
51+ mpSocket = nullptr ;
52+
53+ delete mpParser;
54+ mpParser = nullptr ;
55+ }
56+
57+ /* *
58+ * @brief Packet receive callback
59+ *
60+ * @param pPacket Incoming packet
61+ * @param pArg Callback user argument
62+ */
63+ void Server::PacketCallback (kiwi::PacketBase* pPacket, void * pArg) {
64+ K_ASSERT_PTR (pPacket);
65+ K_ASSERT_PTR (pArg);
66+
67+ // Callback argument is this object
68+ Server* p = static_cast <Server*>(pArg);
69+ K_ASSERT_PTR (p->mpParser );
70+
71+ IMessage* pMessage =
72+ p->mpParser ->Parse (pPacket->GetContent (), pPacket->GetContentSize ());
73+
74+ if (pMessage == nullptr ) {
75+ return ;
76+ }
77+
78+ // Notify listeners
79+ K_FOREACH (it, p->mListenerList ) {
80+ K_ASSERT_PTR (*it);
81+ (*it)->OnMessage (pMessage, p->mpConnection );
82+ }
83+
84+ // Release message memory
85+ delete pMessage;
86+ }
87+
88+ } // namespace ap
89+ } // namespace kiwi
0 commit comments