You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetwork/kopete/protocols/oscar/liboscar/oscarmessage.cpp

302 lines
6.4 KiB

/*
Kopete Oscar Protocol
oscarmessage.cpp - Oscar Message Object
Copyright (c) 2005 Matt Rogers <mattr@kde.org>
Copyright (c) 2005 Conrad Hoffmann <conrausch@gmx.de>
Kopete (c) 2002-2005 by the Kopete developers <kopete-devel@kde.org>
*************************************************************************
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
*************************************************************************
*/
#include "oscarmessage.h"
#include <qdeepcopy.h>
#include <qtextcodec.h>
Oscar::Message::Message()
: m_channel( -1 ),
m_properties( -1 ),
m_messageType( 0 ),
m_protocolVersion( 0 ),
m_channel2Counter( 0 ),
m_encoding( UserDefined )
{
}
Oscar::Message::Message( Encoding messageEncoding, const QByteArray& messageText, int channel, int properties, QDateTime timestamp )
: m_channel( channel ),
m_properties( properties ),
m_messageType( 0 ),
m_protocolVersion( 0 ),
m_channel2Counter( 0 ),
m_textArray( messageText ),
m_timestamp( timestamp ),
m_encoding( messageEncoding )
{
}
Oscar::Message::Message( Encoding messageEncoding, const QCString& messageText, int channel, int properties, QDateTime timestamp )
: m_channel( channel ),
m_properties( properties ),
m_messageType( 0 ),
m_protocolVersion( 0 ),
m_channel2Counter( 0 ),
m_timestamp( timestamp ),
m_encoding( messageEncoding )
{
setTextArray( messageText );
}
Oscar::Message::Message( Encoding messageEncoding, const QString& messageText, int channel, int properties, QDateTime timestamp, QTextCodec* codec )
: m_channel( channel ),
m_properties( properties ),
m_messageType( 0 ),
m_protocolVersion( 0 ),
m_channel2Counter( 0 ),
m_timestamp( timestamp )
{
setText( messageEncoding, messageText, codec );
}
QString Oscar::Message::sender() const
{
return m_sender;
}
void Oscar::Message::setSender( const QString& sender )
{
m_sender = sender;
}
QString Oscar::Message::receiver() const
{
return m_receiver;
}
void Oscar::Message::setReceiver( const QString& receiver )
{
m_receiver = receiver;
}
QByteArray Oscar::Message::textArray() const
{
return m_textArray;
}
QString Oscar::Message::text( QTextCodec *codec ) const
{
switch ( m_encoding )
{
case Oscar::Message::UserDefined:
return codec->toUnicode( m_textArray );
case Oscar::Message::UTF8:
return QString::fromUtf8( m_textArray.data(), m_textArray.size() );
case Oscar::Message::UCS2:
{
uint len = m_textArray.size() / 2;
QString result;
result.setLength( len );
QByteArray::ConstIterator p = m_textArray.begin();
for ( uint i = 0; i < len; i++)
{
char row = *p++;
char cell = *p++;
result[i] = QChar( cell, row );
}
//check if last character isn't null
if ( result[len-1].isNull() )
result.setLength( len - 1 );
return result;
}
default:
break; // Should never happen.
}
return QString::null;
//FIXME: warn at least with kdWarning if an unrecognised encoding style was seen.
}
void Oscar::Message::setText( Oscar::Message::Encoding newEncoding, const QString& newText, QTextCodec* codec )
{
uint len;
switch ( newEncoding )
{
case Oscar::Message::UserDefined:
// Oscar::Message::setTextArray( const QCString& )
// strips trailing null byte automatically.
setTextArray( codec->fromUnicode( newText ) );
break;
case Oscar::Message::UTF8:
// Oscar::Message::setTextArray( const QCString& )
// strips trailing null byte automatically.
setTextArray( newText.utf8() );
break;
case Oscar::Message::UCS2:
{
len = newText.length();
m_textArray.resize( len * 2 );
QByteArray::Iterator p = m_textArray.begin();
for ( uint i = 0; i < len; i++)
{
*p++ = newText[i].row();
*p++ = newText[i].cell();
}
break;
}
default:
break; // Should never happen.
}
m_encoding = newEncoding;
}
void Oscar::Message::setTextArray( const QByteArray& newTextArray )
{
m_textArray.duplicate( newTextArray );
}
void Oscar::Message::setTextArray( const QCString& newTextArray )
{
m_textArray.duplicate( newTextArray );
uint len = m_textArray.size();
if ( len > 0 )
{
--len;
if ( m_textArray[len] == '\0' )
{
// Strip trailing null byte.
m_textArray.resize( len );
}
}
}
int Oscar::Message::properties() const
{
return m_properties;
}
void Oscar::Message::addProperty( int prop )
{
if ( m_properties == -1 )
m_properties = 0;
m_properties = m_properties | prop;
}
bool Oscar::Message::hasProperty( int prop ) const
{
if ( m_properties == -1 )
return false;
if ( ( m_properties & prop ) == 0 )
return false;
else
return true;
}
int Oscar::Message::type() const
{
return m_channel;
}
void Oscar::Message::setType( int newType )
{
m_channel = newType;
}
QDateTime Oscar::Message::timestamp() const
{
return m_timestamp;
}
void Oscar::Message::setTimestamp( QDateTime ts )
{
m_timestamp = ts;
}
QByteArray Oscar::Message::icbmCookie() const
{
return m_icbmCookie;
}
void Oscar::Message::setIcbmCookie( const QByteArray& cookie )
{
m_icbmCookie.duplicate( cookie );
}
int Oscar::Message::protocolVersion() const
{
return m_protocolVersion;
}
void Oscar::Message::setProtocolVersion( int version )
{
m_protocolVersion = version;
}
int Oscar::Message::channel2Counter() const
{
return m_channel2Counter;
}
void Oscar::Message::setChannel2Counter( int value )
{
m_channel2Counter = value;
}
int Oscar::Message::messageType() const
{
return m_messageType;
}
void Oscar::Message::setMessageType( int type )
{
m_messageType = type;
}
Oscar::WORD Oscar::Message::exchange() const
{
return m_exchange;
}
void Oscar::Message::setExchange( Oscar::WORD exchange )
{
m_exchange = exchange;
}
QString Oscar::Message::chatRoom() const
{
return m_chatRoom;
}
void Oscar::Message::setChatRoom( const QString& room )
{
m_chatRoom = room;
}
Oscar::Message::Encoding Oscar::Message::encoding() const
{
return m_encoding;
}
void Oscar::Message::setEncoding( Oscar::Message::Encoding newEncoding )
{
m_encoding = newEncoding;
}
Oscar::Message::operator bool() const
{
return m_channel != -1 && m_properties != -1;
}
//kate: indent-mode csands; auto-insert-doxygen on; tab-width 4;