diff -r 000000000000 -r 96612d01cf9f videofeeds/server/IptvEpgManager/src/CIptvEpgVodMsqQueue.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/videofeeds/server/IptvEpgManager/src/CIptvEpgVodMsqQueue.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,274 @@ +/* +* Copyright (c) 2004-2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* +*/ + + + + +// INCLUDE FILES +#include +#include +#include "IptvDebug.h" +#include "CIptvTimer.h" + +#include "MIptvVodContentClientObserver.h" +#include "IptvClientServerCommon.h" +#include "CIptvEpgVodMsqQueue.h" + +// CONSTANTS +const TInt KIptvMaxTries = 600; +const TInt KIptvVodMsgQueueTimerInterval = 100000; + +// ============================ MEMBER FUNCTIONS =============================== + +// --------------------------------------------------------- +// CIptvEpgVodMsqQueue::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------- +// +void CIptvEpgVodMsqQueue::ConstructL() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::ConstructL"); + + iTimer = CIptvTimer::NewL(CActive::EPriorityUserInput, *this); + } + +// --------------------------------------------------------- +// CIptvEpgVodMsqQueue::NewL +// Two-phased constructor. +// Create instance of concrete interface implementation +// --------------------------------------------------------- +// +CIptvEpgVodMsqQueue* CIptvEpgVodMsqQueue::NewL() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::NewL"); + + CIptvEpgVodMsqQueue* self = new(ELeave) CIptvEpgVodMsqQueue(); + CleanupStack::PushL(self); + + self->ConstructL(); + + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------- +// CIptvEpgVodMsqQueue::~CIptvEpgVodMsqQueue +// Destructor +// --------------------------------------------------------- +// +CIptvEpgVodMsqQueue::~CIptvEpgVodMsqQueue() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::~CIptvEpgVodMsqQueue"); + + iMsgQueue.Close(); + CancelRequest(); + + if (iTimer) + { + iTimer->Cancel(); + delete iTimer; + iTimer = NULL; + } + } + +// --------------------------------------------------------- +// CIptvEpgVodMsqQueue::CIptvEpgVodMsqQueue +// C++ default constructor +// --------------------------------------------------------- +// +CIptvEpgVodMsqQueue::CIptvEpgVodMsqQueue() : + iRequestPending( EFalse ), + iTimer ( NULL ), + iCounter( 0 ) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::CIptvEpgVodMsqQueue"); + } + +// ------------------------------------------------------------------ +// CIptvEpgVodMsqQueue::SendMessageToClientL +// ------------------------------------------------------------------ +// +void CIptvEpgVodMsqQueue::SendMessageToClientL(TInt aMsg, TInt aInfo) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::SendMessageToClientL"); + + if (!iRequestPending) + { + TIptvEpgVodMsg msg; + msg.iValue = aMsg; + msg.iInfo = aInfo; + + iMsgQueue.AppendL(msg); + SetTimer(); + } + else + { + TIptvEpgVodMsg msg; + msg.iValue = aMsg; + msg.iInfo = aInfo; + + SendMessageL(msg); + } + } + +// ------------------------------------------------------------------ +// CIptvEpgVodMsqQueue::SetTimer +// ------------------------------------------------------------------ +// +void CIptvEpgVodMsqQueue::SetTimer() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::SetTimer"); + + if (!iTimer->IsActive()) + { + iTimer->After(KIptvVodMsgQueueTimerInterval); + } + } + +// --------------------------------------------------------- +// CIptvEpgVodMsqQueue::TimerExpired +// +// --------------------------------------------------------- +// +void CIptvEpgVodMsqQueue::TimerExpired(CIptvTimer* /*aTimer*/) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::TimerExpired"); + + TInt count = iMsgQueue.Count(); + IPTVLOGSTRING2_LOW_LEVEL("CIptvEpgVodMsqQueue::TimerExpired --- Items in message queue %d", count); + + if (iRequestPending) + { + if (count > 0) + { + TIptvEpgVodMsg msg = iMsgQueue[0]; + TRAPD(err, SendMessageL(msg)); + if (err != KErrNone) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::TimerExpired SendMessageL failed"); + } + + iCounter = 0; + iMsgQueue.Remove(0); + SetTimer(); + } + } + else + { + if (count > 0) + { + iCounter++; + if (iCounter > KIptvMaxTries) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::TimerExpired Clearing message queue!"); + iMsgQueue.Reset(); + iCounter = 0; + } + else + { + SetTimer(); + } + } + } + } + +// --------------------------------------------------------- +// CIptvEpgVodMsqQueue::SendMessageL +// +// --------------------------------------------------------- +// +void CIptvEpgVodMsqQueue::SendMessageL(TIptvEpgVodMsg& aMsg) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::SendMessageL"); + + if (iRequestPending && !iObserverMessage.IsNull()) + { + TBuf8 data; + RDesWriteStream writeStream; + writeStream.Open(data); + CleanupClosePushL( writeStream ); + writeStream.WriteUint32L(aMsg.iValue); + writeStream.WriteInt32L(aMsg.iInfo); + CleanupStack::PopAndDestroy( &writeStream ); + iObserverMessage.WriteL(0, data, 0); + iObserverMessage.Complete(KErrNone); + iRequestPending = EFalse; + } +#ifdef _DEBUG + else + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::SendMessageL() Error! Called when no request or message!"); + } +#endif // _DEBUG + } + +// ------------------------------------------------------------------ +// CIptvEpgVodMsqQueue::SetRequest +// ------------------------------------------------------------------ +// +void CIptvEpgVodMsqQueue::SetRequest(const RMessage2& aMessage) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::SetRequest"); + + iCounter = 0; + iObserverMessage = aMessage; + iRequestPending = ETrue; + + TInt count = iMsgQueue.Count(); + if (count >= 1) + { + if (count == 1) + { + iTimer->Cancel(); + } + + TIptvEpgVodMsg msg = iMsgQueue[0]; + TRAPD(err, SendMessageL(msg)); + if (err != KErrNone) + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::SetRequest SendMessageL failed"); + } + iMsgQueue.Remove(0); + } + } + +// ------------------------------------------------------------------ +// CIptvEpgVodMsqQueue::CancelRequest +// ------------------------------------------------------------------ +// +void CIptvEpgVodMsqQueue::CancelRequest() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::CancelRequest"); + + if (iRequestPending) + { + iObserverMessage.Complete(KErrCancel); + iRequestPending = EFalse; + } + } + +// ------------------------------------------------------------------ +// CIptvEpgVodMsqQueue::CancelMsgQueue +// ------------------------------------------------------------------ +// +void CIptvEpgVodMsqQueue::CancelMsgQueue() + { + IPTVLOGSTRING_LOW_LEVEL("CIptvEpgVodMsqQueue::CancelMsgQueue"); + iMsgQueue.Close(); + } + +// End of File