diff -r 000000000000 -r 1bce908db942 multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/CTcMCEReceiveQueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/CTcMCEReceiveQueue.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,115 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation. +* +*/ + + + +#include "CTcMCEReceiveQueue.h" +#include "CTcMCEReceived.h" +#include "CTcMCEContext.h" + +CTcMCEReceiveQueue* CTcMCEReceiveQueue::NewL( CTcMCEContext& aContext ) + { + CTcMCEReceiveQueue* self = new (ELeave) CTcMCEReceiveQueue( aContext ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +CTcMCEReceiveQueue::CTcMCEReceiveQueue( CTcMCEContext& aContext ) : + iReceiveQueue( 1 ), + iContext( aContext ) + { + } + +void CTcMCEReceiveQueue::ConstructL() + { + iTimer = CDeltaTimer::NewL( CActive::EPriorityStandard ); + TCallBack cb( ReceiveTimeout, this ); + iReceiveTimeout.Set( cb ); + } + +CTcMCEReceiveQueue::~CTcMCEReceiveQueue() + { + delete iTimer; + iReceiveQueue.Reset(); + } + + +// -- Received queue handling ------------------------------------------------- + +CTcMCEReceived& CTcMCEReceiveQueue::ReceivedItemL( TInt aTimeout ) + { + if( iReceiveQueue.Count() == 0 ) + { + iTimer->Queue( aTimeout * KSecondAsMicros, iReceiveTimeout ); + iActiveWait.Start(); + } + + // Check if the queue is still empty (i.e. timeout occurred) + if( iReceiveQueue.Count() == 0 ) + { + User::Leave( KErrTimedOut ); + } + + // Get the first (oldest) item from the array + TBuf8< KTcMaxObjectName > itemName = iReceiveQueue[ 0 ]; + + // ..and remove it from the array + iReceiveQueue.Delete( 0 ); + iReceiveQueue.Compress(); + + // Fetch the corresponding object from the registry + CTcMCEReceived* item = + reinterpret_cast + (iContext.Registry().ObjectPtrL( itemName )); + + return *item; + + } + +void CTcMCEReceiveQueue::QueueReceivedL( CTcMCEReceived* aItem ) + { + // Add to registry and fetch name + iContext.Registry().AddObjectL( reinterpret_cast< CBase* >( aItem ) ); + TBuf8< KTcMaxObjectName > itemName = + iContext.Registry().ObjectNameL( aItem ); + + // Add name to queue + iReceiveQueue.AppendL( itemName ); + + if( iActiveWait.IsStarted() ) + { + iTimer->Remove( iReceiveTimeout ); + iActiveWait.AsyncStop(); + } + + } + +TInt CTcMCEReceiveQueue::ReceiveTimeout( TAny* aSelf ) + { + CTcMCEReceiveQueue& self = + *reinterpret_cast< CTcMCEReceiveQueue* >( aSelf ); + if( self.iActiveWait.IsStarted() ) + { + self.iActiveWait.AsyncStop(); + } + + return KErrNone; + }