1 /*
2 transfer.cpp - Kopete Groupwise Protocol
3
4 Copyright (c) 2004 Matt Rogers <mattr@kde.org>
5
6 Based on code copyright (c) 2004 SUSE Linux AG <http://www.suse.com>
7
8 Kopete (c) 2002-2004 by the Kopete developers <kopete-devel@kde.org>
9
10 *************************************************************************
11 * *
12 * This library is free software; you can redistribute it and/or *
13 * modify it under the terms of the GNU Lesser General Public *
14 * License as published by the Free Software Foundation; either *
15 * version 2 of the License, or (at your option) any later version. *
16 * *
17 *************************************************************************
18 */
19
20 #include "transfer.h"
21 #include <ctype.h>
22 #include <kdebug.h>
23
Transfer()24 Transfer::Transfer()
25 {
26 m_isBufferValid = false;
27 }
28
Transfer(Buffer * buf)29 Transfer::Transfer( Buffer* buf )
30 {
31 m_buffer = buf;
32 m_isBufferValid = true;
33 }
34
type() const35 Transfer::TransferType Transfer::type() const
36 {
37 return Transfer::RawTransfer;
38 }
39
toWire()40 QByteArray Transfer::toWire()
41 {
42 m_wireFormat = m_buffer->buffer();
43 return m_wireFormat;
44 }
45
~Transfer()46 Transfer::~Transfer()
47 {
48 delete m_buffer;
49 m_buffer = 0;
50 }
51
setBuffer(Buffer * buffer)52 void Transfer::setBuffer( Buffer* buffer )
53 {
54 m_buffer = buffer;
55 }
56
buffer()57 Buffer* Transfer::buffer()
58 {
59 return m_buffer;
60 }
61
buffer() const62 const Buffer* Transfer::buffer() const
63 {
64 return m_buffer;
65 }
66
dataValid() const67 bool Transfer::dataValid() const
68 {
69 return m_isBufferValid;
70 }
71
toString() const72 QString Transfer::toString() const
73 {
74 // line format:
75 //00 03 00 0b 00 00 90 b8 f5 9f 09 31 31 33 37 38 |;tJ�..........|
76
77 int i = 0;
78 QString output = QStringLiteral("\n");
79 QString hex, ascii;
80
81 QByteArray::ConstIterator it;
82 QByteArray::ConstIterator end = m_wireFormat.end();
83 for ( it = m_wireFormat.begin(); it != end; ++it )
84 {
85 i++;
86
87 unsigned char c = static_cast<unsigned char>(*it);
88
89 if(c < 0x10)
90 hex.append("0");
91 hex.append(QStringLiteral("%1 ").arg(c, 0, 16));
92
93 ascii.append(isprint(c) ? c : '.');
94
95 if (i == 16)
96 {
97 output += hex + " |" + ascii + "|\n";
98 i=0;
99 hex.clear();
100 ascii.clear();
101 }
102 }
103
104 if(!hex.isEmpty())
105 output += hex.leftJustified(48, ' ') + " |" + ascii.leftJustified(16, ' ') + '|';
106 output.append('\n');
107
108 return output;
109 }
110
populateWireBuffer(int offset,const QByteArray & buffer)111 void Transfer::populateWireBuffer( int offset, const QByteArray& buffer )
112 {
113 int j;
114 for ( int i = 0; i < buffer.size(); ++i )
115 {
116 j = i + offset;
117 m_wireFormat[j] = buffer[i];
118 }
119 }
120
FlapTransfer()121 FlapTransfer::FlapTransfer()
122 : Transfer()
123 {
124 m_isFlapValid = false;
125 }
126
FlapTransfer(struct FLAP f,Buffer * buffer)127 FlapTransfer::FlapTransfer( struct FLAP f, Buffer* buffer )
128 : Transfer( buffer )
129 {
130 m_flapChannel = f.channel;
131 m_flapSequence = f.sequence;
132 m_flapLength = f.length;
133
134 if ( m_flapChannel == 0 || m_flapLength < 6 )
135 m_isFlapValid = false;
136 else
137 m_isFlapValid = true;
138
139 }
140
FlapTransfer(Buffer * buffer,Oscar::BYTE chan,Oscar::WORD seq,Oscar::WORD len)141 FlapTransfer::FlapTransfer( Buffer* buffer, Oscar::BYTE chan, Oscar::WORD seq, Oscar::WORD len )
142 : Transfer( buffer )
143 {
144 m_flapChannel = chan;
145 m_flapSequence = seq;
146 m_flapLength = len;
147
148 if ( m_flapChannel == 0 || m_flapLength < 6 )
149 m_isFlapValid = false;
150 else
151 m_isFlapValid = true;
152 }
153
~FlapTransfer()154 FlapTransfer::~FlapTransfer()
155 {
156
157 }
158
toWire()159 QByteArray FlapTransfer::toWire()
160 {
161 //kDebug(OSCAR_RAW_DEBUG) << "Buffer length is " << m_buffer.length();
162 //kDebug(OSCAR_RAW_DEBUG) << "Buffer is " << m_buffer.toString();
163
164 m_wireFormat.truncate( 0 );
165 QByteArray useBuf( m_buffer->buffer() );
166 m_flapLength = useBuf.size();
167 m_wireFormat.resize( 6 + m_flapLength );
168 m_wireFormat[0] = 0x2A;
169 m_wireFormat[1] = m_flapChannel;
170 m_wireFormat[2] = (m_flapSequence & 0xFF00) >> 8;
171 m_wireFormat[3] = (m_flapSequence & 0x00FF);
172 m_wireFormat[4] = (m_flapLength & 0xFF00) >> 8;
173 m_wireFormat[5] = (m_flapLength & 0x00FF);
174
175 //deepcopy the high-level buffer to the wire format buffer
176 populateWireBuffer( 6, useBuf );
177 QByteArray wire = m_wireFormat;
178 return wire;
179 }
180
setFlapChannel(Oscar::BYTE channel)181 void FlapTransfer::setFlapChannel( Oscar::BYTE channel )
182 {
183 if ( channel != 0 )
184 {
185 m_flapChannel = channel;
186 m_isFlapValid = true;
187 }
188 }
189
flapChannel() const190 Oscar::BYTE FlapTransfer::flapChannel() const
191 {
192 return m_flapChannel;
193 }
194
setFlapSequence(Oscar::WORD seq)195 void FlapTransfer::setFlapSequence( Oscar::WORD seq )
196 {
197 m_flapSequence = seq;
198 }
199
flapSequence() const200 Oscar::WORD FlapTransfer::flapSequence() const
201 {
202 return m_flapSequence;
203 }
204
setFlapLength(Oscar::WORD len)205 void FlapTransfer::setFlapLength( Oscar::WORD len )
206 {
207 m_flapLength = len;
208 }
209
flapLength() const210 Oscar::WORD FlapTransfer::flapLength() const
211 {
212 return m_flapLength;
213 }
214
flapValid() const215 bool FlapTransfer::flapValid() const
216 {
217 return m_isFlapValid;
218 }
219
type() const220 Transfer::TransferType FlapTransfer::type() const
221 {
222 return Transfer::FlapTransfer;
223 }
224
SnacTransfer()225 SnacTransfer::SnacTransfer()
226 : FlapTransfer()
227 {
228 m_isSnacValid = false;
229 }
230
SnacTransfer(Buffer * buffer,Oscar::BYTE chan,Oscar::WORD seq,Oscar::WORD len,Oscar::WORD service,Oscar::WORD subtype,Oscar::WORD flags,Oscar::DWORD reqId)231 SnacTransfer::SnacTransfer( Buffer* buffer, Oscar::BYTE chan, Oscar::WORD seq, Oscar::WORD len, Oscar::WORD service,
232 Oscar::WORD subtype, Oscar::WORD flags, Oscar::DWORD reqId )
233 : FlapTransfer( buffer, chan, seq, len )
234 {
235 m_snacService = service;
236 m_snacSubtype = subtype;
237 m_snacFlags = flags;
238 m_snacReqId = reqId;
239
240 if ( m_snacService == 0 || m_snacSubtype == 0 )
241 m_isSnacValid = false;
242 else
243 m_isSnacValid = true;
244
245 }
246
SnacTransfer(struct FLAP f,struct SNAC s,Buffer * buffer)247 SnacTransfer::SnacTransfer( struct FLAP f, struct SNAC s, Buffer* buffer )
248 : FlapTransfer( f, buffer )
249 {
250 m_snacService = s.family;
251 m_snacSubtype = s.subtype;
252 m_snacFlags = s.flags;
253 m_snacReqId = s.id;
254
255 if ( m_snacService == 0 || m_snacSubtype == 0 )
256 m_isSnacValid = false;
257 else
258 m_isSnacValid = true;
259 }
260
~SnacTransfer()261 SnacTransfer::~SnacTransfer()
262 {
263
264 }
265
toWire()266 QByteArray SnacTransfer::toWire()
267 {
268
269 m_wireFormat.truncate( 0 );
270 QByteArray useBuf( m_buffer->buffer() );
271 setFlapLength( useBuf.size() + 10 );
272 m_wireFormat.resize( 16 + useBuf.size() );
273
274 //Transfer the flap - 6 bytes
275 m_wireFormat[0] = 0x2A;
276 m_wireFormat[1] = flapChannel();
277 m_wireFormat[2] = (flapSequence() & 0xFF00) >> 8;
278 m_wireFormat[3] = (flapSequence() & 0x00FF);
279 m_wireFormat[4] = (flapLength() & 0xFF00) >> 8;
280 m_wireFormat[5] = (flapLength() & 0x00FF);
281
282 //Transfer the Snac - 10 bytes
283 m_wireFormat[6] = (m_snacService & 0xFF00) >> 8;
284 m_wireFormat[7] = (m_snacService & 0x00FF);
285 m_wireFormat[8] = (m_snacSubtype & 0xFF00) >> 8;
286 m_wireFormat[9] = (m_snacSubtype & 0x00FF);
287 m_wireFormat[10] = (m_snacFlags & 0xFF00) >> 8;
288 m_wireFormat[11] = (m_snacFlags & 0x00FF);
289 m_wireFormat[12] = (m_snacReqId & 0xFF000000) >> 24;
290 m_wireFormat[13] = (m_snacReqId & 0x00FF0000) >> 16;
291 m_wireFormat[14] = (m_snacReqId & 0x0000FF00) >> 8;
292 m_wireFormat[15] = (m_snacReqId & 0x000000FF);
293
294 //deepcopy the high-level buffer to the wire format buffer
295 populateWireBuffer( 16, useBuf );
296 QByteArray wire = m_wireFormat;
297 return wire;
298 }
299
type() const300 Transfer::TransferType SnacTransfer::type() const
301 {
302 return Transfer::SnacTransfer;
303 }
304
snacValid() const305 bool SnacTransfer::snacValid() const
306 {
307 return m_isSnacValid;
308 }
309
setSnacService(Oscar::WORD service)310 void SnacTransfer::setSnacService( Oscar::WORD service )
311 {
312 m_snacService = service;
313 }
314
snacService() const315 Oscar::WORD SnacTransfer::snacService() const
316 {
317 return m_snacService;
318 }
319
setSnacSubtype(Oscar::WORD subtype)320 void SnacTransfer::setSnacSubtype( Oscar::WORD subtype )
321 {
322 m_snacSubtype = subtype;
323 }
324
snacSubtype() const325 Oscar::WORD SnacTransfer::snacSubtype() const
326 {
327 return m_snacSubtype;
328 }
329
setSnacFlags(Oscar::WORD flags)330 void SnacTransfer::setSnacFlags( Oscar::WORD flags )
331 {
332 m_snacFlags = flags;
333 }
334
snacFlags() const335 Oscar::WORD SnacTransfer::snacFlags() const
336 {
337 return m_snacFlags;
338 }
339
setSnacRequest(Oscar::DWORD id)340 void SnacTransfer::setSnacRequest( Oscar::DWORD id )
341 {
342 m_snacReqId = id;
343 }
344
snacRequest() const345 Oscar::DWORD SnacTransfer::snacRequest() const
346 {
347 return m_snacReqId;
348 }
349
snac() const350 SNAC SnacTransfer::snac() const
351 {
352 SNAC s = { m_snacService, m_snacSubtype, m_snacFlags, m_snacReqId };
353 return s;
354 }
355
356