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