telephonyserverplugins/multimodetsy/Multimode/sms/sms_rx_queue.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/multimodetsy/Multimode/sms/sms_rx_queue.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,221 @@
+// Copyright (c) 1997-2009 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:
+// Class defintition for CReceiveSmsQueue
+// 
+//
+
+/**
+ @file
+*/
+
+#include <etelmm.h>				// for RMobileSmsMessaging...
+#include <et_phone.h>           // for TSY_HANDLE_INIT_VALUE
+#include "mSMSMESS.H"			// for CMobileSmsMessaging...
+#include "sms_rx_queue.h"		// header for this cpp file
+#include "mSLOGGER.H"			// for LOGTEXT2...
+#include "sms_rx_queue_pduread.h"		// for CATSmsReadPDU
+
+// Macros
+#ifdef __LOGDEB__
+_LIT8(KLogEntry,"CReceiveSmsQueue::%S\t%S");
+#define LOCAL_LOGTEXT(function,text) {_LIT8(F,function);_LIT8(T,text);LOGTEXT3(KLogEntry,&F,&T);}
+#else
+#define LOCAL_LOGTEXT(function,text)
+#endif
+
+
+CReceiveSmsQueue* CReceiveSmsQueue::NewL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aGlobals,CMobileSmsMessaging& aMobileSmsMessaging)
+/** First stage constructor
+ */
+ 	{
+	CReceiveSmsQueue* self=new(ELeave) CReceiveSmsQueue(aMobileSmsMessaging,*aGlobals);
+	CleanupStack::PushL(self);	
+	self->ConstructL(aIo,aTelObject,aInit,aGlobals);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CReceiveSmsQueue::CReceiveSmsQueue(CMobileSmsMessaging& aMobileSmsMessaging,CPhoneGlobals& aGlobals)
+	: iGlobals(aGlobals), iMobileSmsMessaging(aMobileSmsMessaging)
+ /** C++ constructor
+  */
+	{}
+
+void CReceiveSmsQueue::ConstructL(CATIO* aIo,CTelObject* aTelObject,CATInit* aInit,CPhoneGlobals* aGlobals)
+/** Second stage constructor
+ */
+	{
+	// Create the AT command object which we will use to read PDUs from the 
+	// phones memory
+	iATReadPDU=CATSmsReadPDU::NewL(aIo,aTelObject,aInit,aGlobals,*this);
+	}
+
+CReceiveSmsQueue::~CReceiveSmsQueue()
+/** C++ destructor
+ */
+	{
+	delete iATReadPDU;
+	}
+
+
+
+void CReceiveSmsQueue::Push(const RMobileSmsMessaging::TMobileSmsGsmTpdu& aPdu, 
+			      		    const RMobileSmsMessaging::TMobileSmsReceiveAttributesV1& aAttr)
+	{
+	LOCAL_LOGTEXT("Push","Pushing item to queue");
+	LOGTEXT3(_L8("iQueueFront=%d  iQueueBack=%d"),iQueueFront,iQueueBack);
+		
+	if(QueueFull())
+		{
+		LOCAL_LOGTEXT("Push","Queue overflow!");
+		// Allow message to drop of front of queue
+		iQueueFront=(iQueueFront+1)%KReceiveSmsQueueSize;
+		}
+
+	// Copy item into queue
+	(iQueue[iQueueBack]).iPdu=aPdu;
+	(iQueue[iQueueBack]).iAttr=aAttr;
+
+	// Update pointer
+	iQueueBack=(iQueueBack+1)%KReceiveSmsQueueSize;
+
+	// Try to complete client request in case one was outstanding
+	CompleteClientReqIfPossible();
+	}
+
+
+void CReceiveSmsQueue::PopAndCompleteClientWhenPossible(const TTsyReqHandle aReqHandle,
+                                                        RMobileSmsMessaging::TMobileSmsGsmTpdu* aPdu, 
+									                    RMobileSmsMessaging::TMobileSmsReceiveAttributesV1* aAttr)
+	{
+	__ASSERT_DEBUG(iClientReqOutstanding==EFalse,Panic(EReceiveSmsQueueRequestOutstanding));
+
+	//
+	// Store clients request details
+	iClientReqOutstanding=ETrue;
+	iClientReq=aReqHandle;
+	iClientReqPdu=aPdu;
+	iClientReqAttr=aAttr;
+
+	// Try to complete client request
+	CompleteClientReqIfPossible();
+	}											
+
+void CReceiveSmsQueue::PopAndCompleteClientWhenPossibleCancel()
+	{
+	LOCAL_LOGTEXT("PopAndCompleteClientWhenPossibleCancel","Enter function");
+	LOGTEXT3(_L8("iQueueFront=%d  iQueueBack=%d"),iQueueFront,iQueueBack);
+	
+	if(iClientReqOutstanding)
+		{
+		// Complete client request with KErrCancel
+		iMobileSmsMessaging.ReqCompleted(iClientReq,KErrCancel);
+		iClientReqOutstanding=EFalse;
+		}
+	}
+
+void CReceiveSmsQueue::ReadPDUFromPhone()
+/**
+ * ReadPDUFromPhone should be called by CATCommands::Complete at which time the 
+ * TSY base classes guarantee that there is not another AT command which is running.
+ * ReadPDUFromPhone starts the reading of the PDU of the message at the front of
+ * the queue if we do not already store it's PDU.
+ */
+	{
+	LOCAL_LOGTEXT("ReadPDUFromPhone","Enter function");
+
+	//
+	// Check if we need to read PDU from phone
+	if(QueueEmpty())
+		{
+		LOCAL_LOGTEXT("ReadPDUFromPhone","Queue is empty, will not read PDU");
+		return;
+		}
+
+	if((iQueue[iQueueFront]).iPdu.Length()!=0)
+		{
+		LOCAL_LOGTEXT("ReadPDUFromPhone","Already have PDU, will not read PDU");
+		return;
+		}
+
+	LOCAL_LOGTEXT("ReadPDUFromPhone","Need to read a PDU from the phone...");
+
+	//
+	// Read PDU from phone
+	// (We can call ExecuteCommand with a 0 TSY handle as we are guaranteed, by 
+	// the CATBase base class that another AT command is not running, and therefore 
+	// the CATBase will not try to complete this request with KErrInUse 
+	// due to iEventSignalActive==ETrue)
+	iATReadPDU->ExecuteCommand(0,&(iQueue[iQueueFront]));
+	}
+
+
+void CReceiveSmsQueue::CompleteClientReqIfPossible()
+/**
+ * If there is an oustanding client request then this function
+ * will check to see if the client request can be completed.
+ * If a client request can be completed then this function will 
+ * complete the client request by popping an item from the queue, 
+ * passing the item data to the client and then calling ReqCompleted
+ */	
+	{
+	LOCAL_LOGTEXT("CompleteClientReqIfPossible","Enter function");
+	
+	//
+	// We can only complete a client request if...
+	//   The client has made a request
+	//   Our Queue is not empty
+	//   We have the PDU for the message at the front of the queue
+	if(iClientReqOutstanding && !QueueEmpty() && (iQueue[iQueueFront]).iPdu.Length()!=0)
+		{
+		LOCAL_LOGTEXT("CompleteClientReqIfPossible","Popping item from queue");
+
+		// Copy item from queue
+		*iClientReqPdu=(iQueue[iQueueFront]).iPdu;
+		*iClientReqAttr=(iQueue[iQueueFront]).iAttr;
+		
+		// Update pointer
+		iQueueFront=(iQueueFront+1)%KReceiveSmsQueueSize;
+
+		// Complete client request
+		iMobileSmsMessaging.ReqCompleted(iClientReq,KErrNone);
+		iClientReqOutstanding=EFalse;
+		}
+	}
+
+TBool CReceiveSmsQueue::QueueEmpty()
+/** Class Private Utility function
+ */
+	{
+	return iQueueFront==iQueueBack;
+	}
+
+TBool CReceiveSmsQueue::QueueFull()
+/** Class Private Utility function
+ */
+	{
+	return ((iQueueBack+1)%KReceiveSmsQueueSize)==iQueueFront;
+	}
+
+void CReceiveSmsQueue::CompleteClientReqWithError(TInt aError)
+/** Inform client that there is a problem waiting for messages
+ */
+	{
+	if(iClientReqOutstanding)
+		{
+		LOGTEXT2(_L8("CReceiveSmsQueue::CompleteClientReqWithError - Error %d"),aError);
+		iMobileSmsMessaging.ReqCompleted(iClientReq,aError);
+		iClientReqOutstanding=EFalse;
+		}
+	}