messagingfw/biomsgfw/BioWatchers/Src/WspPortWatcher.cpp
changeset 62 db3f5fa34ec7
parent 0 8e480a14352b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/biomsgfw/BioWatchers/Src/WspPortWatcher.cpp	Wed Nov 03 22:41:46 2010 +0530
@@ -0,0 +1,133 @@
+// 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>
+
+#include <wapmessage.h>
+#include <wapmsgerr.h>
+
+//
+//CWspPortWatcher
+//
+
+CWspPortWatcher::CWspPortWatcher(CWatcherLog& aWatcherLog, TInt aPriority, TUid aBioID, RFs& aFs, Wap::TPort aWapPort)
+	: CWapPortWatcher(aWatcherLog, aPriority, aBioID, aFs, aWapPort),iPushPckgId(0)
+	{
+	}
+
+CWspPortWatcher::~CWspPortWatcher()
+	{
+	Cancel();
+	CloseConn();
+	delete iWspConn;
+	delete iRecvHeader;
+	}
+
+void CWspPortWatcher::CloseConn()
+	{
+	//Close the WSP connection
+	delete iWspConn;
+	iWspConn=NULL;
+
+	delete iRecvHeader;
+	iRecvHeader = NULL;
+
+	CWapPortWatcher::CloseConn(); //deletes iRecvBuf
+	}
+
+void CWspPortWatcher::DoCancel()
+	{
+	if (iWspConn!=NULL)
+		iWspConn->CancelAwaitPush();
+	}
+
+void CWspPortWatcher::DoSetupL()
+	{
+	BIOWATCHERLOG(iWatcherLog.Printf(_L("BioWsp: DoSetupL: %S, port %d"), &iBioMsgText, iWapPort));
+
+	//Open Connectionless WSP connection on port iWapPort
+	if(iWspConn==NULL)
+		iWspConn=CWapBoundCLPushService::NewL();
+	User::LeaveIfError(iWspConn->Connect(Wap::ESMS,iWapPort,EFalse));
+	}
+
+void CWspPortWatcher::WaitForMessageL()
+	{
+	BIOWATCHERLOG(iWatcherLog.Printf(_L("BioWsp: WaitForMessageL: %S, port %d"), &iBioMsgText, iWapPort));
+
+	User::LeaveIfError(iStatus.Int());
+
+	//Wait for WSP push message on port iWapPort	
+	iTempRecvBuf.Zero();
+	iTempRecvHeader.Zero();
+	User::LeaveIfError(iWspConn->AwaitPush(iTempRecvHeader,iTempRecvBuf,iPushPckgId,iStatus));
+
+	//SetActive() is called by CBaseSmsActiveSocketWatcher::DoRunL()
+	}
+
+void CWspPortWatcher::ReceiveL()
+	{
+	BIOWATCHERLOG(iWatcherLog.Printf(_L("BioWsp: ReceiveL: %S, port %d"), &iBioMsgText, iWapPort));
+
+	//Receive the WAP Message.
+
+	switch (iStatus.Int())
+		{
+		case Wap::EMoreData:
+			{
+			//if iStatus == EMoreData, then must wait for the rest of the message
+			AppendToHBufC8L(iRecvHeader, iTempRecvHeader);
+			AppendToHBufC8L(iRecvBuf, iTempRecvBuf);
+
+			TRequestStatus* pS=&iStatus;
+			User::RequestComplete(pS, KErrNone);
+			break;
+			}
+		case KErrNone:
+			{
+			AppendToHBufC8L(iRecvHeader, iTempRecvHeader);
+			AppendToHBufC8L(iRecvBuf, iTempRecvBuf);
+			
+			// DEF053845 Provide a NULL pointer for GetServerAddress().
+			// GetServerAddress() Allocs and sets up the pointer.
+			HBufC8* serverAddress = NULL;
+			// Pick up and interrogate the return rather than User::LeaveIfError.
+			// Leaving here could result in us receiving the message again
+			// and again.
+			TInt err = iWspConn->GetServerAddress(serverAddress);
+			if(err == KErrNone && serverAddress->Length())
+				{
+				CleanupStack::PushL(serverAddress);
+				DoReceiveL(*serverAddress);
+				CleanupStack::PopAndDestroy(serverAddress);
+				}
+			else
+				{
+				delete serverAddress; // Could have been alloc'd but it won't hurt to delete if NULL
+				DoReceiveL(KNullDesC8);
+				}							
+			delete iRecvBuf;
+			iRecvBuf = NULL;
+			delete iRecvHeader;
+			iRecvHeader = NULL;
+			}
+			break;
+		default:
+			User::Leave(iStatus.Int());
+			break;
+		}
+	}