videofeeds/server/IptvEpgManager/src/CIptvEpgVodMsqQueue.cpp
changeset 0 96612d01cf9f
--- /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 <e32base.h>
+#include <s32mem.h>
+#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<KIptvVodObserverRequestSize> 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