telephonyserverplugins/common_tsy/test/integration/src/chttpdownload.cpp
changeset 0 3553901f7fa8
child 19 630d2f34d719
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telephonyserverplugins/common_tsy/test/integration/src/chttpdownload.cpp	Tue Feb 02 01:41:59 2010 +0200
@@ -0,0 +1,410 @@
+// Copyright (c) 2007-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 "chttpdownload.h"
+#include "cctsytestlogging.h"
+#include <cs_subconparams.h>
+#include <networking/qos3gpp_subconparams.h>
+
+// Declare a static, single, server socket session to be used with all active downloads
+RSocketServ CHTTPDownload::iSocketServer;
+// Declare a static, counter fot active downloads, to know when to open and close the server socket session
+TInt CHTTPDownload::iActiveDownload = 0;
+
+_LIT(KDefaultHost, "www.smartphoneshow.com");
+_LIT(KDefaultPage, "/newt/l/downloads/symbian/presentations/Day1Pres1_NigelClifford_Symbian_keynote.pdf");
+const TInt KDefaultPort = 80;
+const TInt KBufferSize = 4096;
+
+CHTTPDownload::CHTTPDownload(CCTSYIntegrationTestSuiteStepBase *aTestStep): iOpenSocketServer(EFalse),
+																			iTestStep(aTestStep),
+                                                                            iSocketOpen(EFalse),
+                                                                            iHostResolverOpen(EFalse),
+                                                                            iConnectionOpen(EFalse),
+                                                                            iSubConnectionOpen(EFalse),
+                                                                            iWebPageOpen(EFalse)
+/*
+ * Constructor
+ * 
+ * @param aTestStep a pointer to the test step object
+ */
+                               
+    {
+    }
+
+CHTTPDownload::~CHTTPDownload()
+/*
+ * Destructor
+ * 
+ */
+    {
+    StopDownload();
+    if(iWebPageOpen)
+    	{
+    	iWebPage.Close();
+    	iWebPageOpen=EFalse;
+    	}
+    if(iOpenSocketServer)
+    	{
+    	iActiveDownload--;
+    	TEST_FRAMEWORK_LOG2(_L("iActiveDownload changed  iActiveDownload = %d"),iActiveDownload);    
+    	if(iActiveDownload==0)
+    		{
+    		iSocketServer.Close();
+    		TEST_FRAMEWORK_LOG2(_L("iSocketServer Closed iActiveDownload = %d"),iActiveDownload);    
+    		}
+    	}
+    }
+
+
+TBool CHTTPDownload::StartDownloadL()
+/*
+ * Start download an http page with default parameters
+ * 
+ *
+ * @return ETrue if the download started
+ */
+    {
+    iHost = &KDefaultHost;
+    iPage = &KDefaultPage;
+    iPort = KDefaultPort;
+    iUseSubConnection = EFalse;
+    if(InitSocket()!=KErrNone)
+    	{
+    	Close();
+    	return EFalse;
+    	}
+	return ETrue;
+    }
+
+TBool CHTTPDownload::StartDownloadL(const TDesC &aHost, const TDesC &aPage)
+/*
+ * Start download a requested http page with default port 
+ * 
+ * @param aHost a descriptor of the web host (i.e. www.symbian.com)
+ * @param aPage The actual page (i.e. /symbianos/index.html)
+ *
+ * @return ETrue if the download started
+ */
+    {
+    iHost = &aHost;
+    iPage = &aPage;
+    iPort = KDefaultPort;
+    iUseSubConnection = EFalse;
+    if(InitSocket()!=KErrNone)
+    	{
+    	Close();
+    	return EFalse;
+    	}
+	return ETrue;
+    }
+
+TBool CHTTPDownload::StartDownloadL(const TDesC &aHost, const TDesC &aPage,TInt aPort)
+/*
+ * Start download a requested http page with a requested port
+ * 
+ * @param aHost a descriptor of the web host (i.e. www.symbian.com)
+ * @param aPage The actual page (i.e. /symbianos/index.html)
+ * @param aPort the protocol port (80 for HTTP)
+ *
+ * @return ETrue if the download started
+ */
+    {
+    iHost = &aHost;
+    iPage = &aPage;
+    iPort = aPort;
+    iUseSubConnection = EFalse;
+    if(InitSocket()!=KErrNone)
+    	{
+    	Close();
+    	return EFalse;
+    	}
+	return ETrue;
+    }
+
+
+TBool CHTTPDownload::StartDownloadWithSecondaryContextL(const TDesC &aHost, const TDesC &aPage, TInt aPort)
+/*
+ * Start download a requested http page with a requested port using a sub connection
+ * 
+ * @param aHost a descriptor of the web host (i.e. www.symbian.com)
+ * @param aPage The actual page (i.e. /symbianos/index.html)
+ * @param aPort the protocol port (80 for HTTP)
+ *
+ * @return ETrue if the download started
+ */
+	{
+    iHost = &aHost;
+    iPage = &aPage;
+    iPort = aPort;
+    iUseSubConnection = ETrue;
+    if(InitSocket()!=KErrNone)
+    	{
+    	Close();
+    	return EFalse;
+    	}
+	return ETrue;
+	}
+
+TInt CHTTPDownload::GetByteCount()
+/*
+ * Return the number of bytes downloaded so far
+ * 
+ * @return The number of bytes downloaded so far
+ */
+    {
+    VerifyDownloading();
+    return iByteCount;
+    }
+
+void CHTTPDownload::StopDownload()
+/*
+ * Stop a active download; waits for the current socket read to complete, rather than force an immediate terminate.
+ * 
+ */
+    {
+    if(iSocketOpen)
+    	{
+    	iSocket.CancelRecv();
+    	}
+    Close();
+    }
+
+TBool CHTTPDownload::VerifyDownloading()
+/*
+ * Return ETrue if the download is still active
+ * 
+ * @return ETrue if the download is still active
+ */
+    {
+    if(iSocketOpen)
+    	{
+    	if(iStatus.Int()==KRequestPending)
+    		{
+    		return ETrue;
+    		}
+    	else if (iStatus.Int()==KErrNone)
+    		{
+    		iByteCount += iWebPage.Length();
+
+            // Logging the first 180 characters of the text...
+            TBuf<200> temp;
+            temp.Copy(iWebPage.Left(180));
+            TEST_FRAMEWORK_LOG3(_L("Got %S... in %d chars"),&temp,iWebPage.Length());
+    		
+    		iSocket.RecvOneOrMore(iWebPage,0,iStatus,iHttpHeaderLen);
+    		return  ETrue;
+    		}
+    	else 
+    		{
+    		iByteCount += iWebPage.Length();
+    		Close();
+    		return EFalse;
+    		}
+    		
+    	}
+    else
+    	{
+    	return EFalse;
+    	}
+    }
+
+
+
+
+TInt CHTTPDownload::InitSocket()
+/*
+ * Initilize a socket 
+ * 
+ * @return KErrNone if it had no problem, or the specific system error code that cause the problem.
+ */
+	{
+	TInt status;
+    if(!iWebPageOpen)
+    	{
+    	status = iWebPage.Create(KBufferSize);
+    	if(status !=KErrNone)
+    		{
+    		TEST_FRAMEWORK_LOG2(_L("RRBuf8::Create Could not create a buffer, got %d"),status);
+    		return status;
+    		}
+    	iWebPageOpen = ETrue;
+    	}
+    if(!iOpenSocketServer)
+    	{
+    	if(iActiveDownload==0)
+    		{
+    		status = iSocketServer.Connect();
+    		TEST_FRAMEWORK_LOG3(_L("iSocketServer.Connected, status = %d, iActiveDownload = %d"),status, iActiveDownload);
+    		if(status !=KErrNone)
+    			{
+    			TEST_FRAMEWORK_LOG2(_L("RConnection::Open Could not open a socket servet session, got %d"),status);
+    			return status;
+    			}
+    		}
+    	iActiveDownload++;
+    	iOpenSocketServer = ETrue;
+    	}
+    TEST_FRAMEWORK_LOG2(_L("iActiveDownload changed  iActiveDownload = %d"),iActiveDownload);
+    if(iUseSubConnection)
+    	{
+    	if(!iConnectionOpen)
+    		{
+    		status = iConnection.Open(iSocketServer);
+    		if(status != KErrNone) 
+    			{
+    			TEST_FRAMEWORK_LOG2(_L("RConnection::Open Could not open a connection, got %d"),status);
+    			return status;
+    			}
+    		iConnectionOpen=ETrue;
+    		}
+        status=iConnection.Start();
+        if(status != KErrNone)
+            {
+            TEST_FRAMEWORK_LOG2(_L("RConnection::Start Could not start a connection, got %d"),status);
+            return status;
+            }
+        if(!iSubConnectionOpen)
+            {
+            status = iSubConnection.Open(iSocketServer,RSubConnection::ECreateNew,iConnection);
+            if(status != KErrNone)
+                {
+                TEST_FRAMEWORK_LOG2(_L("RSubConnection::Open Could not open a sub connection, got %d"),status);
+                return status;
+                }
+            iSubConnectionOpen=ETrue;
+            }
+        }
+    if(!iSocketOpen)
+    	{
+    	if(iSubConnectionOpen)
+    		{
+        	status = iSocket.Open(iSocketServer, KAfInet, KSockStream, KProtocolInetTcp,iSubConnection);
+        	}
+        else
+        	{
+        	status = iSocket.Open(iSocketServer, KAfInet, KSockStream, KProtocolInetTcp);
+        	}
+        if(status != KErrNone)
+            {
+            TEST_FRAMEWORK_LOG2(_L("RSocket::Open Could not open a socket, got %d"),status);
+            return status;
+            }
+        iSocketOpen=ETrue;
+        }
+    if(!iHostResolverOpen)
+        {
+        status = iHostResolver.Open(iSocketServer, KAfInet, KProtocolInetUdp);
+        if(status != KErrNone)
+            {
+            TEST_FRAMEWORK_LOG2(_L("RHostResolver::Open Could not open an host resolver, got %d"),status);
+            return status;
+            }
+        iHostResolverOpen=ETrue;
+        }
+	iHostResolver.GetByName(*iHost, iHostNameEntry, iStatus);
+	User::WaitForRequest(iStatus);
+	if(iStatus.Int()!=KErrNone)
+		{
+        TEST_FRAMEWORK_LOG2(_L("RHostResolver::GetByName Could get host by name, got %d"),iStatus.Int());
+        return iStatus.Int(); 
+		}
+	return Connect();
+	}
+
+TInt CHTTPDownload::Connect()
+/*
+ * Connect to the host 
+ * 
+ * @return KErrNone, if it had no problem, or the specific system error code that cause the problem.
+ */
+	{
+	TInetAddr addr(iHostNameEntry().iAddr);
+	addr.SetPort(iPort);
+	
+	TCoreEtelRequestStatus<RSocket> connectStatus(iSocket, &RSocket::CancelConnect);
+	iSocket.Connect(addr, connectStatus);
+	iTestStep->WaitForRequestWithTimeOut(connectStatus,ETimeLong);
+	if(connectStatus.Int()!=KErrNone)
+		{
+        TEST_FRAMEWORK_LOG2(_L("RSocket::Connect Could not connect to the host, got %d"),connectStatus.Int());
+        return connectStatus.Int();
+		}
+	return Get();
+	}
+
+TInt CHTTPDownload::Get()
+/*
+ * sends the GET request to the server 
+ * 
+ * @return KErrNone, if it had no problem, or the specific system error code that cause the problem.
+ */
+	{
+    TBuf8<200> httpGetLine;
+    TBuf8<200> host8;
+    TBuf8<200> page8;
+    host8.Copy(*iHost);
+    page8.Copy(*iPage);
+    httpGetLine.Format(_L8("GET %S HTTP/1.0\r\nHost: %S\r\n\r\n"),&page8,&host8);
+
+    TCoreEtelRequestStatus<RSocket> getStatus(iSocket, &RSocket::CancelWrite);
+    iSocket.Write(httpGetLine, getStatus);
+	iTestStep->WaitForRequestWithTimeOut(getStatus,ETimeLong);
+	if(getStatus.Int()!=KErrNone)
+		{
+        TEST_FRAMEWORK_LOG2(_L("RSocket::Write Could not write to the host, got %d"),getStatus.Int());
+        return getStatus.Int();
+		}
+	
+    iByteCount = 0;
+	iSocket.RecvOneOrMore(iWebPage,0,iStatus,iHttpHeaderLen);
+	if(iStatus==KRequestPending)
+		{
+		return KErrNone;
+		}
+    return iStatus.Int();
+	}
+
+
+
+void CHTTPDownload::Close()
+/*
+ * Close everything... 
+ * 
+ */
+	{
+    if(iHostResolverOpen)
+        {
+        iHostResolver.Close();
+        iHostResolverOpen=EFalse;
+        }
+    if(iSocketOpen)
+    	{
+        iSocket.Close();
+        iSocketOpen=EFalse;
+    	}
+    if(iSubConnectionOpen)
+    	{
+    	iSubConnection.Close();
+    	iSubConnectionOpen = EFalse;
+    	}
+    if(iConnectionOpen)
+    	{
+    	iConnection.Close();
+    	iConnectionOpen = EFalse;
+    	}
+	}
+