]> git.vomp.tv Git - vompclient.git/blob - vdrresponsepacket.cc
Preparations for dynamic mode switching
[vompclient.git] / vdrresponsepacket.cc
1 /*\r
2     Copyright 2007 Chris Tallon\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
19 */\r
20 \r
21 #include "vdrresponsepacket.h"\r
22 \r
23 #include "vdr.h"\r
24 #include "tcp.h"\r
25 \r
26 VDR_ResponsePacket::VDR_ResponsePacket()\r
27 {\r
28   userDataLength = 0;\r
29   packetPos = 0;\r
30   userData = NULL;\r
31   ownBlock = true;\r
32   \r
33   channelID = 0;\r
34   \r
35   requestID = 0;\r
36   streamID = 0;\r
37   \r
38   flag = 0;\r
39 }\r
40 \r
41 VDR_ResponsePacket::~VDR_ResponsePacket()\r
42 {\r
43   if (!ownBlock) return; // don't free if it's a getblock\r
44   \r
45   if (userData) free(userData);\r
46 }\r
47 \r
48 void VDR_ResponsePacket::setResponse(ULONG trequestID, UCHAR* tuserData, ULONG tuserDataLength)\r
49 {\r
50   channelID = VDR::CHANNEL_REQUEST_RESPONSE;\r
51   requestID = trequestID;\r
52   userData = tuserData;\r
53   userDataLength = tuserDataLength;\r
54 }\r
55 \r
56 void VDR_ResponsePacket::setStream(ULONG tstreamID, ULONG tflag, UCHAR* tuserData, ULONG tuserDataLength)\r
57 {\r
58   channelID = VDR::CHANNEL_STREAM;\r
59   streamID = tstreamID;\r
60   flag = tflag;\r
61   userData = tuserData;\r
62   userDataLength = tuserDataLength;\r
63 }\r
64 \r
65 bool VDR_ResponsePacket::end()\r
66 {\r
67   return (packetPos >= userDataLength);\r
68 }\r
69 \r
70 void VDR_ResponsePacket::dumpUD()\r
71 {\r
72   TCP::dump(userData, userDataLength);\r
73 }\r
74 \r
75 int VDR_ResponsePacket::serverError()\r
76 {\r
77   if ((packetPos == 0) && (userDataLength == 4) && !ntohl(*(ULONG*)userData)) return 1;\r
78   else return 0;\r
79 }\r
80 \r
81 char* VDR_ResponsePacket::extractString()\r
82 {\r
83   if (serverError()) return NULL;\r
84 \r
85   int length = strlen((char*)&userData[packetPos]);\r
86   if ((packetPos + length) > userDataLength) return NULL;\r
87   char* str = new char[length + 1];\r
88   strcpy(str, (char*)&userData[packetPos]);\r
89   packetPos += length + 1;\r
90   return str;\r
91 }\r
92 \r
93 UCHAR VDR_ResponsePacket::extractUCHAR()\r
94 {\r
95   if ((packetPos + sizeof(UCHAR)) > userDataLength) return 0;\r
96   UCHAR uc = userData[packetPos];\r
97   packetPos += sizeof(UCHAR);\r
98   return uc;\r
99 }\r
100 \r
101 ULONG VDR_ResponsePacket::extractULONG()\r
102 {\r
103   if ((packetPos + sizeof(ULONG)) > userDataLength) return 0;\r
104   ULONG ul = userData[packetPos++]<<24;\r
105   ul|= userData[packetPos++]<<16;\r
106   ul|= userData[packetPos++]<<8;\r
107   ul|= userData[packetPos++];\r
108   //packetPos += sizeof(ULONG);\r
109   return ul;\r
110 }\r
111 \r
112 ULLONG VDR_ResponsePacket::extractULLONG()\r
113 {\r
114   if ((packetPos + sizeof(ULLONG)) > userDataLength) return 0;\r
115   ULLONG ull= ((ULLONG)userData[packetPos++])<<56;\r
116   ull|= ((ULLONG)userData[packetPos++])<<48;\r
117   ull|= ((ULLONG)userData[packetPos++])<<40;\r
118   ull|= ((ULLONG)userData[packetPos++])<<32;\r
119   ull|= ((ULLONG)userData[packetPos++])<<24;\r
120   ull|= ((ULLONG)userData[packetPos++])<<16;\r
121   ull|= ((ULLONG)userData[packetPos++])<<8;\r
122   ull|= ((ULLONG)userData[packetPos++]);\r
123   return ull;\r
124 }\r
125 \r
126 double VDR_ResponsePacket::extractdouble()\r
127 {\r
128   if ((packetPos + sizeof(ULLONG)) > userDataLength) return 0;\r
129   ULLONG ull = extractULLONG();\r
130   double d;\r
131   memcpy(&d,&ull,sizeof(double));\r
132   return d;\r
133 }\r
134 \r
135 long VDR_ResponsePacket::extractLONG()\r
136 {\r
137   if ((packetPos + sizeof(long)) > userDataLength) return 0;\r
138   long l = userData[packetPos++]<<24;\r
139   l|= userData[packetPos++]<<16;\r
140   l|= userData[packetPos++]<<8;\r
141   l|= userData[packetPos++];\r
142   return l;\r
143 }\r
144 \r
145 UCHAR* VDR_ResponsePacket::getUserData()\r
146 {\r
147   ownBlock = false;\r
148   return userData;\r
149 }\r
150 \r