cbsref/telephonyrefplugins/atltsy/atcommand/sms/src/atsmsreceive.cpp
branchRCL_3
changeset 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cbsref/telephonyrefplugins/atltsy/atcommand/sms/src/atsmsreceive.cpp	Tue Aug 31 16:23:08 2010 +0300
@@ -0,0 +1,317 @@
+// Copyright (c) 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:
+// @file atsmsreceive.cpp
+// This contains CAtSmsReceive which received incoming messages
+// 
+
+//system include
+#include <etelmm.h>
+#include <ctsy/ltsy/cctsydispatchercallback.h>
+
+//user include 
+#include "atsmsreceive.h"
+#include "atsmsstoreread.h"
+#include "atsmsack.h"
+#include "atmanager.h"
+#include "activecommandstore.h"
+#include "mslogger.h"
+#include "smsatutil.h"
+
+//constant defination
+_LIT8(KCMTMatchString,"+CMT:*");
+_LIT8(KCMTResponseString,"+CMT:");
+_LIT8(KAsterisk,"*");
+
+#ifdef _DEBUG
+const TInt KLogMaxCharNumPerLine = 160;
+#endif
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::CAtSmsReceive
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CAtSmsReceive::CAtSmsReceive(CGlobalPhonemanager& aGloblePhone, 
+                             CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+                             :CAtCommandBase(aGloblePhone,aCtsyDispatcherCallback)
+	{
+	LOGTEXT(_L8("CAtSmsReceive::CAtSmsReceive called"));
+	iAtType = ELtsyAT_Sms_ReceiveMessage;
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::~CAtSmsReceive
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CAtSmsReceive::~CAtSmsReceive()
+	{
+	LOGTEXT(_L8("CAtSmsReceive::~CAtSmsReceive called"));
+	RemoveAllExpectString();
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::NewLC
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CAtSmsReceive* CAtSmsReceive::NewLC(CGlobalPhonemanager& aGloblePhone, 
+                                    CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	CAtSmsReceive* self = new (ELeave)CAtSmsReceive(aGloblePhone, 
+                                                    aCtsyDispatcherCallback);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::NewL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+CAtSmsReceive* CAtSmsReceive::NewL(CGlobalPhonemanager& aGloblePhone, 
+                                   CCtsyDispatcherCallback& aCtsyDispatcherCallback)
+	{
+	CAtSmsReceive* self=CAtSmsReceive::NewLC(aGloblePhone, 
+                                             aCtsyDispatcherCallback);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::ConstructL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CAtSmsReceive::ConstructL()
+	{
+	CAtCommandBase::ConstructL();
+	//Add expecting string
+	RemoveAllExpectString();
+	AddExpectStringL(KCMTMatchString);
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::StartRequest
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CAtSmsReceive::StartRequest()
+	{
+	iState = EReceiveReady;
+	iPhoneGlobals.iAtManager->GetActiveCommandStore()->AddUnsolicitedAtCommand(this);
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::ExecuteCommand
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CAtSmsReceive::ExecuteCommand()
+	{
+	
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::EventSignal
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CAtSmsReceive::EventSignal(TAtEventSource /*aEventSource*/, TInt aStatus)
+/**
+ * Handle the events from the comm port
+ *ValidateExpectString
+ * @param aSource denotes if event is due to read, write or timeout
+ */
+	{
+	if(aStatus != KErrNone)
+		{
+		iCtsyDispatcherCallback.CallbackSmsNotifyReceiveSmsMessageInd(iError,EFalse,iMsgReceive);
+		return;
+		}
+	
+	if( iState == EReceiveReady )
+		{
+		LOGTEXT(_L8("CAtSmsReceive::EventSigna,EReadCompletion"));
+		//Handle CMT response
+		if (iError == KErrNone)
+			{
+             //want to read the second line
+			TRAPD(err,AddExpectStringL(KAsterisk));
+			if( err==KErrNone )
+				{
+				// Wait for the reception of the second line
+				iState=EWaitForCmtSecondLine;
+				return;
+				}
+			else
+				{
+				iError = err;
+				}
+			}
+		iCtsyDispatcherCallback.CallbackSmsNotifyReceiveSmsMessageInd(iError,EFalse,iMsgReceive);
+		}
+	else if( iState == EWaitForCmtSecondLine )
+		{
+		LOGTEXT(_L8("CAtSmsReceiveMessage::EventSignal EWaitForCmtSecondLine"));
+        RemoveExpectString(KAsterisk);
+		iCtsyDispatcherCallback.CallbackSmsNotifyReceiveSmsMessageInd(iError,EFalse,iMsgReceive);
+		// We've got the PDU, and will delete the buffer when the line is parsed
+		if(iPhoneGlobals.iEventSignalActive == EFalse)
+			{
+		    ClearBuffer();
+			}
+		iState = EReceiveReady;
+		}
+     
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::CMTResponseFirstLineL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void  CAtSmsReceive::CMTResponseFirstLineL()
+	{
+	LOGTEXT(_L8("CAtSmsReceive::CMTResponseFirstLineL Enter funciton"));
+	iError = KErrNone;
+	TPtrC8 firstLineBuf;
+	firstLineBuf.Set(Buffer());
+	TInt pos = firstLineBuf.FindF(KCMTResponseString);
+	if (pos == KErrNotFound)
+		{
+		LOGTEXT(_L8("CAtSmsReceive::CMTResponseFirstLineL()\tError - Cannot find '+CMT:' string"));
+		iError = KErrNotFound;
+		return;
+		}
+	//skip the string of +CMT:
+	pos += KCMTResponseString().Length();
+	//skip a  "," character
+	while(!(TChar(firstLineBuf[pos]).IsDigit()))
+		{
+		++pos;
+		}
+	TInt lenPos = firstLineBuf.Length()-pos;
+	TPtrC8 pduLenBuf;
+	pduLenBuf.Set(firstLineBuf.Right(lenPos));
+	
+	
+	TLex8 lex(pduLenBuf);
+	TUint16 val;
+	TInt ret = lex.Val(val,EDecimal);
+	if(ret != KErrNone)
+		{
+		iError = ret;
+		return;
+		}
+	iPduLen = val;
+    LOGTEXT2(_L8("New SMS detected of length %d"),iPduLen);
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::CMTResponseSecondLineL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void  CAtSmsReceive::CMTResponseSecondLineL() 
+	{
+	LOGTEXT(_L8("CAtSmsReceive::CMTResponseSecondLineL Enter funciton"));
+	iError = KErrNone;
+	iAttr.iFlags=0;
+	TPtrC8 secondLineBuf;
+	secondLineBuf.Set(CurrentLine());
+	
+#ifdef _DEBUG
+	TInt totalLen = secondLineBuf.Length();
+	if(totalLen <= KLogMaxCharNumPerLine)
+		{
+		LOGTEXT2(_L8("CAtSmsReceiveMessage::CMTResponseSecondLineL\tSecondLine=%S"),&secondLineBuf);
+		}
+	else
+		{
+		TInt lines = (totalLen/KLogMaxCharNumPerLine);
+		TInt remainingStrNum = (totalLen%KLogMaxCharNumPerLine);
+		for(TInt i = 0; i < lines; i++)
+			{
+			TPtrC8 line(secondLineBuf.Mid(i*KLogMaxCharNumPerLine,KLogMaxCharNumPerLine));
+			LOGTEXT2(_L8("CAtSmsReceiveMessage::CMTResponseSecondLineL \tSecondLine line=%S"),&line);
+			}
+		
+		TPtrC8 remaining(secondLineBuf.Right(remainingStrNum));
+		
+		LOGTEXT2(_L8("CAtSmsReceiveMessage::CMTResponseSecondLineL \tSecondLine line=%S"),&remaining);
+		}
+#endif  
+	// Buffer size calculated as follows;
+	//   (max pdu size + max prefixed SCA size) * number of ASCII chars used to code an octet
+	TBuf8<(RMobileSmsMessaging::KGsmTpduSize+12)*2> localPdu;	
+	localPdu.Copy(secondLineBuf);
+	//  The CMT frame sometimes contains odd number of nibbles which
+	// causes panic in ConvertAsciiToBinary() method. This type of
+	// frames will simply be discarded.
+	if(localPdu.Length() < (iPduLen*2))
+		{
+		iError = KErrUnderflow;
+		User::Leave(KErrUnderflow);
+		}
+		
+	//
+	// Check if we have a prefixed SCA on our pdu.
+	// If we do then remove it.
+	
+	if(localPdu.Length() > (iPduLen*2))
+		{
+		TInt ret = SmsAtUtil::ReadAndRemoveAddressFromAscii(localPdu,iAttr.iGsmServiceCentre);
+		if(ret !=KErrNone)
+			{
+			LOGTEXT(_L8("CAtSmsReceiveMessage::CMTResponseSecondLineL Failed to read and remove SCA from PDU"));
+			iError = ret;
+			return;
+			}
+		else
+			{
+			iMsgReceive.iServiceCentre = iAttr.iGsmServiceCentre.iTelNumber;    //for iServiceCentre
+			iMsgReceive.iMobileScNPI = iAttr.iGsmServiceCentre.iNumberPlan;
+			iMsgReceive.iMobileScTON = iAttr.iGsmServiceCentre.iTypeOfNumber;
+			iAttr.iFlags|= RMobileSmsMessaging::KGsmServiceCentre;
+			}
+		}
+	//
+	// Convert received pdu from ASCII into binary
+	TInt ret = SmsAtUtil::ConvertAsciiToBinary(localPdu,iPdu);
+	if (ret!=KErrNone)
+		{
+		LOGTEXT(_L8("CAtSmsReceiveMessage::CMTResponseSecondLineL Failed to code PDU into binary"));
+		iError = ret;
+		return;
+		}
+	else
+		{
+		iAttr.iDataFormat=RMobileSmsMessaging::EFormatGsmTpdu;
+		iAttr.iFlags|=RMobileSmsMessaging::KSmsDataFormat;
+		iAttr.iStatus = RMobileSmsMessaging::EMtMessageUnstoredClientAck;
+		iAttr.iFlags|=RMobileSmsMessaging::KIncomingStatus;
+		}
+
+	LOGTEXT2(_L8("Received PDU String is %S"),&iPdu);
+	iMsgReceive.iSmsMsg = iPdu;
+	}
+
+// ---------------------------------------------------------------------------
+// CAtSmsReceive::ParseResponseL
+// other items were commented in a header
+// ---------------------------------------------------------------------------
+void CAtSmsReceive::ParseResponseL(const TDesC8& /*aResponseBuf*/)
+	{
+	if(iState == EReceiveReady)
+		{
+		CMTResponseFirstLineL();
+		}
+	else if(iState == EWaitForCmtSecondLine)
+		{
+		CMTResponseSecondLineL();
+		}
+	}
+
+//End of file