summaryrefslogtreecommitdiffstats
path: root/kopete/protocols/groupwise/libgroupwise/eventprotocol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kopete/protocols/groupwise/libgroupwise/eventprotocol.cpp')
-rw-r--r--kopete/protocols/groupwise/libgroupwise/eventprotocol.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/kopete/protocols/groupwise/libgroupwise/eventprotocol.cpp b/kopete/protocols/groupwise/libgroupwise/eventprotocol.cpp
new file mode 100644
index 00000000..05320676
--- /dev/null
+++ b/kopete/protocols/groupwise/libgroupwise/eventprotocol.cpp
@@ -0,0 +1,216 @@
+/*
+ Kopete Groupwise Protocol
+ eventprotocol.cpp - reads the protocol used by GroupWise for signalling Events
+
+ Copyright (c) 2004 SUSE Linux AG http://www.suse.com
+
+ Kopete (c) 2002-2004 by the Kopete developers <[email protected]>
+
+ *************************************************************************
+ * *
+ * 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 <qbuffer.h>
+
+#include "gwerror.h"
+
+#include "eventtransfer.h"
+#include "eventprotocol.h"
+
+using namespace GroupWise;
+
+EventProtocol::EventProtocol(QObject *parent, const char *name)
+ : InputProtocolBase(parent, name)
+{
+}
+
+EventProtocol::~EventProtocol()
+{
+}
+
+Transfer * EventProtocol::parse( const QByteArray & wire, uint& bytes )
+{
+ m_bytes = 0;
+ //m_din = new QDataStream( wire, IO_ReadOnly );
+ QBuffer inBuf( wire );
+ inBuf.open( IO_ReadOnly);
+ m_din.setDevice( &inBuf );
+ m_din.setByteOrder( QDataStream::LittleEndian );
+ Q_UINT32 type;
+
+ if ( !okToProceed() )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ // read the event type
+ m_din >> type;
+ m_bytes += sizeof( Q_UINT32 );
+
+ debug( QString( "EventProtocol::parse() Reading event of type %1" ).arg( type ) );
+ if ( type > Stop )
+ {
+ debug( QString ( "EventProtocol::parse() - found unexpected event type %1 - assuming out of sync" ).arg( type ) );
+ m_state = OutOfSync;
+ return 0;
+ }
+
+ // read the event source
+ QString source;
+ if ( !readString( source ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+
+ // now create an event object
+ //HACK: lowercased DN
+ EventTransfer * tentative = new EventTransfer( type, source.lower(), QDateTime::currentDateTime() );
+
+ // add any additional data depending on the type of event
+ // Note: if there are any errors in the way the data is read below, we will soon be OutOfSync
+ QString statusText;
+ QString guid;
+ Q_UINT16 status;
+ Q_UINT32 flags;
+ QString message;
+
+ switch ( type )
+ {
+ case StatusChange: //103 - STATUS + STATUSTEXT
+ if ( !okToProceed() )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ m_din >> status;
+ m_bytes += sizeof( Q_UINT16 );
+ if ( !readString( statusText ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ debug( QString( "got status: %1").arg( status ) );
+ tentative->setStatus( status );
+ debug( QString( "tentative status: %1").arg( tentative->status() ) );
+ tentative->setStatusText( statusText );
+ break;
+ case ConferenceJoined: // 106 - GUID + FLAGS
+ case ConferenceLeft: // 107
+ if ( !readString( guid ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setGuid( guid );
+ if ( !readFlags( flags ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setFlags( flags );
+ break;
+ case UndeliverableStatus: //102 - GUID
+ case ConferenceClosed: //105
+ case ConferenceInviteNotify://118
+ case ConferenceReject: //119
+ case UserTyping: //112
+ case UserNotTyping: //113
+ if ( !readString( guid ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setGuid( guid );
+ break;
+ case ReceiveAutoReply: //121 - GUID + FLAGS + MESSAGE
+ case ReceiveMessage: //108
+ // guid
+ if ( !readString( guid ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setGuid( guid );
+ // flags
+ if ( !readFlags( flags ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setFlags( flags );
+ // message
+ if ( !readString( message ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setMessage( message );
+ break;
+ case ConferenceInvite: //117 GUID + MESSAGE
+ // guid
+ if ( !readString( guid ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setGuid( guid );
+ // message
+ if ( !readString( message ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setMessage( message );
+ break;
+ case UserDisconnect: //114 (NOTHING)
+ case ServerDisconnect: //115
+ // nothing else to read
+ break;
+ case InvalidRecipient: //101
+ case ContactAdd: //104
+ case ReceiveFile: //109
+ case ConferenceRename: //116
+ // unhandled because unhandled in Gaim
+ break;
+ /* GW7 */
+ case ReceivedBroadcast: //122
+ case ReceivedSystemBroadcast: //123
+ // message
+ if ( !readString( message ) )
+ {
+ m_din.unsetDevice();
+ return 0;
+ }
+ tentative->setMessage( message );
+ break;
+ default:
+ debug( QString( "EventProtocol::parse() - found unexpected event type %1" ).arg( type ) );
+ break;
+ }
+ // if we got this far, the parse succeeded, return the Transfer
+ m_state = Success;
+ //delete m_din;
+ bytes = m_bytes;
+ m_din.unsetDevice();
+ return tentative;
+}
+
+bool EventProtocol::readFlags( Q_UINT32 &flags)
+{
+ if ( okToProceed() )
+ {
+ m_din >> flags;
+ m_bytes += sizeof( Q_UINT32 );
+ return true;
+ }
+ return false;
+}
+
+#include "eventprotocol.moc"