Copyright update for 2011
[bcusdk.git] / eibd / libserver / tpdu.cpp
blob9752d8d2dbc759b98014101c70b54b5067b66c3f
1 /*
2 EIBD eib bus access and management daemon
3 Copyright (C) 2005-2011 Martin Koegler <mkoegler@auto.tuwien.ac.at>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "tpdu.h"
21 #include "apdu.h"
23 TPDU *
24 TPDU::fromPacket (const CArray & c)
26 TPDU *t = 0;
27 if (c () >= 1)
29 if ((c[0] & 0xfc) == 0)
30 t = new T_DATA_XXX_REQ_PDU ();
31 if (c[0] == 0x80)
32 t = new T_CONNECT_REQ_PDU ();
33 if (c[0] == 0x81)
34 t = new T_DISCONNECT_REQ_PDU ();
35 if ((c[0] & 0xC3) == 0xC2)
36 t = new T_ACK_PDU ();
37 if ((c[0] & 0xC3) == 0xC3)
38 t = new T_NACK_PDU ();
39 if ((c[0] & 0xC0) == 0x40)
40 t = new T_DATA_CONNECTED_REQ_PDU ();
42 if (t && t->init (c))
43 return t;
44 if (t)
45 delete t;
47 t = new T_UNKNOWN_PDU ();
48 t->init (c);
49 return t;
53 /* T_UNKNOWN */
55 T_UNKNOWN_PDU::T_UNKNOWN_PDU ()
59 bool
60 T_UNKNOWN_PDU::init (const CArray & c)
62 pdu = c;
63 return true;
66 CArray T_UNKNOWN_PDU::ToPacket ()
68 return pdu;
71 String T_UNKNOWN_PDU::Decode ()
73 String
74 s ("Unknown TPDU: ");
75 unsigned
78 if (pdu () == 0)
79 return "empty TPDU";
81 for (i = 0; i < pdu (); i++)
82 addHex (s, pdu[i]);
84 return s;
87 /* T_DATA_XXX_REQ */
89 T_DATA_XXX_REQ_PDU::T_DATA_XXX_REQ_PDU ()
93 bool
94 T_DATA_XXX_REQ_PDU::init (const CArray & c)
96 if (c () < 1)
97 return false;
98 data = c;
99 return true;
102 CArray T_DATA_XXX_REQ_PDU::ToPacket ()
104 assert (data () > 0);
105 CArray
106 pdu (data);
107 pdu[0] = (pdu[0] & 0x3);
108 return pdu;
111 String T_DATA_XXX_REQ_PDU::Decode ()
113 APDU *
114 a = APDU::fromPacket (data);
115 String
116 s ("T_DATA_XXX_REQ ");
117 s += a->Decode ();
118 delete
120 return s;
123 /* T_DATA_CONNECTED_REQ */
125 T_DATA_CONNECTED_REQ_PDU::T_DATA_CONNECTED_REQ_PDU ()
127 serno = 0;
130 bool
131 T_DATA_CONNECTED_REQ_PDU::init (const CArray & c)
133 if (c () < 1)
134 return false;
135 data = c;
136 serno = (c[0] >> 2) & 0x0f;
137 return true;
140 CArray T_DATA_CONNECTED_REQ_PDU::ToPacket ()
142 assert (data () > 0);
143 assert ((serno & 0xf0) == 0);
144 CArray
145 pdu (data);
146 pdu[0] = (pdu[0] & 0x3) | 0x40 | ((serno & 0x0f) << 2);
147 return pdu;
150 String T_DATA_CONNECTED_REQ_PDU::Decode ()
152 assert ((serno & 0xf0) == 0);
153 APDU *
154 a = APDU::fromPacket (data);
155 String
156 s ("T_DATA_CONNECTED_REQ serno:");
157 addHex (s, serno);
158 s += a->Decode ();
159 delete
161 return s;
164 /* T_CONNECT_REQ */
166 T_CONNECT_REQ_PDU::T_CONNECT_REQ_PDU ()
170 bool
171 T_CONNECT_REQ_PDU::init (const CArray & c)
173 if (c () != 1)
174 return false;
175 return true;
178 CArray T_CONNECT_REQ_PDU::ToPacket ()
180 uchar
181 c = 0x80;
182 return CArray (&c, 1);
185 String T_CONNECT_REQ_PDU::Decode ()
187 return "T_CONNECT_REQ";
190 /* T_DISCONNECT_REQ */
192 T_DISCONNECT_REQ_PDU::T_DISCONNECT_REQ_PDU ()
196 bool
197 T_DISCONNECT_REQ_PDU::init (const CArray & c)
199 if (c () != 1)
200 return false;
201 return true;
204 CArray T_DISCONNECT_REQ_PDU::ToPacket ()
206 uchar
207 c = 0x81;
208 return CArray (&c, 1);
211 String T_DISCONNECT_REQ_PDU::Decode ()
213 return "T_DISCONNECT_REQ";
216 /* T_ACK */
218 T_ACK_PDU::T_ACK_PDU ()
220 serno = 0;
223 bool
224 T_ACK_PDU::init (const CArray & c)
226 if (c () != 1)
227 return false;
228 serno = (c[0] >> 2) & 0x0f;
229 return true;
232 CArray T_ACK_PDU::ToPacket ()
234 assert ((serno & 0xf0) == 0);
235 uchar
236 c = 0xC2 | ((serno & 0x0f) << 2);
237 return CArray (&c, 1);
240 String T_ACK_PDU::Decode ()
242 assert ((serno & 0xf0) == 0);
243 String
244 s ("T_ACK Serno:");
245 addHex (s, serno);
246 return s;
249 /* T_NACK */
251 T_NACK_PDU::T_NACK_PDU ()
253 serno = 0;
256 bool T_NACK_PDU::init (const CArray & c)
258 if (c () != 1)
259 return false;
260 serno = (c[0] >> 2) & 0x0f;
261 return true;
264 CArray T_NACK_PDU::ToPacket ()
266 assert ((serno & 0xf0) == 0);
267 uchar
268 c = 0xC3 | ((serno & 0x0f) << 2);
269 return CArray (&c, 1);
272 String T_NACK_PDU::Decode ()
274 assert ((serno & 0xf0) == 0);
275 String
276 s ("T_NACK Serno:");
277 addHex (s, serno);
278 return s;