]> git.vomp.tv Git - vompclient.git/blob - udp.cc
Fix segfault in boxstack.cc
[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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "udp.h"
22
23 #include "dsock.h"
24 #include "messagequeue.h"
25 #include "message.h"
26 #include "log.h"
27
28 //void dump(unsigned char* data, USHORT size);
29 //unsigned char dcc(UCHAR c);
30
31 UDP::UDP()
32 {
33   log = Log::getInstance();
34   initted = 0;
35 }
36
37 UDP::~UDP()
38 {
39   shutdown();
40 }
41
42 int UDP::shutdown()
43 {
44   if (!initted) return 1;
45   if (threadIsActive()) threadCancel();
46   ds->shutdown();
47
48   initted = 0;
49   return 1;
50 }
51
52 int UDP::run(MessageQueue* tcommandMessageQueue)
53 {
54   if (threadIsActive()) return 1;
55   log->log("UDP", Log::DEBUG, "Starting UDP command server");
56
57   initted = 1;
58
59   commandMessageQueue = tcommandMessageQueue;
60   ds = new DatagramSocket(2000);
61
62   if (!ds->init())
63   {
64     log->log("UDP", Log::DEBUG, "DSock init error");
65     shutdown();
66     return 0;
67   }
68
69   if (!threadStart())
70   {
71     log->log("UDP", Log::DEBUG, "Thread start error");
72     shutdown();
73     return 0;
74   }
75
76   log->log("UDP", Log::DEBUG, "UDP command server started");
77   return 1;
78 }
79
80 void UDP::threadMethod()
81 {
82   threadSetKillable();
83
84   int retval;
85   while(1)
86   {
87     retval = ds->waitforMessage(1);
88
89     if (retval == 0)
90     {
91       log->log("UDP", Log::CRIT, "Wait for packet error");
92       return;
93     }
94     else if (retval == 1)
95     {
96       threadCheckExit();
97       continue;
98     }
99     else
100     {
101       processRequest((UCHAR*)ds->getData(), ds->getDataLength());
102     }
103     threadCheckExit();
104   }
105 }
106
107 void UDP::processRequest(UCHAR* data, int length)
108 {
109   log->log("UDP", Log::DEBUG, "Got request");
110
111   char* temp = new char[length + 1];
112   memcpy(temp, data, length);
113   temp[length] = '\0';
114   int command = atoi(temp);
115   delete[] temp;
116
117   log->log("UDP", Log::DEBUG, "Command %i recieved", command);
118
119
120   Message *m = new Message();
121   m->to = commandMessageQueue;
122   m->message = Message::UDP_BUTTON;
123   m->parameter = command;
124   commandMessageQueue->postMessage(m);
125 }
126
127 /*
128 void dump(unsigned char* data, USHORT size)
129 {
130   printf("Size = %u\n", size);
131
132   USHORT c = 0;
133   while(c < size)
134   {
135     if ((size - c) > 15)
136     {
137       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",
138         data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
139         data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14], data[c+15],
140         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]),
141         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]));
142       c += 16;
143     }
144     else
145     {
146       switch (size - c)
147       {
148         case 15:
149           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",
150             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
151             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14],
152             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]),
153             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]));
154           c += 15;
155           break;
156         case 14:
157           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",
158             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
159             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13],
160             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]),
161             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]));
162           c += 14;
163           break;
164         case 13:
165           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",
166             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
167             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12],
168             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]),
169             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]));
170           c += 13;
171           break;
172         case 12:
173           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",
174             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
175             data[c+8], data[c+9], data[c+10], data[c+11],
176             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]),
177             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]));
178           c += 12;
179           break;
180         case 11:
181           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X                  %c%c%c%c%c%c%c%c%c%c%c\n",
182             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
183             data[c+8], data[c+9], data[c+10],
184             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]),
185             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]));
186           c += 11;
187           break;
188         case 10:
189           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X                     %c%c%c%c%c%c%c%c%c%c\n",
190             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
191             data[c+8], data[c+9],
192             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]),
193             dcc(data[c+8]), dcc(data[c+9]));
194           c += 10;
195           break;
196         case 9:
197           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X                        %c%c%c%c%c%c%c%c%c\n",
198             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
199             data[c+8],
200             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]),
201             dcc(data[c+8]));
202           c += 9;
203           break;
204         case 8:
205           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X                            %c%c%c%c%c%c%c%c\n",
206             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
207             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]));
208           c += 8;
209           break;
210         case 7:
211           printf(" %02X %02X %02X %02X  %02X %02X %02X                               %c%c%c%c%c%c%c\n",
212             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6],
213             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]));
214           c += 7;
215           break;
216         case 6:
217           printf(" %02X %02X %02X %02X  %02X %02X                                  %c%c%c%c%c%c\n",
218             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5],
219             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]));
220           c += 6;
221           break;
222         case 5:
223           printf(" %02X %02X %02X %02X  %02X                                     %c%c%c%c%c\n",
224             data[c], data[c+1], data[c+2], data[c+3], data[c+4],
225             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]));
226           c += 5;
227           break;
228         case 4:
229           printf(" %02X %02X %02X %02X                                         %c%c%c%c\n",
230             data[c], data[c+1], data[c+2], data[c+3],
231             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]));
232           c += 4;
233           break;
234         case 3:
235           printf(" %02X %02X %02X                                            %c%c%c\n",
236             data[c], data[c+1], data[c+2],
237             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]));
238           c += 3;
239           break;
240         case 2:
241           printf(" %02X %02X                                               %c%c\n",
242             data[c], data[c+1],
243             dcc(data[c]), dcc(data[c+1]));
244           c += 2;
245           break;
246         case 1:
247           printf(" %02X                                                  %c\n",
248             data[c],
249             dcc(data[c]));
250           c += 1;
251           break;
252       }
253     }
254   }
255 }
256
257 unsigned char dcc(UCHAR c)
258 {
259   if (isspace(c)) return ' ';
260   if (isprint(c)) return c;
261   return '.';
262 }
263 */