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/groupwise/libgroupwise/tasks/conferencetask.cpp

231 lines
8.1 KiB

/*
Kopete Groupwise Protocol
conferencetask.cpp - Event Handling task responsible for all conference related events
Copyright (c) 2004 SUSE Linux AG http://www.suse.com
Based on Iris, Copyright (C) 2003 Justin Karneges
Kopete (c) 2002-2004 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 "client.h"
#include "userdetailsmanager.h"
#include "conferencetask.h"
ConferenceTask::ConferenceTask( Task* parent )
: EventTask( parent )
{
// register all the events that this task monitors
registerEvent( GroupWise::ConferenceClosed );
registerEvent( GroupWise::ConferenceJoined );
registerEvent( GroupWise::ConferenceLeft );
registerEvent( GroupWise::ReceiveMessage );
registerEvent( GroupWise::UserTyping );
registerEvent( GroupWise::UserNotTyping );
registerEvent( GroupWise::ConferenceInvite );
registerEvent( GroupWise::ConferenceInviteNotify );
registerEvent( GroupWise::ConferenceReject );
registerEvent( GroupWise::ReceiveAutoReply );
// GW7
registerEvent( GroupWise::ReceivedBroadcast );
registerEvent( GroupWise::ReceivedSystemBroadcast );
// listen to the UserDetailsManager telling us that user details are available
connect( client()->userDetailsManager(), TQT_SIGNAL( gotContactDetails( const GroupWise::ContactDetails & ) ),
TQT_SLOT( slotReceiveUserDetails( const GroupWise::ContactDetails & ) ) );
}
ConferenceTask::~ConferenceTask()
{
}
void ConferenceTask::dumpConferenceEvent( ConferenceEvent & evt )
{
client()->debug( TQString( "Conference Event - guid: %1 user: %2 timestamp: %3:%4:%5" ).arg
( evt.guid ).arg( evt.user.ascii() ).arg( evt.timeStamp.time().hour() ).arg
( evt.timeStamp.time().minute() ).arg( evt.timeStamp.time().second() ) );
client()->debug( TQString( " flags: %1" ).arg( evt.flags, 8 ) );
}
bool ConferenceTask::take( Transfer * transfer )
{
EventTransfer * incomingEvent;
if ( forMe( transfer, incomingEvent ) )
{
client()->debug( "Got a conference event:" );
ConferenceEvent event;
event.type = (GroupWise::Event)( incomingEvent->eventType() );
event.timeStamp = incomingEvent->timeStamp();
event.user = incomingEvent->source();
event.flags = 0;
Q_ASSERT( incomingEvent->hasGuid() );
event.guid = incomingEvent->guid();
switch ( event.type )
{
case GroupWise::ConferenceClosed:
// extra debug - we never see these events, against spec.
client()->debug( "********************" );
client()->debug( "* ConferenceClosed *" );
client()->debug( "* ConferenceClosed *" );
client()->debug( "* ConferenceClosed *" );
client()->debug( "********************" );
emit closed( event );
break;
case GroupWise::ConferenceJoined:
Q_ASSERT( incomingEvent->hasFlags() );
event.flags = incomingEvent->flags();
client()->debug( "ConferenceJoined" );
if ( !queueWhileAwaitingData( event ) )
emit joined( event );
break;
case GroupWise::ConferenceLeft:
Q_ASSERT( incomingEvent->hasFlags() );
event.flags = incomingEvent->flags();
client()->debug( "ConferenceLeft" );
emit left( event );
break;
case GroupWise::ReceiveMessage:
Q_ASSERT( incomingEvent->hasFlags() );
event.flags = incomingEvent->flags();
Q_ASSERT( incomingEvent->hasMessage() );
event.message = incomingEvent->message();
client()->debug( "ReceiveMessage" );
client()->debug( TQString( "message: %1" ).arg( event.message ) );
if ( !queueWhileAwaitingData( event ) )
emit message( event );
break;
case GroupWise::UserTyping:
client()->debug( "UserTyping" );
emit typing( event );
break;
case GroupWise::UserNotTyping:
client()->debug( "UserNotTyping" );
emit notTyping( event );
break;
case GroupWise::ConferenceInvite:
Q_ASSERT( incomingEvent->hasMessage() );
event.message = incomingEvent->message();
client()->debug( "ConferenceInvite" );
client()->debug( TQString( "message: %1" ).arg( event.message ) );
if ( !queueWhileAwaitingData( event ) )
emit invited( event );
break;
case GroupWise::ConferenceInviteNotify:
client()->debug( "ConferenceInviteNotify" );
if ( !queueWhileAwaitingData( event ) )
emit otherInvited( event );
break;
case GroupWise::ConferenceReject:
client()->debug( "ConferenceReject" );
if ( !queueWhileAwaitingData( event ) )
emit invitationDeclined( event );
break;
case GroupWise::ReceiveAutoReply:
Q_ASSERT( incomingEvent->hasFlags() );
event.flags = incomingEvent->flags();
Q_ASSERT( incomingEvent->hasMessage() );
event.message = incomingEvent->message();
client()->debug( "ReceiveAutoReply" );
client()->debug( TQString( "message: %1" ).arg( event.message.ascii() ) );
emit autoReply( event );
break;
case GroupWise::ReceivedBroadcast:
Q_ASSERT( incomingEvent->hasMessage() );
event.message = incomingEvent->message();
client()->debug( "ReceivedBroadCast" );
client()->debug( TQString( "message: %1" ).arg( event.message ) );
if ( !queueWhileAwaitingData( event ) )
emit broadcast( event );
break;
case GroupWise::ReceivedSystemBroadcast:
Q_ASSERT( incomingEvent->hasMessage() );
event.message = incomingEvent->message();
client()->debug( "ReceivedSystemBroadCast" );
client()->debug( TQString( "message: %1" ).arg( event.message ) );
emit systemBroadcast( event );
break;
default:
client()->debug( TQString( "WARNING: didn't handle registered event %1, on conference %2" ).arg( incomingEvent->eventType() ).arg( event.guid.ascii() ) );
}
dumpConferenceEvent( event );
return true;
}
return false;
}
void ConferenceTask::slotReceiveUserDetails( const GroupWise::ContactDetails & details )
{
client()->debug( "ConferenceTask::slotReceiveUserDetails()" );
// dequeue any events which are deliverable now we have these details
TQValueListIterator< ConferenceEvent > end = m_pendingEvents.end();
TQValueListIterator< ConferenceEvent > it = m_pendingEvents.begin();
while ( it != end )
{
TQValueListIterator< ConferenceEvent > current = it;
++it;
// if the details relate to event, try again to handle it
if ( details.dn == (*current).user )
{
client()->debug( TQString( " - got details for event involving %1" ).arg( (*current).user ) );
switch ( (*current).type )
{
case GroupWise::ConferenceJoined:
client()->debug( "ConferenceJoined" );
emit joined( *current );
break;
case GroupWise::ReceiveMessage:
client()->debug( "ReceiveMessage" );
emit message( *current );
break;
case GroupWise::ConferenceInvite:
client()->debug( "ConferenceInvite" );
emit invited( *current );
break;
case GroupWise::ConferenceInviteNotify:
client()->debug( "ConferenceInviteNotify" );
emit otherInvited( *current );
break;
default:
client()->debug( "Queued an event while waiting for more data, but didn't write a handler for the dequeue!" );
}
m_pendingEvents.remove( current );
client()->debug( TQString( "Event handled - now %1 pending events" ).arg
( (uint)m_pendingEvents.count() ) );
}
}
}
bool ConferenceTask::queueWhileAwaitingData( const ConferenceEvent & event )
{
if ( client()->userDetailsManager()->known( event.user ) )
{
client()->debug( "ConferenceTask::queueWhileAwaitingData() - source is known!" );
return false;
}
else
{
client()->debug( TQString( "ConferenceTask::queueWhileAwaitingData() - queueing event involving %1" ).arg( event.user ) );
client()->userDetailsManager()->requestDetails( event.user );
m_pendingEvents.append( event );
return true;
}
}
#include "conferencetask.moc"