browserutilities/feedsengine/FeedsServer/UrlHandler/src/SessionHttpConnection.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/feedsengine/FeedsServer/UrlHandler/src/SessionHttpConnection.cpp Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,291 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: A class that fetches resources via HTTP 1.1.
+*
+*/
+
+
+#include "SessionHttpConnection.h"
+#include "FeedsServerSession.h"
+#include "Logger.h"
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::NewL
+//
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSessionHttpConnection* CSessionHttpConnection::NewL( CFeedsServerSession& aFeedsSession )
+ {
+ CSessionHttpConnection* self = new (ELeave) CSessionHttpConnection( aFeedsSession );
+
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::CSessionHttpConnection
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSessionHttpConnection::CSessionHttpConnection( CFeedsServerSession& aFeedsSession ):
+ iLeakTracker( CLeakTracker::EHttpConnection ),
+ iFeedsSession( aFeedsSession )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSessionHttpConnection::ConstructL()
+ {
+ BaseConstructL();
+
+ User::LeaveIfError( iSocketServ.Connect() );
+ iConnName = HBufC::NewL( KMaxName );
+ Reset();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::~CSessionHttpConnection
+// Deconstructor.
+// -----------------------------------------------------------------------------
+//
+CSessionHttpConnection::~CSessionHttpConnection()
+ {
+ // close http session
+ iSession.Close();
+
+ // close RConnection
+ Disconnect();
+ delete iConnName;
+
+ // close RSocketServer
+ iSocketServ.Close();
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::CreateConnection
+//
+// It propagates the connection callback to the browser client.
+// -----------------------------------------------------------------------------
+//
+TInt CSessionHttpConnection::CreateConnection(TInt* aConnectionPtr, TInt* aSockSvrHandle,
+ TBool* aNewConn, TApBearerType* aBearerType)
+ {
+ TInt err = KErrNone;
+
+ // If need be establish the connection.
+ if( !IsConnected() )
+ {
+ // Prepare connection name & bearer type ready for client response.
+ Reset();
+
+ // server session ask client app for connection
+ TRAP( err, iFeedsSession.NetworkConnectionNeededL() );
+
+ if ( err == KErrNone )
+ {
+ // Start the scheduler to wait for client response. Scheduler will be stopped
+ // when client informs the server which bearer to use.
+ //
+ // See:
+ //
+ // [SERVER]
+ // CFeedsServerSession::SetConnectionL
+ // CSessionHttpConnection::SetConnection
+ //
+ // [CLIENT]
+ // CFolderItemRequestHandler::RequestCompletedL ("EFeedsServerConnectionNeeded")
+ // CFeedRequestHandler::RequestCompletedL ("EFeedsServerConnectionNeeded")
+ //
+ iWait.Start();
+
+ // At this point, assuming that the client was able to provide us
+ // with the connection information then we are able to open the specified
+ // connection.
+ //
+ // If not (e.g. client cancelled connection request) then we must clean up
+ // and handle the error.
+ if ( ConnectionInformationProvidedByClient() )
+ {
+ // connection info come back in response from client
+ TName connName;
+ connName.Copy( *iConnName );
+ err = iConnection.Open( iSocketServ, connName );
+
+ if ( err == KErrNone )
+ {
+ *aNewConn = ETrue;
+
+ if (iObserver != NULL)
+ {
+ iObserver->ConnectionAvailable();
+ }
+ }
+ }
+ else
+ {
+ // Use current connection error value if the client was
+ // not able to supply connection parameters.
+ err = iConnectionError;
+ }
+ }
+ }
+ else
+ {
+ // Otherwise the existing connection is valid and no new connection
+ // is required.
+ *aNewConn = EFalse;
+ }
+
+ // End of process - either set up the reference/pointer arguments for
+ // a successful connection initiation, or then inform the observer of
+ // the error.
+ if ( err == KErrNone )
+ {
+ *aConnectionPtr = (TInt) &iConnection;
+ *aSockSvrHandle = iSocketServ.Handle();
+ *aBearerType = iBearerType;
+ }
+ else
+ {
+ // Notify the HttpHandler that the establishing the access point failed
+ if (iObserver != NULL)
+ {
+ iObserver->ConnectionFailed(err);
+ }
+ }
+
+ return err;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::IsConnected
+//
+// Returns whether or not the connection is active.
+// -----------------------------------------------------------------------------
+//
+TBool CSessionHttpConnection::IsConnected()
+ {
+ if ( !iConnection.SubSessionHandle() )
+ {
+ iConnStage = KConnectionUninitialised;
+ }
+ else
+ {
+ TNifProgress progress;
+ iConnection.Progress( progress );
+ iConnStage = progress.iStage;
+ }
+
+ return iConnStage == KLinkLayerOpen;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::Disconnect
+//
+// Closes the connection.
+// -----------------------------------------------------------------------------
+//
+void CSessionHttpConnection::Disconnect()
+ {
+ if (IsConnected())
+ {
+ iConnection.Close();
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::CancelAnyConnectionAttempt
+//
+// Closes the connection.
+// -----------------------------------------------------------------------------
+//
+void CSessionHttpConnection::CancelAnyConnectionAttempt()
+ {
+ SetObserver(NULL);
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+
+ Reset();
+
+ iConnectionError = KErrCancel;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CSessionHttpConnection::SetConnection
+//
+// Sets the connection.
+// -----------------------------------------------------------------------------
+//
+TBool CSessionHttpConnection::SetConnection( TDesC& aName, TInt aBearerType )
+ {
+ TBool ret = EFalse;
+
+ // unblocking
+ if ( iWait.IsStarted() )
+ {
+ iConnName->Des().Copy( aName );
+ iBearerType = (TApBearerType) aBearerType;
+ iConnectionError = KErrNone;
+
+ ret = ETrue;
+
+ iWait.AsyncStop();
+ }
+
+ return ret;
+ }
+
+
+//--------------------------------------------------------------------------
+//CSessionHttpConnection::Reset()
+//--------------------------------------------------------------------------
+void CSessionHttpConnection::Reset()
+ {
+ iConnectionError = KErrNotReady;
+ iConnName->Des().Zero();
+ iBearerType = EApBearerTypeAllBearers;
+ }
+
+
+//--------------------------------------------------------------------------
+//CSessionHttpConnection::ConnectionInformationProvidedByClient()
+//--------------------------------------------------------------------------
+TBool CSessionHttpConnection::ConnectionInformationProvidedByClient() const
+ {
+ return ( iConnName->Length() > 0 );
+ }
+
+
+
+