diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/common_tsy/test/integration/src/chttpdownload.cpp --- /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 +#include + +// 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 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 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; + } + } +