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