applayerprotocols/httpservice/src/chttpnetworkconnectioninfo.cpp
branchRCL_3
changeset 9 2611c08ee28e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/applayerprotocols/httpservice/src/chttpnetworkconnectioninfo.cpp	Wed Mar 31 22:32:15 2010 +0300
@@ -0,0 +1,204 @@
+// Copyright (c) 2003-2010 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  <httpservice.h>
+#include <es_enum.h>
+#include "CConnectionMonitor.h"
+
+
+CHttpNetworkConnection::CHttpNetworkConnection()
+    {
+    }
+
+CHttpNetworkConnection::~CHttpNetworkConnection()
+    {
+    if (iConnInfo)
+        {
+        iConnInfo->iConnection.Close();
+        iConnInfo->iSocketServ.Close();
+        delete iConnInfo;
+        }
+    if (iConnectionMonitor)
+        {
+        delete iConnectionMonitor;
+        }
+    }
+CHttpNetworkConnection* CHttpNetworkConnection::New( )
+    {
+    CHttpNetworkConnection* self = new (ELeave)  CHttpNetworkConnection() ;
+    self->ConstructL();
+    return self;
+    }
+
+void CHttpNetworkConnection::ConstructL()
+    {
+    iConnInfo = new (ELeave) CConnectionInfo();
+    }
+
+void CHttpNetworkConnection::SetHttpService(CHttpService *aService)
+    {
+    iHttpService = aService;
+    }
+
+/**
+ * Start the network connection for  HTTP transactions.
+ * Default connection prefernces will be used.
+ * 
+ * @return KErrNone if connection opening is successful, otherwise relevant errors.
+ */
+EXPORT_C TInt CHttpNetworkConnection::Start()
+    {
+    TRequestStatus requestStatus;
+    TInt status;
+    if (! iConnInfo->iConnectionStatus)
+        {
+        status = SetupConnection();
+        if (status == KErrNone)
+            {
+            iConnInfo->iConnection.Start( requestStatus);
+            User::WaitForRequest(requestStatus);
+            status = requestStatus.Int();
+            }
+        }
+    else
+        {
+        status = KErrAlreadyExists;
+        }
+    if (status == KErrNone)
+        {
+        AssociateConnectionWithHttpSession();
+        }
+    return status;
+    }
+
+/**
+ * Start the network connection for  HTTP transactions.
+ * 
+ * @param aConnPref - connection prefernces can be specified.
+ * @param aAttachType - EFalse 
+ * 
+ * @return KErrNoMemory incase of failure otherwise KErrNone for success
+ * 
+ */
+EXPORT_C TInt CHttpNetworkConnection::Start(TCommDbConnPref aConnPref, TBool aAttachType)
+    {
+    TInt status;
+    iConnInfo->iConnPref = aConnPref;
+
+    if (aAttachType && !iConnInfo->iConnectionStatus )
+        {
+        TUint count;
+        TConnectionInfoBuf connInfoPckg;
+        
+        status = SetupConnection();
+                
+        if ( status == KErrNone && iConnInfo->iConnection.EnumerateConnections(count) == KErrNone )
+            {
+            for (TUint i=1; i<=count; i++)
+                {
+                // Note  GetConnectionInfo expects 1-based index
+                if ( iConnInfo->iConnection.GetConnectionInfo( i, connInfoPckg ) == KErrNone )
+                    {
+                    if ( connInfoPckg().iIapId == iConnInfo->iConnPref.IapId() )
+                        {
+                        status= iConnInfo->iConnection.Attach(iConnInfo->iConnPref, RConnection::EAttachTypeNormal);
+                        return status;
+                        }
+                    }   
+                }
+            }
+        return KErrNotFound;
+        }
+    else
+        {
+        if (!iConnInfo->iConnectionStatus)
+            {
+            status = SetupConnection();
+            if (status == KErrNone)
+                {
+                TRequestStatus requestStatus;
+                iConnInfo->iConnection.Start(iConnInfo->iConnPref,requestStatus);
+                User::WaitForRequest(requestStatus);
+                status = requestStatus.Int();
+                }
+          
+            }
+        else
+            {
+            status = KErrAlreadyExists;
+            }
+        if (status == KErrNone)
+            {
+            AssociateConnectionWithHttpSession();
+            }
+        
+        return status;
+        }
+    }
+
+
+/**
+ * To Stop the network connection 
+ * 
+  */
+EXPORT_C void CHttpNetworkConnection::Stop()
+    {
+    if (iConnInfo->iConnectionStatus)
+        {
+        iConnInfo->iConnectionStatus = EFalse;
+        iConnInfo->iConnection.Close();
+        iConnInfo->iSocketServ.Close();
+        }
+    }
+
+void CHttpNetworkConnection::AssociateConnectionWithHttpSession()
+    {
+    RStringPool strP = iHttpService->Session().StringPool();
+    RHTTPConnectionInfo connInfo = iHttpService->Session().ConnectionInfo();
+    connInfo.SetProperty(strP.StringF(HTTP::EHttpSocketServ,RHTTPSession::GetTable()), THTTPHdrVal(iConnInfo->iSocketServ.Handle()));
+    TInt connPtr = reinterpret_cast<TInt>(&(iConnInfo->iConnection));
+    connInfo.SetProperty(strP.StringF(HTTP::EHttpSocketConnection,RHTTPSession::GetTable()), THTTPHdrVal(connPtr));
+    }
+
+TInt CHttpNetworkConnection::SetupConnection()
+    {
+    TInt status = KErrAlreadyExists;
+    if (!iConnInfo->iConnectionStatus )
+        {
+        status = iConnInfo->iSocketServ.Connect() ;
+        if (status == KErrNone)
+            {
+            status = iConnInfo->iConnection.Open ( iConnInfo->iSocketServ ) ;
+            if (status != KErrNone)
+                {
+                iConnInfo->iSocketServ.Close();
+                }
+            else
+                {
+                iConnectionMonitor = CConnectionMonitor::NewL(this); 
+                iConnInfo->iConnectionStatus = ETrue;
+                }
+            }
+        }
+    return status;
+    }
+
+void CHttpNetworkConnection::HandleConnectionEvent(TInt aError)
+    {
+    if (aError == KLinkLayerClosed || aError == KLinkLayerClosed)
+        {
+        iConnInfo->iConnectionStatus = EFalse;
+        }
+    }
+