/* 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 ************************************************************************* * * * 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(), TQ_SIGNAL( gotContactDetails( const GroupWise::ContactDetails & ) ), TQ_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"