1 /***************************************************************************
2 buffer.cpp - description
6 Copyright (c) 2002 by Tom Linsky <twl6@po.cwru.edu>
7 Copyright (c) 2004,2005 by Matt Rogers <mattr@kde.org>
8 Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org>
10 *************************************************************************
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
17 *************************************************************************
24 #include <kapplication.h>
32 Buffer::Buffer( const Buffer
& other
)
34 mBuffer
= other
.mBuffer
;
35 mReadPos
= other
.mReadPos
;
38 Buffer::Buffer(const char *b
, int len
)
40 mBuffer
= QByteArray::fromRawData( b
, len
);
44 Buffer::Buffer( const QByteArray
& data
)
56 int Buffer::addByte(const BYTE b
)
59 mBuffer
[mBuffer
.size()-1] = b
;
61 return mBuffer
.size();
64 int Buffer::addLEByte(const BYTE b
)
67 mBuffer
[mBuffer
.size()-1] = ((b
) & 0xff);
69 return mBuffer
.size();
73 int Buffer::addWord(const WORD w
)
76 mBuffer
[mBuffer
.size()-2] = ((w
& 0xff00) >> 8);
77 mBuffer
[mBuffer
.size()-1] = (w
& 0x00ff);
79 return mBuffer
.size();
82 int Buffer::addLEWord(const WORD w
)
85 mBuffer
[mBuffer
.size()-2] = (unsigned char) ((w
>> 0) & 0xff);
86 mBuffer
[mBuffer
.size()-1] = (unsigned char) ((w
>> 8) & 0xff);
88 return mBuffer
.size();
92 int Buffer::addDWord(const DWORD dw
)
95 mBuffer
[mBuffer
.size()-4] = (dw
& 0xff000000) >> 24;
96 mBuffer
[mBuffer
.size()-3] = (dw
& 0x00ff0000) >> 16;
97 mBuffer
[mBuffer
.size()-2] = (dw
& 0x0000ff00) >> 8;
98 mBuffer
[mBuffer
.size()-1] = (dw
& 0x000000ff);
100 return mBuffer
.size();
103 int Buffer::addLEDWord(const DWORD dw
)
106 mBuffer
[mBuffer
.size()-4] = (unsigned char) ((dw
>> 0) & 0xff);
107 mBuffer
[mBuffer
.size()-3] = (unsigned char) ((dw
>> 8) & 0xff);
108 mBuffer
[mBuffer
.size()-2] = (unsigned char) ((dw
>> 16) & 0xff);
109 mBuffer
[mBuffer
.size()-1] = (unsigned char) ((dw
>> 24) & 0xff);
111 return mBuffer
.size();
114 int Buffer::addString( const QByteArray
& s
)
117 return mBuffer
.size();
120 int Buffer::addString(QByteArray s
, DWORD len
)
123 return addString( s
);
126 int Buffer::addString( const char* s
, DWORD len
)
128 QByteArray
qba( s
, len
);
129 return addString( qba
);
132 int Buffer::addString(const unsigned char* s
, DWORD len
)
134 QByteArray
qba( (const char*) s
, len
);
135 return addString( qba
);
138 int Buffer::addLEString(const char *s
, const DWORD len
)
140 unsigned int pos
= mBuffer
.size();
142 //concatenate the new string onto the buffer
143 for(unsigned int i
=0; i
<len
; i
++)
145 mBuffer
[pos
+i
]=((s
[i
]) & 0xff);
147 return mBuffer
.size();
153 mBuffer
.truncate( 0 );
157 int Buffer::addTLV( const TLV
& t
)
159 return addTLV( t
.type
, t
.data
);
162 int Buffer::addTLV( WORD type
, const QByteArray
& data
)
165 addWord( data
.length() );
166 return addString( data
);
169 int Buffer::addLETLV( WORD type
, const QByteArray
& data
)
172 addLEWord( data
.length() );
173 return addString( data
);
176 BYTE
Buffer::getByte()
180 if(mReadPos
< mBuffer
.size())
182 thebyte
= mBuffer
[mReadPos
];
186 kDebug(14150) << "Buffer::getByte(): mBuffer empty" << endl
;
191 void Buffer::skipBytes( int bytesToSkip
)
193 if (mReadPos
< mBuffer
.size())
194 mReadPos
+= bytesToSkip
;
197 BYTE
Buffer::getLEByte()
203 WORD
Buffer::getWord()
205 WORD theword
, theword2
, retword
;
207 theword2
= getByte();
208 retword
= (theword
<< 8) | theword2
;
212 WORD
Buffer::getLEWord()
214 WORD theword1
, theword2
, retword
;
215 theword1
= getLEByte();
216 theword2
= getLEByte();
217 retword
= (theword2
<< 8) | theword1
;
221 DWORD
Buffer::getDWord()
227 retdword
= (word1
<< 16) | word2
;
231 DWORD
Buffer::getLEDWord()
233 DWORD word1
, word2
, retdword
;
236 retdword
= (word2
<< 16) | word1
;
240 void Buffer::setBuf(char *b
, const WORD len
)
242 mBuffer
= QByteArray::fromRawData(b
, len
);
246 QByteArray
Buffer::getBlock(DWORD len
)
248 if ( len
> (DWORD
)(mBuffer
.size() - mReadPos
) )
250 kDebug(14150) << "Buffer::getBlock(DWORD): mBuffer underflow!!!" << endl
;
251 len
= mBuffer
.size() - mReadPos
;
257 for ( DWORD i
= 0; i
< len
; i
++ )
265 QByteArray
Buffer::getBBlock(WORD len
)
267 QByteArray data
= QByteArray::fromRawData( mBuffer
.data() + mReadPos
, len
);
273 WORD
*Buffer::getWordBlock(WORD len
)
275 kDebug(14150) << k_funcinfo
<< "of length " << len
<< endl
;
276 WORD
*ch
=new WORD
[len
+1];
277 for (unsigned int i
=0; i
<len
; i
++)
286 QByteArray
Buffer::getLEBlock(WORD len
)
289 for (unsigned int i
=0;i
<len
;i
++)
295 int Buffer::addTLV32(const WORD type
, const DWORD data
)
298 addWord(0x0004); //4 bytes long
299 return addDWord(data
);
302 int Buffer::addLETLV32(const WORD type
, const DWORD data
)
305 addLEWord(0x0004); //4 bytes long
306 return addLEDWord(data
);
309 int Buffer::addTLV16(const WORD type
, const WORD data
)
312 addWord(0x0002); //2 bytes long
313 return addWord(data
);
316 int Buffer::addLETLV16(const WORD type
, const WORD data
)
319 addLEWord(0x0002); //2 bytes long
320 return addLEWord(data
);
323 int Buffer::addTLV8(const WORD type
, const BYTE data
)
326 addWord(0x0001); //1 byte long
327 return addByte(data
);
330 int Buffer::addLETLV8(const WORD type
, const BYTE data
)
333 addLEWord(0x0001); //1 byte long
334 return addLEByte(data
);
340 if(bytesAvailable() >= 4)
343 t
.length
= getWord();
345 t
.data
= getBlock( t
.length
);
347 kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Invalid TLV in buffer" << endl;*/
350 //kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "TLV data is " << t.data << endl;
354 QList
<TLV
> Buffer::getTLVList()
358 while (mReadPos
< mBuffer
.size())
365 kDebug(14150) << k_funcinfo
<< "Invalid TLV found" << endl
;
369 //kDebug(14150) << k_funcinfo << "got TLV(" << t.type << ")" << endl;
376 int Buffer::addChatTLV(const WORD type
, const WORD exchange
,
377 const QString
&roomname
, const WORD instance
)
380 addWord(0x0005 + roomname
.length());
382 addByte(roomname
.length());
383 addString(roomname
.toLatin1()); // TODO: check encoding
385 return addWord(instance
);
388 void Buffer::expandBuffer(unsigned int inc
)
390 mBuffer
.resize(mBuffer
.size()+inc
);
393 QByteArray
Buffer::getLNTS()
395 WORD len
= getWord() - 1;
396 QByteArray
qcs( getBlock(len
) );
401 QByteArray
Buffer::getLELNTS()
403 WORD len
= getLEWord() - 1;
404 QByteArray
qcs( getBlock(len
) );
409 int Buffer::addLNTS(const char *s
)
411 unsigned int len
= strlen(s
);
416 int ret
= addByte(0x00);
420 int Buffer::addLELNTS(const char *s
)
422 unsigned int len
= strlen(s
);
423 int ret
= addLEWord(len
+1);
425 ret
= addLEString(s
, len
);
430 int Buffer::addBSTR(const char * s
)
432 unsigned int len
= strlen(s
);
433 int ret
= addWord(len
);
435 ret
= addString(s
, len
);
439 QByteArray
Buffer::getBSTR()
441 WORD len
= getWord();
442 QByteArray
qba( getBlock(len
) );
446 int Buffer::addBUIN(const char * s
)
448 unsigned int len
= strlen(s
);
449 int ret
= addByte(len
);
450 ret
= addString(s
, len
);
454 QByteArray
Buffer::getBUIN()
456 BYTE len
= getByte();
457 QByteArray
qba( getBlock(len
) );
461 QByteArray
Buffer::buffer() const
466 int Buffer::length() const
468 return mBuffer
.size();
471 int Buffer::bytesAvailable() const
473 return (mBuffer
.size() - mReadPos
);
478 QString
Buffer::toString() const
481 //00 03 00 0b 00 00 90 b8 f5 9f 09 31 31 33 37 38 |;tJ�..........|
484 QString output
= "\n";
487 QByteArray::ConstIterator it
;
488 for ( it
= mBuffer
.begin(); it
!= mBuffer
.end(); ++it
)
492 unsigned char c
= static_cast<unsigned char>(*it
);
496 hex
.append(QString("%1 ").arg(c
, 0, 16));
498 ascii
.append(isprint(c
) ? c
: '.');
502 output
+= hex
+ " |" + ascii
+ "|\n";
510 output
+= hex
.leftJustified(48, ' ') + " |" + ascii
.leftJustified(16, ' ') + '|';
516 QString
Buffer::peekBSTR()
518 int lastPos
= mReadPos
;
519 QByteArray qba
= getBSTR();
521 return QString( qba
);
523 QString
Buffer::peekBUIN()
525 int lastPos
= mReadPos
;
526 QByteArray qba
= getBUIN();
528 return QString( qba
);
532 int Buffer::addGuid( const Guid
& g
)
535 return addString( g
.data() );
536 return mBuffer
.size();
540 Guid
Buffer::getGuid()
542 return Guid(getBBlock(16)); //block or bblock?
545 int Buffer::addLEBlock( const QByteArray
& block
)
547 int ret
= addLEWord( block
.length() );
548 if ( block
.length() > 0 )
549 ret
= addString( block
);
554 QByteArray
Buffer::addLEBlock()
556 DWORD len
= getLEWord();
557 return getBlock( len
);
560 int Buffer::addLEDBlock( const QByteArray
& block
)
562 int ret
= addLEDWord( block
.length() );
563 if ( block
.length() > 0 )
564 ret
= addString( block
);
569 QByteArray
Buffer::getLEDBlock()
571 DWORD len
= getLEDWord();
572 return getBlock( len
);
575 Buffer::operator QByteArray() const
579 //kate: tab-width 4; indent-mode csands;