]> git.vomp.tv Git - vompclient.git/blob - udp.cc
Windows udp server fix
[vompclient.git] / udp.cc
1 /*
2     Copyright 2006 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "udp.h"
22
23 //void dump(unsigned char* data, USHORT size);
24 //unsigned char dcc(UCHAR c);
25
26 UDP::UDP()
27 {
28   log = Log::getInstance();
29   initted = 0;
30 }
31
32 UDP::~UDP()
33 {
34   shutdown();
35 }
36
37 int UDP::shutdown()
38 {
39   if (!initted) return 1;
40   if (threadIsActive()) threadCancel();
41   ds->shutdown();
42
43   initted = 0;
44   return 1;
45 }
46
47 int UDP::run(MessageQueue* tcommandMessageQueue)
48 {
49   if (threadIsActive()) return 1;
50   log->log("UDP", Log::DEBUG, "Starting UDP command server");
51
52   initted = 1;
53
54   commandMessageQueue = tcommandMessageQueue;
55   ds = new DatagramSocket(2000);
56
57   if (!ds->init())
58   {
59     log->log("UDP", Log::DEBUG, "DSock init error");
60     shutdown();
61     return 0;
62   }
63
64   if (!threadStart())
65   {
66     log->log("UDP", Log::DEBUG, "Thread start error");
67     shutdown();
68     return 0;
69   }
70
71   log->log("UDP", Log::DEBUG, "UDP command server started");
72   return 1;
73 }
74
75 void UDP::threadMethod()
76 {
77   int retval;
78   while(1)
79   {
80     #ifndef WIN32
81     retval = ds->waitforMessage(0);
82     #else
83     threadCheckExit();
84     retval = ds->waitforMessage(1);
85     #endif
86
87     if (retval == 0)
88     {
89       log->log("UDP", Log::CRIT, "Wait for packet error");
90       return;
91     }
92     else if (retval == 1)
93     {
94       continue;
95     }
96     else
97     {
98       processRequest((UCHAR*)ds->getData(), ds->getDataLength());
99     }
100   }
101 }
102
103 void UDP::processRequest(UCHAR* data, int length)
104 {
105   log->log("UDP", Log::DEBUG, "Got request");
106
107   char* temp = new char[length + 1];
108   memcpy(temp, data, length);
109   temp[length] = '\0';
110   int command = atoi(temp);
111   delete[] temp;
112
113   log->log("UDP", Log::DEBUG, "Command %i recieved", command);
114
115
116   Message *m = new Message();
117   m->to = commandMessageQueue;
118   m->message = Message::UDP_BUTTON;
119   m->parameter = command;
120   commandMessageQueue->postMessage(m);
121 }
122
123 /*
124 void dump(unsigned char* data, USHORT size)
125 {
126   printf("Size = %u\n", size);
127
128   USHORT c = 0;
129   while(c < size)
130   {
131     if ((size - c) > 15)
132     {
133       printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
134         data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
135         data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14], data[c+15],
136         dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
137         dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]), dcc(data[c+14]), dcc(data[c+15]));
138       c += 16;
139     }
140     else
141     {
142       switch (size - c)
143       {
144         case 15:
145           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X     %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
146             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
147             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14],
148             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
149             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]), dcc(data[c+14]));
150           c += 15;
151           break;
152         case 14:
153           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X        %c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
154             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
155             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13],
156             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
157             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]));
158           c += 14;
159           break;
160         case 13:
161           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X           %c%c%c%c%c%c%c%c%c%c%c%c%c\n",
162             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
163             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12],
164             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
165             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]));
166           c += 13;
167           break;
168         case 12:
169           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X               %c%c%c%c%c%c%c%c%c%c%c%c\n",
170             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
171             data[c+8], data[c+9], data[c+10], data[c+11],
172             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
173             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]));
174           c += 12;
175           break;
176         case 11:
177           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X                  %c%c%c%c%c%c%c%c%c%c%c\n",
178             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
179             data[c+8], data[c+9], data[c+10],
180             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
181             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]));
182           c += 11;
183           break;
184         case 10:
185           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X                     %c%c%c%c%c%c%c%c%c%c\n",
186             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
187             data[c+8], data[c+9],
188             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
189             dcc(data[c+8]), dcc(data[c+9]));
190           c += 10;
191           break;
192         case 9:
193           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X                        %c%c%c%c%c%c%c%c%c\n",
194             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
195             data[c+8],
196             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
197             dcc(data[c+8]));
198           c += 9;
199           break;
200         case 8:
201           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X                            %c%c%c%c%c%c%c%c\n",
202             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
203             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]));
204           c += 8;
205           break;
206         case 7:
207           printf(" %02X %02X %02X %02X  %02X %02X %02X                               %c%c%c%c%c%c%c\n",
208             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6],
209             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]));
210           c += 7;
211           break;
212         case 6:
213           printf(" %02X %02X %02X %02X  %02X %02X                                  %c%c%c%c%c%c\n",
214             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5],
215             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]));
216           c += 6;
217           break;
218         case 5:
219           printf(" %02X %02X %02X %02X  %02X                                     %c%c%c%c%c\n",
220             data[c], data[c+1], data[c+2], data[c+3], data[c+4],
221             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]));
222           c += 5;
223           break;
224         case 4:
225           printf(" %02X %02X %02X %02X                                         %c%c%c%c\n",
226             data[c], data[c+1], data[c+2], data[c+3],
227             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]));
228           c += 4;
229           break;
230         case 3:
231           printf(" %02X %02X %02X                                            %c%c%c\n",
232             data[c], data[c+1], data[c+2],
233             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]));
234           c += 3;
235           break;
236         case 2:
237           printf(" %02X %02X                                               %c%c\n",
238             data[c], data[c+1],
239             dcc(data[c]), dcc(data[c+1]));
240           c += 2;
241           break;
242         case 1:
243           printf(" %02X                                                  %c\n",
244             data[c],
245             dcc(data[c]));
246           c += 1;
247           break;
248       }
249     }
250   }
251 }
252
253 unsigned char dcc(UCHAR c)
254 {
255   if (isspace(c)) return ' ';
256   if (isprint(c)) return c;
257   return '.';
258 }
259 */