diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/multimodetsy/Multimode/sms/sms_rx_queue.cpp --- /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 // for RMobileSmsMessaging... +#include // 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; + } + }