messagingfw/biomsgfw/BioWatchers/Src/WapSocketWatcher.cpp
changeset 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/BioWatchers/Src/WapSocketWatcher.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,197 @@
+// Copyright (c) 2000-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:
+//
+
+
+#include "WapSocketWatcher.h"
+#include <watcher.h>
+
+//
+// CWapPortWatcher
+//
+
+//
+// Global Defines
+//
+const TInt KSmsWRetryTimer = 1000000 * 15; // 15 Secs
+
+//
+// Construction
+//	private
+//
+CWapPortWatcher::CWapPortWatcher(CWatcherLog& aWatcherLog, TInt aPriority, TUid aBioID, RFs& aFs, TUint16 aWapPort)
+:	CBaseSmsActiveSocketWatcher(aWatcherLog, aPriority, aBioID, aFs), iWapPort(aWapPort)
+	{
+	}
+
+CWapPortWatcher* CWapPortWatcher::NewL(TMsvId aBioServiceId, 
+									   TMsvId aSmsServiceId, 
+									   CBIODatabase& aBioDb, 
+									   CWatcherLog& aWatcherLog, 
+									   TInt aPriority, 
+									   TUid aBioID, 
+									   RFs& aFs, 
+									   const TBioMsgId& aBioMsg)
+	{
+	CWapPortWatcher* self = NULL;
+
+	//Create either a WDP or WSP watcher, depending on the BioMsgId type
+	switch (aBioMsg.iType)
+		{
+		case EBioMsgIdNbs:
+		case EBioMsgIdWap:
+		case EBioMsgIdWapSecure:
+			{
+			self = new (ELeave) CWdpPortWatcher(aWatcherLog, aPriority, aBioID, aFs, STATIC_CAST(Wap::TPort,aBioMsg.iPort));
+			break;
+			}
+		case EBioMsgIdWsp:
+		case EBioMsgIdWspSecure:
+			{
+			self = new (ELeave) CWspPortWatcher(aWatcherLog, aPriority, aBioID, aFs, STATIC_CAST(Wap::TPort,aBioMsg.iPort));
+			break;
+			}
+		default:
+			User::Leave(KErrNotSupported);
+		}
+
+	CleanupStack::PushL(self);
+	self->ConstructL(aBioDb, aBioServiceId, aSmsServiceId);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CWapPortWatcher::~CWapPortWatcher()
+	{
+	delete iRecvBuf;
+	iRecvBuf = NULL;
+	}
+
+void CWapPortWatcher::DoComplete(TInt& rStatus)
+	{
+	BIOWATCHERLOG(iWatcherLog.Printf(_L("BioWap: DoComplete: %S, port %d, status %d"), &iBioMsgText, iWapPort, rStatus));
+
+	CloseConn();
+	}
+
+void CWapPortWatcher::DoReceiveL(const TDesC8& aRecvFrom)
+	{
+	BIOWATCHERLOG(iWatcherLog.Printf(_L("BioWap: DoReceiveL: %S, port %d"),&iBioMsgText, iWapPort));
+	
+	// Code for collecting message goes here...
+	BIOWATCHERLOG(iWatcherLog.Printf(_L8("BioWap: Recv datagram length: %d on socket OK"), iRecvBuf->Length()));
+	
+	// Create a CSmsMessage from the recieved buffer
+	CSmsBuffer* buffer=CSmsBuffer::NewL();
+	
+	
+	CSmsMessage* smsmessage = CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver, buffer);
+	CleanupStack::PushL(smsmessage);
+
+	smsmessage->SmsPDU().SetAlphabet(TSmsDataCodingScheme::ESmsAlphabet8Bit);
+
+	if (aRecvFrom.Length())
+		{
+		//Convert aRecvFrom to 16-bit
+		HBufC* tempRemoteAddr = HBufC::NewLC(aRecvFrom.Length());
+		tempRemoteAddr->Des().Copy(aRecvFrom);
+
+		//Set the from address in the CSmsMessage
+		smsmessage->SmsPDU().SetToFromAddressL(*tempRemoteAddr);
+		CleanupStack::PopAndDestroy(tempRemoteAddr);
+		}
+	
+	//Convert iRecvTotalMessage to 16-bit
+	HBufC* tempRecvBuf = HBufC::NewLC(iRecvBuf->Length());
+	tempRecvBuf->Des().Copy(*iRecvBuf);
+	buffer->InsertL(0, *tempRecvBuf);
+	CleanupStack::PopAndDestroy(tempRecvBuf);
+
+	//Pop buffer and smsmessage off the cleanup stack,
+	//because StoreMsgL() will destroy the CSmsMessage (which contains the buffer).
+	CleanupStack::Pop();// smsmessag
+
+	StoreMsgL(smsmessage);
+	
+	// Not Async so signal here...
+	TRequestStatus* pS=&iStatus;
+	User::RequestComplete(pS, KErrNone);
+	}
+
+void CWapPortWatcher::AppendToHBufC8L(HBufC8*& aBuf, const TDesC8& aAppend)
+	{
+	//Appends aAppend to aBuf. If aBuf is NULL, then copies aAppend into aBuf.
+
+	if (!aBuf || aBuf->Length() == 0)
+		{
+		delete aBuf;
+		aBuf = NULL;
+		aBuf = aAppend.AllocL();
+		}
+	else
+		{
+		//Append the new message in iWspRecvBuf to the iTempRecvBuf
+		aBuf = aBuf->ReAllocL(aBuf->Length() + aAppend.Length());
+		aBuf->Des().Append(aAppend);
+		}
+	}
+
+void CWapPortWatcher::CloseConn()
+	{
+	delete iRecvBuf;
+	iRecvBuf = NULL;
+	}
+
+void CWapPortWatcher::DoRunL()
+	{
+	switch(iState)
+		{
+		case ESmsWWaitForMsg:
+			iState = ESmsWReadMsg;
+			WaitForMessageL();
+			break;
+		
+		case ESmsWReadMsg:
+			iState = ESmsWWaitForMsg;
+			ReceiveL();
+			break;
+
+		case ESmsWRetryError:
+			if (!iTimer.Handle())
+				{
+				User::LeaveIfError(iTimer.CreateLocal());
+				}
+			iState=ESmsWWaitForMsg;
+			iTimer.After(iStatus, KSmsWRetryTimer);
+			break;
+		
+		case ESmsIsClass0Msg:
+			iState = ESmsWWaitForMsg;
+			CompleteSelf();
+			break;
+		}
+
+	SetActive();
+
+	}
+
+// WAP messages that use Class 0 SMS messages should be treated as non Class 0 messages,
+// so need to go back to ESmsWWaitForMsg state.
+void CWapPortWatcher::CompleteSelf()
+	{
+	// Complete self.
+	TRequestStatus* status = &iStatus;
+	iStatus = KRequestPending;
+	User::RequestComplete(status, KErrNone);
+	}