browserutilities/feedsengine/FeedsServer/UrlHandler/src/SessionHttpConnection.cpp
changeset 0 dd21522fd290
--- /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 );
+   	}
+
+
+
+