browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrClntSubSession.cpp
changeset 0 dd21522fd290
child 5 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrClntSubSession.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,3449 @@
+/*
+* Copyright (c) 2004 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: 
+*     This file contains the declaration of the Client interface of Download Mgr Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include "DownloadMgrLogger.h"
+#include "DownloadMgrClient.h"
+#include "DownloadMgrServer.h"
+#include "DownloadMgrHandler.h"
+#include "DownloadMgrStart.h"
+#include "DownloadMgrDef.h"
+#include "DownloadMgrTransObserver.h"
+#include "DownloadMgrCod.h"
+#include "DownloadMgrDefAttrib.h"
+#include "DownloadDataServ.h"
+
+#include <hash.h>
+#include <e32svr.h>
+#include <CodDownload.h>
+#include <AiwGenericParam.h>
+#include <eikenv.h>
+#include <HttpFilterCommonStringsExt.h>
+#include <EscapeUtils.h>
+
+// CONSTANTS
+_LIT8( KTransactionCallback, "TransactionCallback" );
+const TInt KInitPrevCodEvent = -1;
+
+// GLOBAL FUNCTIONS
+
+// -----------------------------------------------------------------------------
+// HashL
+// Calculates hash value
+// -----------------------------------------------------------------------------
+//
+void HashL( const TDesC8& aMessage, TDes8& aHash )
+	{
+	// Calculate the 128 bit (16 byte) hash
+	CMD5* md5Calculator = CMD5::NewL();
+	CleanupStack::PushL( md5Calculator );
+	
+	md5Calculator->Reset();
+	TPtrC8 hash = md5Calculator->Hash( aMessage );
+	// Now print it as a 32 byte hex number
+	aHash.Zero();
+	_LIT8(formatStr, "%02x");
+	for (TInt ii = 0; ii < KRawHashLength; ii++)
+		{
+		TBuf8<2> scratch;
+		scratch.Zero();
+		scratch.Format( formatStr, hash[ii] );
+		aHash.Append( scratch );
+		}
+	CleanupStack::PopAndDestroy( md5Calculator );  // MD5Calculator
+	}
+
+
+/**
+*
+* Extension class.
+*
+* This class will be used to cache the closed subsession information.
+* Required subsession information will be stored in this class before closing the subsession.
+*
+*/
+NONSHARABLE_CLASS( CRHttpDlExtension ) : public CBase
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        */
+        static CRHttpDlExtension* NewL();
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CRHttpDlExtension();
+
+    protected: // Constructors
+
+        /**
+        * C++ default constructor.
+        */
+        CRHttpDlExtension();
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+    public:
+
+		/**
+		* Sets the value for a TBool attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetBoolAttribute( const TUint aAttribute, TBool aValue );
+        
+		
+		/**
+		* Sets the value for a TInt attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetIntAttribute( const TUint aAttribute, TInt32 aValue );
+        
+		/**
+		* Sets the value for a TDesC8 attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetStringAttribute( const TUint aAttribute, const TDesC8& aValue );
+        
+        
+        
+        /**
+		* Sets the value for a TDesC16 attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aMoIndex Identifies the media object index.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+		
+        void SetStringAttribute( const TUint aAttribute,  
+                                                 const TInt32& aMoIndex,
+                                                 const TDesC16& aValue );
+        
+
+		/**
+		* Sets the value for a TDesC8 attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetStringAttribute( const TUint aAttribute, const TDesC16& aValue );
+        
+        /**
+		* Gets the value for a TBool attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TInt attribute.
+        * @return TBool - attribute found.
+		*/        
+        TInt GetBoolAttribute( const TUint aAttribute, TBool& aValue );
+
+        /**
+		* Gets the value for a TBool attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aMoIndex Identifies the media object index.
+		* @param aValue On completion, contains the requested TInt attribute.
+        * @return TBool - attribute found.
+		*/        
+        TInt GetBoolAttribute( const TUint aAttribute,
+                                               const TInt32& aMoIndex,
+                                               TBool& aValue );
+        /**
+		* Gets the value for a TInt attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TInt attribute.
+        * @return TBool - attribute found.
+		*/        
+        TInt GetIntAttribute( const TUint aAttribute, TInt32& aValue );
+        
+        /**
+		* Gets the value for a TInt attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aMoIndex Identifies the media object index.
+		* @param aValue On completion, contains the requested TInt attribute.
+        * @return TBool - attribute found.
+		*/
+		TInt GetIntAttribute( const TUint aAttribute, 
+                                              const TInt32& aMoIndex,
+                                              TInt32& aValue );
+        
+		/**
+		* Gets the value for a TDes8 attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TDes16 attribute.
+        * @return TBool - attribute found.
+		*/        
+        TInt GetStringAttribute( const TUint aAttribute, TDes8& aValue );
+        
+        /**
+		* Gets the value for a TDes8 attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aMoIndex Identifies the media object index.
+		* @param aValue On completion, contains the requested TDes16 attribute.
+        * @return TBool - attribute found.
+		*/        
+        TInt GetStringAttribute( const TUint aAttribute,
+                                                 const TInt32& aMoIndex,
+                                                 TDes8& aValue );
+        
+		/**
+		* Gets the value for a TDes16 attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TDes16 attribute.
+        * @return TBool - attribute found.
+		*/         
+        TInt GetStringAttribute( const TUint aAttribute, TDes16& aValue );
+        
+        /**
+		* Gets the value for a TDes16 attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aMoIndex Identifies the media object index.
+		* @param aValue On completion, contains the requested TDes16 attribute.
+        * @return TBool - attribute found.
+		*/
+        TInt GetStringAttribute( const TUint aAttribute,
+                                                 const TInt32& aMoIndex,
+                                                 TDes16& aValue );
+        
+        /**
+		* Sets the value for a TInt attribute.
+		* @param aCodDlData The Cod downloaded data.
+		* @return None.
+		*/        
+        void SetCodaData( CDownloadDataServ* aCodDlData );
+                
+		
+    private: // Data
+
+        //EDlAttrCodDownload,
+        TBool iCodDownload;
+        //EDlAttrCodPdAvailable,
+        TBool   iCodPdAvailable;
+        // EDlAttrNoMedia
+        TBool   iNoMedia;
+        // EDlAttrHidden
+        TBool   iHidden;
+        // EDlAttrProgressive
+        TBool   iProgressiveDownload;  
+        // EDlAttrPausable
+        TBool   iPausable;             
+        // EDlAttrDestRemovable
+        TBool   iRemovableDest;
+
+        //  EDlAttrState THttpDownloadState
+         TInt32 iDlState;
+        // EDlAttrProgressState
+        TInt32  iProgState;
+
+		// EDlAttrContentType
+        HBufC8*     iContentType;
+        // EDlAttrCurrentUrl
+        HBufC8* iCurrentUrl;  
+        // EDlAttrReqUrl
+        HBufC8*	iReqUrl;
+        
+		TBuf8<KHashLength> iHashedMsg;
+
+        // EDlAttrId
+        TInt32  iId;    
+        // EDlAttrDownloadedSize
+        TInt32      iDownloadedSize;
+        //iDownloadLength
+        TInt32	iDownloadLength;
+
+        //EDlAttrName
+        HBufC*  iDlName;
+        //EDlAttrDestFilename<KMaxPath>
+        HBufC* iDestFileName;
+        
+        //Album Data
+        CDownloadDataServ* iCodDlData;
+
+        //Number of media objects
+        TInt32 iNumMediaObjects;
+        
+        //Active Download
+        TInt32 iActiveDownload;
+        
+        //EDlAttrErrorId
+        TInt32 iLastError;
+        //EDlAttrGlobalErrorId
+        TInt32 iGlobalErrorId;        
+    };
+
+        
+// -----------------------------------------------------------------------------
+// CRHttpDlExtension::CRHttpDlExtension
+// -----------------------------------------------------------------------------
+//
+CRHttpDlExtension::CRHttpDlExtension()
+    {
+    CLOG_CREATE;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDlExtension::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CRHttpDlExtension::ConstructL()
+    {
+    CLOG_ENTERFN("CRHttpDlExtension::ConstructL");
+    iContentType = HBufC8::NewMaxL( KMaxContentTypeLength );
+    iDestFileName = HBufC::NewMaxL( KMaxPath );
+    iDlName = HBufC::NewMaxL( KDownloadNameMaxSize );
+    iCurrentUrl = HBufC8::NewMaxL( KMaxUrlLength );
+    iReqUrl = HBufC8::NewMaxL( KMaxUrlLength );
+    iCodDlData = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDlExtension::NewL
+// -----------------------------------------------------------------------------
+//
+CRHttpDlExtension* CRHttpDlExtension::NewL()
+    {
+    CRHttpDlExtension* self = new(ELeave)CRHttpDlExtension();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDlExtension::~CRHttpDlExtension
+// -----------------------------------------------------------------------------
+//
+CRHttpDlExtension::~CRHttpDlExtension()
+    {
+    delete iContentType;
+    delete iDestFileName;
+    delete iDlName;
+    delete iCurrentUrl;
+    delete iReqUrl;
+    
+    if(iCodDlData )
+        {
+        delete iCodDlData;	
+        }
+        
+
+    
+    CLOG_CLOSE;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDlExtension::SetBoolAttribute
+// -----------------------------------------------------------------------------
+//
+void CRHttpDlExtension::SetBoolAttribute( const TUint aAttribute, TBool aValue )
+    {
+    switch( aAttribute )
+        {
+        case EDlAttrCodDownload:
+            {
+            iCodDownload = aValue;
+            }
+            break;
+            
+        case EDlAttrCodPdAvailable:
+            {
+            iCodPdAvailable = aValue;
+            }
+            break;
+        case EDlAttrNoMedia:
+            {
+            iNoMedia = aValue;
+            }
+            break;
+            
+        case EDlAttrHidden:
+            {
+            iHidden = aValue;
+            }
+            break;
+      
+       case EDlAttrProgressive:
+            {
+            iProgressiveDownload = aValue;
+            }
+            break;
+            
+        case EDlAttrPausable:
+            {
+            iPausable = aValue;
+            }
+            break;
+                  
+       case EDlAttrDestRemovable:
+            {
+       	     iRemovableDest = aValue;
+            }
+            
+        default:
+            {
+            }
+            break;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDlExtension::SetIntAttribute
+// -----------------------------------------------------------------------------
+//
+void CRHttpDlExtension::SetIntAttribute( const TUint aAttribute, TInt32 aValue )
+    {
+    switch( aAttribute )
+        {
+        case EDlAttrDownloadedSize:
+        case EDlAttrMultipleMODownloadedSize:
+            {
+            iDownloadedSize = aValue;
+            }
+            break;
+            
+        case EDlAttrLength:
+        case EDlAttrMultipleMOLength:
+            {
+            iDownloadLength = aValue;
+            }
+            break;
+        
+        case EDlAttrId:
+            {
+			iId = aValue;
+            }
+            
+        case EDlAttrState:
+            {
+            iDlState = (TInt32) aValue;
+            }
+            break;
+        
+        case EDlAttrProgressState:
+            {
+			iProgState = aValue;
+            }
+            break;
+            
+		case EDlAttrNumMediaObjects:         
+			{
+			iNumMediaObjects = aValue;
+			}
+			break;
+			
+		case EDlAttrErrorId:
+            {
+            iLastError = aValue;
+            }
+            break;
+            
+        case EDlAttrGlobalErrorId:
+            {
+            iGlobalErrorId = aValue;
+            }
+            break;
+
+        case EDlAttrActiveDownload:  
+            {
+            iActiveDownload = aValue;
+            }
+            break;
+            
+        default:
+            break;
+        }
+    }
+    
+// ---------------------------------------------------------
+// CRHttpDlExtension::SetStringAttribute
+// ---------------------------------------------------------
+//
+void CRHttpDlExtension::SetStringAttribute( const TUint aAttribute, const TDesC8& aValue )
+    {
+    switch( aAttribute )
+		{
+		case EDlAttrName:
+            {
+			iDlName->Des().Copy(aValue);
+            }
+            break;
+                     
+		case EDlAttrDestFilename:
+            {
+			iDestFileName->Des().Copy(aValue);
+            }
+            break;
+
+		case EDlAttrContentType:
+            {
+            iContentType->Des().Copy(aValue);
+            }
+            break;
+
+        case EDlAttrCurrentUrl:
+            {
+			iCurrentUrl->Des().Copy(aValue);
+            }
+            break;
+            
+		case EDlAttrReqUrl:
+			{
+			iReqUrl->Des().Copy(aValue);
+			}
+			break;
+			
+		case EDlAttrHashedMsgBody:
+			{
+			iHashedMsg.Copy(aValue);
+			}
+			break;			
+			
+		default:
+            break;
+        }    
+    }
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::SetStringAttribute
+// ---------------------------------------------------------
+//
+void CRHttpDlExtension::SetStringAttribute( const TUint aAttribute, const TDesC16& aValue )
+    {
+    switch( aAttribute )
+        {
+		case EDlAttrName:
+            {
+			iDlName->Des().Copy(aValue);
+            }
+            break;
+                     
+		case EDlAttrDestFilename:
+            {
+			iDestFileName->Des().Copy(aValue);
+            }
+            break;
+
+		case EDlAttrContentType:
+            {
+            iContentType->Des().Copy(aValue);
+            }
+            break;
+
+        case EDlAttrCurrentUrl:
+            {
+			iCurrentUrl->Des().Copy(aValue);
+            }
+            break;
+
+		case EDlAttrReqUrl:
+			{
+			iReqUrl->Des().Copy(aValue);
+			}
+			break;
+			
+        case EDlAttrAlbumName:
+		    {
+		    if (iCodDlData)
+		        {
+		        iCodDlData->SetNameL(aValue);
+		        }
+		    }
+		    break;
+
+        default:
+            break;
+        }    
+    }
+
+    
+ 
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetBoolAttribute
+// ---------------------------------------------------------
+//
+
+void CRHttpDlExtension::SetStringAttribute( const TUint aAttribute,  
+                                                 const TInt32& aMoIndex,
+                                                 const TDesC16& aValue )
+    {
+
+    if (!iCodDlData)
+    	{
+    	return ;
+    	}
+    if ((aMoIndex <= KNonMoIndex) || (aMoIndex > iCodDlData->Count()))
+    	{
+    	return;
+    	}
+    	
+    CMediaDataBase* mediaData = (*iCodDlData)[aMoIndex];
+    
+     
+     switch( aAttribute )
+        {
+		             
+		case EDlAttrDestFilename:
+            {
+			mediaData->SetDestFilenameL(aValue);
+            }
+            break;
+
+		
+        default:
+            break;
+        }
+     }
+       
+ 
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetBoolAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetBoolAttribute( const TUint aAttribute, TBool& aValue )
+    {
+    TInt ret( KErrNone );
+    switch( aAttribute )
+        {
+		case EDlAttrCodDownload:
+			{
+            aValue = iCodDownload ;
+            }
+            break;
+            
+		case EDlAttrCodPdAvailable:
+            {
+            aValue = iCodPdAvailable ;
+            }
+            break;
+            
+		case EDlAttrNoMedia:
+            {
+			aValue = iNoMedia ;
+            }
+            break;
+            
+		case EDlAttrHidden:
+			{
+            aValue = iHidden ;
+            }
+            break;
+      
+		case EDlAttrProgressive:
+            {
+            aValue = iProgressiveDownload;
+            }
+            break;
+            
+		case EDlAttrPausable:
+            {
+            aValue = iPausable ;
+            }
+            break;
+                  
+		case EDlAttrDestRemovable:
+            {
+       	    aValue = iRemovableDest ;
+            }
+            break;    
+        default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+        }
+    return ret;  
+    }
+    
+
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetBoolAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetBoolAttribute( const TUint aAttribute,
+                                               const TInt32& aMoIndex,
+                                               TBool& aValue )
+    {
+    TInt ret( KErrNone );
+    
+    if (!iCodDlData)
+    	{
+    	aValue = 0;
+    	return ret;
+    	}
+    if ((aMoIndex <= KNonMoIndex) || (aMoIndex > iCodDlData->Count()))
+    	{
+    	return KErrArgument;
+    	}
+    	
+    CMediaDataBase* mediaData = (*iCodDlData)[aMoIndex];
+    
+    
+    switch( aAttribute )
+        {
+	        case EDlAttrRedirected:
+            {
+            aValue = mediaData->Redirected();
+            }
+            break;
+
+        case EDlAttrPausable:
+            {
+            aValue = mediaData->Pausable();
+            }
+            break;
+
+        case EDlAttrProgressive:
+            {
+            aValue = mediaData->ProgressiveDownload();
+            }
+            break;
+   
+        case EDlAttrDestRemovable:
+            {
+            aValue = mediaData->DesRemovable();
+            }
+            break;
+                
+        default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+        }
+    return ret;  
+    }
+    
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetIntAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetIntAttribute( const TUint aAttribute, TInt32& aValue )
+    {
+    TInt ret( KErrNone );
+    switch( aAttribute )
+        {
+        case EDlAttrDownloadedSize:
+        case EDlAttrMultipleMODownloadedSize:
+            {
+              aValue = iDownloadedSize;
+            }
+            break;
+            
+        case EDlAttrLength:
+        case EDlAttrMultipleMOLength:
+            {
+              aValue = iDownloadLength;
+            }
+            break;
+        
+        case EDlAttrId :
+            {
+             aValue = iId;
+            }
+            break;
+      
+        case EDlAttrState:
+            {
+             aValue = iDlState;
+            }
+            break;
+        
+        case EDlAttrProgressState:
+            {
+             aValue = iProgState;
+            }
+      
+            break;
+            
+		case EDlAttrNumMediaObjects:         
+			{
+			aValue = iNumMediaObjects;
+			break;
+			}
+			
+		case EDlAttrErrorId:
+            {
+            aValue = iLastError;
+            }
+            break;
+            
+        case EDlAttrGlobalErrorId:
+            {
+            aValue = iGlobalErrorId;
+            }
+            break;
+             
+        case EDlAttrActiveDownload:  
+            {
+            aValue = iActiveDownload;
+            }
+            break;
+            
+        default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+        }
+    return ret;  
+    }
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetIntAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetIntAttribute( const TUint aAttribute, 
+                                              const TInt32& aMoIndex,
+                                              TInt32& aValue  )
+    {
+    TInt ret( KErrNone );
+    
+    if (!iCodDlData)
+    	{
+    	aValue = 0;
+    	return ret;
+    	}
+    if ((aMoIndex <= KNonMoIndex) || (aMoIndex > iCodDlData->Count()))
+    	{
+    	return KErrArgument;
+    	}
+    
+    CMediaDataBase* mediaData = (*iCodDlData)[aMoIndex];
+    
+    
+    switch( aAttribute )
+        {
+        
+        case EDlAttrDownloadedSize:
+            {
+              aValue = iDownloadedSize;
+            }
+            break;
+            
+        case EDlAttrLength:
+            {
+              aValue = iDownloadLength;
+            }
+            break;
+            
+        case EDlAttrMultipleMOLength:
+            {
+			aValue = mediaData->Size();
+            }
+            break;
+
+        case EDlAttrMultipleMODownloadedSize:
+            {
+            // Calculate downloaded size of current media object from
+            // album downloaded size.
+            aValue = mediaData->DownloadedSize();
+            }
+            break;
+
+        case EDlAttrErrorId:
+            {
+            aValue = mediaData->LastErrorId();
+            }
+            break;
+
+        case EDlAttrGlobalErrorId:
+            {
+            aValue = mediaData->GlobalErrorId();
+            }
+            break;
+
+        case EDlAttrMethod:
+            {
+            aValue = mediaData->Method();
+            }
+            break;
+
+        default:
+            {
+            ret = KErrNotFound;
+        
+            }
+            break;
+        }
+    
+    return ret;  
+   
+   }
+
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetStringAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetStringAttribute( const TUint aAttribute, TDes8& aValue )
+    {
+    TInt ret( KErrNone );
+    switch( aAttribute )
+        {
+        case EDlAttrContentType:
+            {
+            aValue.Copy(iContentType->Des());
+            }
+            break;
+         case EDlAttrCurrentUrl:
+            {
+            aValue.Copy(iCurrentUrl->Des());
+            }
+            break;
+                 
+		case EDlAttrName:
+			{
+			aValue.Copy(iDlName->Des());
+			}
+			break;
+		case EDlAttrDestFilename:
+            {
+            aValue.Copy(iDestFileName->Des());
+            }
+            break;
+
+		case EDlAttrReqUrl:
+			{
+			aValue.Copy(iReqUrl->Des());
+			}
+          	break;
+          	
+		case EDlAttrHashedMsgBody:
+			{
+			aValue.Copy(iHashedMsg);
+			}
+			break;			
+          	
+        default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+        }
+    return ret;  
+    }
+
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::SetCodaData
+// ---------------------------------------------------------
+//
+void CRHttpDlExtension::SetCodaData( CDownloadDataServ* aCodDlData )
+{
+	iCodDlData = aCodDlData;
+}
+   
+
+        
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetStringAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetStringAttribute( const TUint aAttribute,
+                                                 const TInt32& aMoIndex, TDes8& aValue )
+    {
+
+    TInt ret( KErrNone );
+
+    if (!iCodDlData)
+    {
+    return (KErrNotFound);
+    }
+    
+    if ((aMoIndex <= KNonMoIndex) || (aMoIndex > iCodDlData->Count()))
+    	{
+    	return KErrArgument;
+    	}
+    	
+    CMediaDataBase* mediaData = (*iCodDlData)[aMoIndex];
+    switch( aAttribute )
+        {
+        case EDlAttrReqUrl:
+            {
+            aValue.Copy(mediaData->Url());
+            }
+            break;
+
+        case EDlAttrRedirUlr:
+            {
+             aValue.Copy(mediaData->RedirUrl());
+            }
+            break;
+
+        case EDlAttrContentType:
+            {
+            aValue.Copy(mediaData->Type());
+            }
+            break;
+
+         default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+     
+        }
+    
+ 
+    return ret; 	
+    }
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetStringAttribute
+// ---------------------------------------------------------
+//
+TInt CRHttpDlExtension::GetStringAttribute( const TUint aAttribute, TDes16& aValue )
+    {
+	TInt ret( KErrNone );
+	switch( aAttribute )
+		{
+		case EDlAttrContentType:
+            {
+			aValue.Copy(iContentType->Des());
+            }
+            break;
+
+        case EDlAttrCurrentUrl:
+            {
+			aValue.Copy(iCurrentUrl->Des());
+            }
+            break;
+
+		case EDlAttrName:
+			{
+			aValue.Copy(iDlName->Des());
+			}
+			break;
+			
+		case EDlAttrDestFilename:
+            {
+            aValue.Copy(iDestFileName->Des());
+            }
+            break;
+
+		case EDlAttrReqUrl:
+			{
+			aValue.Copy(iReqUrl->Des());
+			}
+            break;
+            
+        case EDlAttrAlbumName:
+            {
+            if (iCodDlData && (iCodDlData->Name().Compare(KNullDesC)))
+                {
+                aValue.Copy(iCodDlData->Name());
+                }
+            else
+                {
+                aValue.Copy(iDlName->Des());
+                }
+            }
+            break;
+            
+        default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+        }
+    return ret;  
+    }
+
+
+// ---------------------------------------------------------
+// CRHttpDlExtension::GetStringAttribute
+// ---------------------------------------------------------
+//    
+TInt CRHttpDlExtension::GetStringAttribute( const TUint aAttribute,
+                                                 const TInt32& aMoIndex,
+                                                 TDes16& aValue )
+    {
+    TInt ret( KErrNone );
+
+    if (!iCodDlData)
+    {
+    return (KErrNotFound);
+    }
+    
+    if ((aMoIndex <= KNonMoIndex) || (aMoIndex > iCodDlData->Count()))
+    	{
+    	return KErrArgument;
+    	}
+    	
+    CMediaDataBase* mediaData = (*iCodDlData)[aMoIndex];
+    switch( aAttribute )
+        {
+        case EDlAttrReqUrl:
+            {
+            aValue.Copy(mediaData->Url());
+            }
+            break;
+
+        case EDlAttrRedirUlr:
+            {
+             aValue.Copy(mediaData->RedirUrl());
+            }
+            break;
+
+        case EDlAttrContentType:
+            {
+            aValue.Copy(mediaData->Type());
+            }
+            break;
+
+        case EDlAttrDestFilename:
+            {
+            aValue.Copy(mediaData->DestFilename());
+            }
+            break;
+
+        case EDlAttrName:
+            {
+            if (aMoIndex == 1)
+            	{
+            	aValue.Copy(iDlName->Des());
+            	}
+            else
+	            {
+	            aValue.Copy(mediaData->Name());
+    	        }
+            }
+            break;
+         
+         default:
+            {
+            ret = KErrNotFound;
+            }
+            break;
+    
+  	
+        }
+        return ret;
+    }
+
+
+/**
+* Extension class.
+*/
+NONSHARABLE_CLASS( CRHttpDownloadExtension ) : public CBase
+    {
+    public:  // Constructors and destructor
+        
+        /**
+        * Two-phased constructor.
+        */
+        static CRHttpDownloadExtension* NewL();
+        
+        /**
+        * Destructor.
+        */
+        virtual ~CRHttpDownloadExtension();
+
+    protected: // Constructors
+
+        /**
+        * C++ default constructor.
+        */
+        CRHttpDownloadExtension();
+
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+
+    public:
+
+		/**
+		* Sets event type.
+		* @param aEventType.
+        * @return None.
+		*/
+        void SetEventType( THttpDownloadState aEventType );
+        
+		/**
+		* Allocate buffer.
+		* @param aIsBuffered - if it's true all the buffered attribs must be handled.
+        * @return HBufC8*.
+		*/        
+        HBufC8* AllocAttribBufL( TBool aIsBuffered = EFalse );
+        
+		/**
+		* Unpack event attributes.
+		* @param aPack Package to be unpacked.
+        * @return None.
+		*/         
+        void UnpackAttribL( const TDesC8& aPack );
+       
+		/**
+		* Sets the value for a TInt attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetIntAttribute( const TUint aAttribute, TInt32 aValue );
+        
+		/**
+		* Sets the value for a TDesC8 attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetStringAttribute( const TUint aAttribute, const TDesC8& aValue );
+        
+		/**
+		* Sets the value for a TDesC16 attribute.
+		* @param aAttribute Identifies the attribute to be set.
+		* @param aValue The value to be set.
+        * @return None.
+		*/        
+        void SetStringAttribute( const TUint aAttribute, const TDesC16& aValue );
+
+		/**
+		* Gets the value for a TInt attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TInt attribute.
+        * @return TBool - attribute found.
+		*/        
+        TBool GetIntAttribute( const TUint aAttribute, TInt32& aValue );
+        
+		/**
+		* Gets the value for a TDes8 attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TDes16 attribute.
+        * @return TBool - attribute found.
+		*/        
+        TBool GetStringAttribute( const TUint aAttribute, TDes8& aValue );
+        
+		/**
+		* Gets the value for a TDes16 attribute.
+		* @param aAttribute Identifies the attribute to be retrived.
+		* @param aValue On completion, contains the requested TDes16 attribute.
+        * @return TBool - attribute found.
+		*/         
+        TBool GetStringAttribute( const TUint aAttribute, TDes16& aValue );
+        
+		/**
+		* Unpack event attributes.
+		* @param aPack Package.
+        * @return None.
+		*/         
+        void UnPackEventAttribL( const TDesC8& aPack );    
+
+    public: // Data
+
+        // Event type
+        THttpDownloadState  iEventType;
+        // EDlAttrId
+        TInt32              iId;
+        // EDlAttrUserData
+        TInt32              iUserData;
+        // EDlAttrReqUrl
+        HBufC8*             iUrl;
+        //EDlAttrName
+        HBufC16*            iName;
+        // EDlAttrDownloadedSize
+        TInt32              iDownloadedSize;
+        // EDlAttrLength
+        TInt32              iTotalSize;
+        // Media Object Index
+        TInt32              iMoIndex;
+        // Indicates that download should be deleted
+        TBool               iToBeDeleted;
+        // Indicates that COD is in progress.
+        RHttpDownload::TCodProgressState   iCodInProgress;
+        // Delete COD download when done.
+        TBool               iDeleteCodWhenDone;
+        //EDlAttrMultipleMODownloadedSize
+        TInt32              iMoDownloadedSize;
+        //EDlAttrMultipleMOLength
+        TInt32              iMoLength;
+        
+        CArrayPtrFlat< CDefaultAttrib >* iAttribs;
+    };
+
+// ================= MEMBER FUNCTIONS =======================
+
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadExtension::CRHttpDownloadExtension
+// -----------------------------------------------------------------------------
+//
+CRHttpDownloadExtension::CRHttpDownloadExtension()
+:iToBeDeleted( EFalse )
+,iCodInProgress( RHttpDownload::ENotActive )
+,iDeleteCodWhenDone( EFalse )
+    {
+    CLOG_CREATE;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadExtension::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CRHttpDownloadExtension::ConstructL()
+    {
+    CLOG_ENTERFN("CRHttpDownloadExtension::ConstructL");
+    iUrl = HBufC8::NewMaxL( KMaxUrlLength );
+    iName = HBufC16::NewL( KDownloadNameMaxSize );
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadExtension::NewL
+// -----------------------------------------------------------------------------
+//
+CRHttpDownloadExtension* CRHttpDownloadExtension::NewL()
+    {
+    CRHttpDownloadExtension* self = new(ELeave)CRHttpDownloadExtension();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CRHttpDownloadExtension::~CRHttpDownloadExtension()
+    {
+    delete iUrl;
+    delete iName;
+    if( iAttribs )
+        {
+        iAttribs->ResetAndDestroy();
+        delete iAttribs;
+        iAttribs = NULL;
+        }
+    CLOG_CLOSE;
+    }
+
+// -----------------------------------------------------------------------------
+// CRHttpDownloadExtension::SetEventType
+// -----------------------------------------------------------------------------
+//
+void CRHttpDownloadExtension::SetEventType( THttpDownloadState aEventType )
+    {
+    CLOG_ENTERFN("CRHttpDownloadExtension::SetEventType");
+    iEventType = aEventType;
+    }
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::AllocAttribBufL
+// ---------------------------------------------------------
+//
+HBufC8* CRHttpDownloadExtension::AllocAttribBufL( TBool aIsBuffered )
+    {
+    iAttribs = 
+        new (ELeave) CArrayPtrFlat< CDefaultAttrib >( 1 );
+    
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL( EDlAttrUserData, iUserData );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    attrib = CDefaultAttrib::NewL( EDlAttrMultipleMODownloadedSize, iMoDownloadedSize );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    attrib = CDefaultAttrib::NewL( EDlAttrDownloadedSize, iDownloadedSize );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    attrib = CDefaultAttrib::NewL( EDlAttrMultipleMOLength, iMoLength );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    attrib = CDefaultAttrib::NewL( EDlAttrLength, iTotalSize );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    if( aIsBuffered )
+        {
+        attrib = CDefaultAttrib::NewL( EDlAttrId, iId );
+        CleanupStack::PushL( attrib );
+        iAttribs->AppendL( attrib );
+        CleanupStack::Pop( attrib ); 
+        
+        attrib = CDefaultAttrib::NewL( EDlAttrReqUrl, iUrl->Des() );
+        CleanupStack::PushL( attrib );
+        iAttribs->AppendL( attrib );
+        CleanupStack::Pop( attrib );              
+        }
+  
+    HBufC8* buf = TDMgrUtils::PackedAttributesL( iAttribs );
+    iAttribs->ResetAndDestroy();
+    delete iAttribs;
+    iAttribs = NULL;
+    return buf;
+    }
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::UnPackEventAttribL
+// ---------------------------------------------------------
+//
+void CRHttpDownloadExtension::UnPackEventAttribL( const TDesC8& aPack )
+    {
+    TDMgrUtils::UnPackEventAttribL( aPack, iUserData, iMoDownloadedSize, iDownloadedSize, 
+                                    iMoLength, iTotalSize, iMoIndex 
+                                  );
+    }
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::UnpackAttribL
+// ---------------------------------------------------------
+//
+void CRHttpDownloadExtension::UnpackAttribL( const TDesC8& aPack )
+    {
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL();
+    CleanupStack::PushL( attrib );
+
+    TDMgrUtils util;
+    util.iPtr.Set( aPack );
+    util.iCurrent = 0;
+    
+    while( util.NextAttribL( attrib, aPack ) )
+        {
+        switch( attrib->iType )
+            {
+            case CDefaultAttrib::EString8:
+                {
+                SetStringAttribute( attrib->iAttribute,
+                                    attrib->AsTPtrC8L() );
+                }
+                break;
+            case CDefaultAttrib::EString16:
+                {
+                /*
+                SetStringAttributeL( attrib->iAttribute,
+                                     attrib->AsTPtrC16L() );
+                                     */
+                }
+                break;
+            case CDefaultAttrib::EInt:
+                {
+                SetIntAttribute( attrib->iAttribute,
+                                 attrib->AsTInt32L() );
+                }
+                break;
+            case CDefaultAttrib::EBool:
+                {
+                /*
+                SetBoolAttributeL( attrib->iAttribute,
+                                   attrib->AsTBoolL() );*/
+                }
+                break;
+            default:
+                break;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( attrib ); // attrib;    
+    }
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::SetIntAttribute
+// ---------------------------------------------------------
+//
+void CRHttpDownloadExtension::SetIntAttribute( const TUint aAttribute, TInt32 aValue )
+    {
+    switch( aAttribute )
+        {
+        case EDlAttrUserData:
+            {
+            iUserData = aValue;
+            }
+            break;
+        case EDlAttrDownloadedSize:
+            {
+            iDownloadedSize = aValue;
+            }
+            break;
+        case EDlAttrLength:
+            {
+            iTotalSize = aValue;
+            }
+            break;
+        case EDlAttrId:
+            {
+            iId = aValue;
+            }
+            break;
+            
+        case EDlAttrMultipleMODownloadedSize:
+            {
+            iMoDownloadedSize = aValue;
+            }
+            break;
+            
+        case EDlAttrMultipleMOLength:
+            {
+            iMoLength = aValue;
+            } 
+            break;
+            
+        case EDlAttrActiveDownload:
+            {
+            iMoIndex = aValue;
+            }
+            break;
+            
+        default:
+            {
+            }
+            break;
+        }
+    }
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::SetStringAttribute
+// ---------------------------------------------------------
+//
+void CRHttpDownloadExtension::SetStringAttribute( const TUint aAttribute, const TDesC8& aValue )
+    {
+    switch( aAttribute )
+        {
+        case EDlAttrReqUrl:
+            {
+            iUrl->Des().Copy( aValue );
+            }
+            break;
+        default:
+            {
+            }
+            break;
+        }    
+    }
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::SetStringAttribute
+// ---------------------------------------------------------
+//
+void CRHttpDownloadExtension::SetStringAttribute( const TUint aAttribute, const TDesC16& aValue )
+    {
+    switch( aAttribute )
+        {
+        case EDlAttrName:
+            {
+            iName->Des().Copy( aValue );
+            }
+            break;
+        default:
+            {            
+            }
+            break;
+        }
+    }
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::GetIntAttribute
+// ---------------------------------------------------------
+//
+TBool CRHttpDownloadExtension::GetIntAttribute( const TUint aAttribute, TInt32& aValue )
+    {
+    TBool ret( ETrue );
+    switch( aAttribute )
+        {
+        case EDlAttrUserData:
+            {
+            aValue = iUserData;
+            }
+            break;
+        case EDlAttrDownloadedSize:
+            {
+            aValue = iDownloadedSize;
+            }
+            break;
+        case EDlAttrLength:
+            {
+            aValue = iTotalSize;
+            }
+            break;
+        case EDlAttrId:
+            {
+            aValue = iId;
+            }
+            break;
+            
+        case EDlAttrMultipleMODownloadedSize:
+            {
+             aValue = iMoDownloadedSize;
+            }
+            break;
+            
+        case EDlAttrMultipleMOLength:
+            {
+            aValue = iMoLength;
+            } 
+            break;
+            
+        case EDlAttrActiveDownload:
+        	{
+        	aValue = iMoIndex;
+        	}
+        	break;
+                                              
+        default:
+            {
+            ret = EFalse;
+            }
+            break;
+        }
+    return ret;  
+    }
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::GetIntAttribute
+// ---------------------------------------------------------
+//
+TBool CRHttpDownloadExtension::GetStringAttribute( const TUint aAttribute, TDes8& aValue )
+    {
+    TBool ret( ETrue );
+    switch( aAttribute )
+        {
+        case EDlAttrReqUrl:
+            {
+            aValue.Copy( iUrl->Des() );
+            }
+            break;
+        default:
+            {
+            ret = EFalse;
+            }
+            break;
+        }
+    return ret;  
+    }
+
+
+// ---------------------------------------------------------
+// CRHttpDownloadExtension::GetIntAttribute
+// ---------------------------------------------------------
+//
+TBool CRHttpDownloadExtension::GetStringAttribute( const TUint aAttribute, TDes16& aValue )
+    {
+    TBool ret( ETrue );
+    switch( aAttribute )
+        {
+        case EDlAttrReqUrl:
+            {
+            aValue.Copy( iUrl->Des() );
+            }
+            break;
+        case EDlAttrName:
+            {
+            aValue.Copy( iName->Des() );
+            if(!aValue.Length())
+                return EFalse;
+            }
+            break;
+
+        default:
+            {
+            ret = EFalse;
+            }
+            break;
+        }
+    return ret;  
+    }
+//==========================================================================================
+
+#ifdef DEAD_CODE
+// ---------------------------------------------------------
+// RHttpDownload::AllocEventAttribBufL
+// ---------------------------------------------------------
+//
+HBufC8* RHttpDownload::AllocEventAttribBufL()
+    {
+    return iExtension->AllocAttribBufL();
+    }
+#endif
+
+// ---------------------------------------------------------
+// RHttpDownload::UnpackEventAttribL
+// ---------------------------------------------------------
+//
+void RHttpDownload::UnpackEventAttribL( const TDesC8& aPack )
+    {
+    return iExtension->UnPackEventAttribL( aPack );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::CreateL
+// ---------------------------------------------------------
+//
+void RHttpDownload::CreateL( const TDesC8& aUrl, const TPtr8 aPackedAttribs  )
+    {
+    CLOG_ENTERFN( "RHttpDownload::CreateL" )
+
+    iExtension = CRHttpDownloadExtension::NewL();
+    iDlExtension = CRHttpDlExtension::NewL();
+    
+    CLOG_ATTACH( iExtension, this );
+    
+    iDownloadHandler = new (ELeave) CDownloadMgrHandler ( iDownloadMgr, this );
+    CLOG_ATTACH( iDownloadHandler, this );
+    // 0st param - the URL needs to be downloaded
+    // 1st param - will contain the unique handle
+    // 2nd param - packed attributes 
+    TPckg<TInt> handlePckg( iHandle );
+
+	User::LeaveIfError( CreateSubSession( *iDownloadMgr, 
+                                          EHttpDownloadMgrCreateDownload, 
+                                          TIpcArgs( &aUrl, &handlePckg, &aPackedAttribs ) ) );
+
+    iClosed = EFalse;
+    
+    iDownloadHandler->StartL();
+    BufferAttributesL();
+    
+    CLOG_NAME_2( _L("Download_%d_%d"), 
+                 iDownloadMgr->SessionId(),
+                 iExtension->iId );
+	}
+
+// ---------------------------------------------------------
+// RHttpDownload::AttachL
+// ---------------------------------------------------------
+//
+void RHttpDownload::AttachL( TInt aHandle )
+    {
+    CLOG_ENTERFN( "RHttpDownload::AttachL" )
+    
+    iExtension = CRHttpDownloadExtension::NewL();
+	iDlExtension = CRHttpDlExtension::NewL();
+    iDownloadHandler = new (ELeave) CDownloadMgrHandler ( iDownloadMgr, this );
+    // 0st param - application UID
+    // 1st param - a handle idetifies a download subsession in server
+    TPckg<TUid> uidPckg( iDownloadMgr->iAppUid );
+
+    User::LeaveIfError( CreateSubSession( *iDownloadMgr, 
+                                          EHttpDownloadAttach, 
+                                          TIpcArgs( &uidPckg, aHandle ) ) );
+
+    iHandle = aHandle;
+    iClosed = EFalse;    
+    iDownloadHandler->StartL();
+
+    BufferAttributesL();
+
+    CLOG_NAME_2( _L("Download_%d_%d"), 
+                 iDownloadMgr->SessionId(),
+                 iExtension->iId );
+	}
+
+// ---------------------------------------------------------
+// RHttpDownload::AttachToDownloadL
+// ---------------------------------------------------------
+//
+void RHttpDownload::AttachToDownloadL( const TInt32 aDlId )
+    {
+    CLOG_ENTERFN( "RHttpDownload::AttachToDownloadL" )
+    
+    iExtension = CRHttpDownloadExtension::NewL();
+	iDlExtension = CRHttpDlExtension::NewL();
+    iDownloadHandler = new (ELeave) CDownloadMgrHandler ( iDownloadMgr, this );
+    // 0st param - application UID
+    // 1st param - a handle idetifies a download subsession in server
+    TPckg<TInt> handlePckg( iHandle );
+    User::LeaveIfError( CreateSubSession( *iDownloadMgr, 
+                                          EHttpDownloadAttachToDownload, 
+                                          TIpcArgs( aDlId, &handlePckg ) ) );
+    iClosed = EFalse;                                          
+    iDownloadHandler->StartL();
+	}
+
+// ---------------------------------------------------------
+// RHttpDownload::Close
+// ---------------------------------------------------------
+//
+void RHttpDownload::Close()
+	{
+    CLOG_WRITE_FORMAT( "RHttpDownload::Close - iDownloadHandler %d", iDownloadHandler );
+    
+	if(iWait)
+		{
+		delete iWait;
+		iWait = NULL;
+		}
+    
+    if ( iDownloadHandler )
+        {
+        CLOG_WRITE( "Cancel handler" );
+        iDownloadHandler->Cancel();
+        CLOG_WRITE( "handler cancelled" );
+        delete iDownloadHandler;
+        iDownloadHandler = NULL;
+        }
+
+    if( iExtension )
+        {
+        delete iExtension;
+        iExtension = NULL;
+        }
+
+    if( iDlExtension )
+        {
+        delete iDlExtension;
+        iDlExtension = NULL;
+        }
+
+    DeleteTransaction();
+    iClosed = ETrue;
+
+    if( iCodDownload )
+    	{
+    	SDMgrCodUserData* ptr = (SDMgrCodUserData*)iCodDownload->UserData();
+    	if( ptr )
+    	    {
+    	    delete ptr;
+    	    }
+    	delete iCodDownload;
+    	iCodDownload = NULL;
+    	iDownloadMgr->DecrementEventPriorityFlag();
+    	}
+
+    if( iCodObserver )
+    	{
+    	delete iCodObserver;
+    	iCodObserver = NULL;
+    	}    	
+
+    CLOG_WRITE( "Close subsession" );
+	RSubSessionBase::CloseSubSession( EHttpDownloadClose );
+	
+	CLOG_CLOSE;
+	}
+
+// ---------------------------------------------------------
+// RHttpDownload::CloseSubSession
+// ---------------------------------------------------------
+//
+void RHttpDownload::CloseSubSession()
+    {
+   	CLOG_WRITE_FORMAT( "RHttpDownload::CloseSubSession - iDownloadHandler %d", iDownloadHandler );
+   	
+   	if(iClosedSubSession)
+   		{
+   		return;	
+   		}
+   		
+	TInt32 downloadState(0);
+	GetIntAttribute(EDlAttrState, downloadState);	
+    if( EHttpDlCompleted != downloadState )
+    	{
+    	return;
+    	}
+
+    if ( iDownloadHandler )
+        {
+        CLOG_WRITE( "Cancel handler" );
+        iDownloadHandler->Cancel();
+        CLOG_WRITE( "handler cancelled" );
+        delete iDownloadHandler;
+        iDownloadHandler = NULL;
+        }
+
+    DeleteTransaction();
+
+    if( iCodDownload )
+    	{
+    	SDMgrCodUserData* ptr = (SDMgrCodUserData*)iCodDownload->UserData();
+    	if( ptr )
+    	    {
+    	    delete ptr;
+    	    }
+    	delete iCodDownload;
+    	iCodDownload = NULL;
+    	iDownloadMgr->DecrementEventPriorityFlag();
+    	}
+
+    if( iCodObserver )
+    	{
+    	delete iCodObserver;
+    	iCodObserver = NULL;
+    	}    	
+
+    CLOG_WRITE( "Close subsession" );
+	RSubSessionBase::CloseSubSession( EHttpDownloadCloseCompleted );
+	iClosedSubSession = ETrue;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SaveDownloadInfoL
+// ---------------------------------------------------------
+//
+void RHttpDownload::SaveDownloadInfoL()
+    {
+    
+    CLOG_WRITE_FORMAT( "-->RHttpDownload::SaveDownloadInfoL 0x%x", this  );
+   	
+   	__ASSERT_DEBUG( iDlExtension, DMPanic( KErrGeneral ) );
+   	
+   	
+    TBool bCodDownLoad;
+    GetBoolAttribute(EDlAttrCodDownload, bCodDownLoad);
+    iDlExtension->SetBoolAttribute( EDlAttrCodDownload, bCodDownLoad );
+    
+    TInt32 downloadedSize(0);
+    GetIntAttribute(EDlAttrMultipleMODownloadedSize, downloadedSize);
+    iDlExtension->SetIntAttribute( EDlAttrMultipleMODownloadedSize, downloadedSize );
+    
+    TInt32 downloadLen;
+	GetIntAttribute(EDlAttrMultipleMOLength, downloadLen);
+    iDlExtension->SetIntAttribute( EDlAttrMultipleMOLength, downloadLen );
+    
+    TInt32 id;
+	GetIntAttribute(EDlAttrId, id);
+    iDlExtension->SetIntAttribute( EDlAttrId, id );
+    
+    
+    TInt32 state;
+	GetIntAttribute(EDlAttrState, state);
+    iDlExtension->SetIntAttribute( EDlAttrState, state );
+    
+    
+    TInt32 progressState;
+	GetIntAttribute(EDlAttrProgressState, progressState);
+    iDlExtension->SetIntAttribute( EDlAttrProgressState, progressState );
+    
+    
+   	if(bCodDownLoad && iCodDownload )
+		{
+   		HBufC8* mediaInfo8 = NULL;
+	    TRAPD( err, mediaInfo8 = iCodDownload->UpdatedDownloadDataL() );
+	    if ((err == KErrNone) && mediaInfo8)
+	        {
+	        CDownloadDataServ *CodDlData = CDownloadDataServ::NewL(*mediaInfo8);
+	        iDlExtension->SetCodaData(CodDlData);
+			delete mediaInfo8;
+			TInt count = CodDlData->Count();
+	
+			
+	        iDlExtension->SetIntAttribute( EDlAttrNumMediaObjects, count );
+	        
+			for(TInt index = 1; index <= count; index++)
+				{
+				  HBufC* destFileName = HBufC::NewL( KMaxPath );
+                  TPtr pFileName( destFileName->Des() );
+                  
+                  err = SendReceive( EHttpDownloadGetStringAttribute, 
+                        TIpcArgs( EDlAttrDestFilename,index, &pFileName  ));
+                  
+                  iDlExtension->SetStringAttribute( EDlAttrDestFilename, index, pFileName );
+	              delete destFileName;
+    
+				}
+	        
+	        }
+		}
+		
+	
+	
+	
+	
+    TBool bCodPdAvailable;
+    GetBoolAttribute(EDlAttrCodPdAvailable, bCodPdAvailable);
+    iDlExtension->SetBoolAttribute( EDlAttrCodPdAvailable, bCodPdAvailable );
+    
+    TBool bNoMedia;
+    GetBoolAttribute(EDlAttrNoMedia, bNoMedia);
+    iDlExtension->SetBoolAttribute( EDlAttrNoMedia, bNoMedia );
+    
+    TBool bHidden;
+    GetBoolAttribute(EDlAttrHidden, bHidden);
+    iDlExtension->SetBoolAttribute( EDlAttrHidden, bHidden );
+    
+    TBool bProgressive;
+    GetBoolAttribute(EDlAttrProgressive, bProgressive);
+    iDlExtension->SetBoolAttribute( EDlAttrProgressive, bProgressive );
+    
+    
+    TBool bPausable;
+    GetBoolAttribute(EDlAttrPausable, bPausable);
+    iDlExtension->SetBoolAttribute( EDlAttrPausable, bPausable );
+    
+    TBool bRemovableDest;
+    GetBoolAttribute(EDlAttrDestRemovable, bRemovableDest);
+    iDlExtension->SetBoolAttribute( EDlAttrDestRemovable, bRemovableDest );
+    
+    //    
+        
+    iDlExtension->SetIntAttribute(EDlAttrActiveDownload, KNonMoIndex);
+
+    HBufC8* contentType = HBufC8::NewL( KMaxContentTypeLength );
+    TPtr8 pContentType( contentType->Des() );
+    TInt err = SendReceive( EHttpDownloadGetString8Attribute, 
+                        TIpcArgs( EDlAttrContentType,KNonMoIndex, &pContentType  ));
+    iDlExtension->SetStringAttribute( EDlAttrContentType, pContentType );
+	delete contentType;
+    
+    HBufC* attrName = HBufC::NewL( KDownloadNameMaxSize );
+    TPtr pName( attrName->Des() );
+	err = SendReceive( EHttpDownloadGetStringAttribute, 
+                        TIpcArgs( EDlAttrName,KNonMoIndex, &pName  ));
+    iDlExtension->SetStringAttribute( EDlAttrName, pName );
+	delete attrName;
+
+    HBufC* destFileName = HBufC::NewL( KMaxPath );
+    TPtr pFileName( destFileName->Des() );
+     err = SendReceive( EHttpDownloadGetStringAttribute, 
+                        TIpcArgs( EDlAttrDestFilename,KNonMoIndex, &pFileName  ));
+    iDlExtension->SetStringAttribute( EDlAttrDestFilename, pFileName );
+	delete destFileName;
+    //
+    
+    HBufC8* currentURL = HBufC8::NewL( KMaxUrlLength );
+    TPtr8 pCurrentURL( currentURL->Des() );
+    err = SendReceive( EHttpDownloadGetString8Attribute, 
+                        TIpcArgs( EDlAttrCurrentUrl,KNonMoIndex, &pCurrentURL  ));
+    iDlExtension->SetStringAttribute( EDlAttrCurrentUrl, pCurrentURL );
+	delete currentURL;
+
+    HBufC8* reqURL = HBufC8::NewL( KMaxUrlLength );
+    TPtr8 pReqURL(reqURL->Des());
+    err = SendReceive( EHttpDownloadGetString8Attribute, 
+                        TIpcArgs( EDlAttrReqUrl,KNonMoIndex, &pReqURL  ));
+    iDlExtension->SetStringAttribute( EDlAttrReqUrl, pReqURL );
+	delete reqURL;
+	
+    TBuf8<KHashLength> hash_owned;
+	GetStringAttribute( EDlAttrHashedMsgBody, hash_owned );
+	iDlExtension->SetStringAttribute( EDlAttrHashedMsgBody, hash_owned );
+    
+    GetIntAttribute(EDlAttrDownloadedSize, downloadedSize);
+    iDlExtension->SetIntAttribute( EDlAttrDownloadedSize, downloadedSize );
+    
+	GetIntAttribute(EDlAttrLength, downloadLen);
+    iDlExtension->SetIntAttribute( EDlAttrLength, downloadLen );
+    
+    TInt32 errorId;
+	GetIntAttribute( EDlAttrErrorId, errorId);
+    iDlExtension->SetIntAttribute( EDlAttrErrorId, errorId );
+    
+    TInt32 globalErrorId; 
+	GetIntAttribute( EDlAttrGlobalErrorId, globalErrorId );
+    iDlExtension->SetIntAttribute( EDlAttrGlobalErrorId, globalErrorId );
+
+
+    //TInt32 activeIndex; 
+	//GetIntAttribute( EDlAttrNumMediaObjects, activeIndex );
+    //iDlExtension->SetIntAttribute(EDlAttrActiveDownload, activeIndex);
+    //iDlExtension->SetIntAttribute(EDlAttrActiveDownload, KFirstMoIndex);
+    //CLOG_WRITE_FORMAT( "<--RHttpDownload::SaveDownloadInfoL 0x%x", this );
+    
+    HBufC* albumName = HBufC::NewL( KDownloadNameMaxSize );
+    TPtr pAlbumName( albumName->Des() );
+	err = SendReceive( EHttpDownloadGetStringAttribute, 
+                        TIpcArgs( EDlAttrAlbumName, KNonMoIndex, &pAlbumName  ));
+    iDlExtension->SetStringAttribute( EDlAttrAlbumName, pAlbumName );
+	delete albumName;
+	
+    CLOG_WRITE_FORMAT( "<--RHttpDownload::SaveDownloadInfoL 0x%x", this );	
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::RHttpDownload
+// ---------------------------------------------------------
+//
+RHttpDownload::RHttpDownload( RHttpDownloadMgr* aServer )
+    {
+    CLOG_CREATE;
+    
+    // Reset data members as R-objects are not zero'd.
+    iDownloadHandler = NULL;
+    iExtension = NULL;
+    iDownloadMgr = aServer;
+    iHandle = 0;
+    iTransactionObserver = NULL;
+    iHttpTransaction = NULL;
+    iCodDownload = NULL;
+    iCodObserver = NULL;
+    iClientSideDownload = EFalse;
+    iClosedSubSession = EFalse;
+    iDlExtension = NULL;
+   	iWait = NULL;
+   	iASReady = EFalse;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::Start
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::Start()
+    {
+    CLOG_ENTERFN( "RHttpDownload::Start" )
+
+    TRAPD( err, DoStartL() );
+    
+    if( err )
+        {
+        DeleteTransaction();
+        }
+
+    return err;
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::DoStartL
+// ---------------------------------------------------------
+//
+void RHttpDownload::DoStartL()
+    {
+    CLOG_ENTERFN( "RHttpDownload::DoStartL" )
+    if( iCodDownload )
+    	  {    
+        TBool isCod( EFalse );    
+        GetBoolAttribute( EDlAttrCodDownload, isCod );
+        SDMgrCodUserData* ptr =(SDMgrCodUserData*)( iCodDownload->UserData() );
+
+        if( isCod )
+            {
+            // processing of start command depends the state of COD Handler
+            if( KInitPrevCodEvent == ptr->iPrevCodEvent )
+                {
+                DoStartCodL();
+                }            
+            else if( MCodDownloadObserver::EEndLoad == ptr->iPrevCodEvent )
+                {
+    			      const TCodDownloadProgress& progress = iCodDownload->Progress();
+                if(progress.iState == TCodDownloadProgress::EPaused)
+                    {
+                    }
+                else
+                    {
+        	          iCodDownload->ServiceFlowL();
+            	      return;
+                    }
+                }
+            else
+                {
+    			      const TCodDownloadProgress& progress = iCodDownload->Progress();
+                if(progress.iState == TCodDownloadProgress::EPaused)
+                    {
+                    }                
+					      else
+					          {
+		                // Already beeing downloaded
+		                THttpDownloadEvent event;
+		                event.iDownloadState = EHttpDlAlreadyRunning;
+		                event.iProgressState = EHttpProgNone;
+		                iDownloadMgr->BroadcastEvent( *this, event );
+		                return;
+					          }
+                }
+            }
+    	  }
+    // start active object to get events
+    CLOG_WRITE_FORMAT( "Start handler of 0x%x", this );
+    iDownloadHandler->StartL();
+    User::LeaveIfError( SendReceive( EHttpDownloadStart, TIpcArgs() ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::DoStartCodL
+// ---------------------------------------------------------
+//
+void RHttpDownload::DoStartCodL()
+	{
+	CLOG_ENTERFN( "RHttpDownload::DoStartCodL" )
+	
+	if( TCodDownloadProgress::EInProgress == iCodDownload->Progress().iState )
+		{
+		return;
+		}
+	
+	CAiwGenericParamList* params = CAiwGenericParamList::NewLC();
+	HBufC8* buf = NULL;
+	
+	TInt32 intValue;
+	TInt err = iDownloadMgr->GetIntAttribute( EDlMgrIap, intValue );
+	if( !err )
+		{
+	    TAiwGenericParam iap(  EGenericParamAccessPoint, intValue );
+	    params->AppendL( iap );		
+		}
+    CLOG_WRITE_FORMAT( "EGenericParamAccessPoint %d", intValue );
+    
+    buf = HBufC8::NewLC( KMaxUrlLength );
+    TPtr8 urlBuf = buf->Des();
+    err = GetStringAttribute( EDlAttrReqUrl, urlBuf );
+    if( !err )
+    	{
+		TAiwGenericParam url(  EGenericParamURL, urlBuf );
+		params->AppendL( url );   	
+    	}
+    CleanupStack::PopAndDestroy( buf ); // buf
+
+    buf = HBufC8::NewLC( KMaxGeneralHeaderFieldLength );    
+    TPtr8 charsetBuf = buf->Des();
+    err = GetStringAttribute( EDlAttrResponseCharSet, charsetBuf );
+    if( !err )
+    	{
+	    TAiwGenericParam charset(  EGenericParamCharSet, charsetBuf );
+	    params->AppendL( charset );               
+    	}
+    CleanupStack::PopAndDestroy( buf ); // buf
+     
+    if( NULL != iDownloadMgr->NextUriObserver() )
+        {
+        // Set CODHandler not to go to the next uri page
+        TBool suppress( ETrue );
+        TAiwGenericParam nextUrl(  EGenericParamSuppressNextUrl, suppress );
+        params->AppendL( nextUrl );        
+        }
+    
+	TBool silent( EFalse );
+    /*err = */GetBoolAttribute( EDlAttrSilent, silent );
+
+    TInt32 fota( KDefaultFotaPckgId );
+    /*err = */GetIntAttribute( EDlAttrFotaPckgId, fota ); 
+
+	if( KDefaultFotaPckgId < fota )
+	    {
+        TAiwGenericParam fotaID(  EGenericParamFotaPkgId, fota );
+        params->AppendL( fotaID );
+	    }
+	    
+    TAiwGenericParam silentMode(  EGenericParamSilentDownload, silent );
+    params->AppendL( silentMode );     
+	
+	TInt32 action( ELaunch );
+	/*err = */GetIntAttribute( EDlAttrAction, action );
+	if( EDoNothing == action )
+	    {
+        TAiwGenericParam actionOnExit( EGenericParamSuppressLaunch, ETrue );
+        params->AppendL( actionOnExit );	    
+	    }
+
+	TInt32 autoAccept( 0 );
+	err = iDownloadMgr->GetIntAttribute( EDlMgrAutoAcceptCod, autoAccept );
+    if( err == KErrNoMemory )
+        {
+        User::Leave( KErrNoMemory );
+        }
+    else if( err == KErrNone )
+	    {
+        TAiwGenericParam autoAcceptParam( EGenericParamSuppressDownloadConfirmation, autoAccept );
+        params->AppendL( autoAcceptParam );	    
+	    }
+	    
+	// Append DownloadId
+    TInt32 download; 
+    err = GetIntAttribute(EDlAttrId , download);
+    if(!err)
+        {
+        TAiwGenericParam downloadId( EGenericParamDownloadId, download );
+        params->AppendL( downloadId );	          
+        }
+        
+
+    TAiwGenericParam appUid( EGenericParamApplication, iDownloadMgr->iAppUid.iUid );
+    params->AppendL(appUid);  
+  
+	iCodDownload->StartL( params );
+	
+	CleanupStack::PopAndDestroy( params ); // params
+	}
+
+// ---------------------------------------------------------
+// RHttpDownload::StartEventNotification
+// ---------------------------------------------------------
+//
+void RHttpDownload::StartEventNotification( TDes8& aDownloadState,
+                                            TDes8& aProgressState,
+                                            TDes8& aEventAttrib,                                            
+                                            TRequestStatus& aStatus )
+    {
+    if(iClosedSubSession)
+    	{
+    	return;
+    	}
+    CLOG_ENTERFN( "RHttpDownload::StartEventNotification" )
+
+    CLOG_WRITE_FORMAT( "iDownloadHandler %d", iDownloadHandler );
+
+    SendReceive( EHttpDownloadEventSubscription, 
+                 TIpcArgs( &aDownloadState, &aProgressState, &aEventAttrib ), 
+                 aStatus );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::CancelEventNotification
+// ---------------------------------------------------------
+//
+void RHttpDownload::CancelEventNotification()
+    {
+    if(iClosedSubSession)
+    	{
+    	return;
+    	}
+    CLOG_WRITE( "RHttpDownload::CancelEventNotificationL" )
+
+    SendReceive( EHttpDownloadEventCancel, TIpcArgs() );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::PauseL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::Pause()
+    {
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    CLOG_WRITE( "RHttpDownload::Pause" )
+
+    DeleteTransaction();
+
+    return SendReceive( EHttpDownloadPause, TIpcArgs() );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::Reset
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::Reset()
+    {
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    CLOG_WRITE( "RHttpDownload::Reset" )
+
+    DeleteTransaction();
+
+    return SendReceive( EHttpDownloadReset, TIpcArgs() );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::IsDeleteCodWhenDone
+// ---------------------------------------------------------
+//
+TBool RHttpDownload::IsDeleteCodWhenDone() const
+    {
+    CLOG_WRITE( "RHttpDownload::IsDeleteCodWhenDone" )
+    
+    return iExtension->iDeleteCodWhenDone;
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::SetCodInProgress
+// ---------------------------------------------------------
+//
+void RHttpDownload::SetCodInProgress( TCodProgressState aVal )
+    {
+    CLOG_WRITE( "RHttpDownload::SetCodInProgress" )
+    
+    iExtension->iCodInProgress = aVal;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::DeleteL
+// ---------------------------------------------------------
+//
+
+EXPORT_C TInt RHttpDownload::Delete()
+    {
+    CLOG_WRITE( "RHttpDownload::Delete" )
+    TInt err( KErrNone );
+    
+    
+    if( iCodDownload && iExtension->iCodInProgress == RHttpDownload::EInProgress )
+    	{
+		
+		//The download is still is not accepted by the user. Allow the the user to cancel the
+		// download from Accpet-Cancel dialog or if any dialog displayed before it
+		if(!iASReady)
+		{
+		return KErrInUse; 		
+		}
+			
+    	// COD in progress; Stop instead of deleting. This leaves
+    	// time for install-notify.
+    	// Download will be deleted on EDone COD event.
+        CLOG_WRITE_FORMAT( "RHttpDownload delete when COD done: 0x%x", this )
+    	iCodDownload->Stop();
+        iExtension->iDeleteCodWhenDone = ETrue;
+        
+        if(iASReady && iWait && !iWait->IsStarted())
+        	{
+        	iWait->Start();	
+        	}   
+       	}
+
+    if( !iDownloadMgr->IsEventBroadcasting() )
+        {
+        CLOG_WRITE_FORMAT( "RHttpDownload is deleting: 0x%x", this );
+        iExtension->iToBeDeleted = EFalse;
+        THttpDownloadEvent event;
+        event.iDownloadState = EHttpDlDeleting;
+        event.iProgressState = EHttpProgNone;
+        TRAP( err, iDownloadMgr->HandleDMgrEventL( *this, event ) );
+        if( KErrNone != err )
+            {
+            return err;
+            }
+
+    	DeleteTransaction();
+       
+      	if(!iClosedSubSession)
+      		{
+        	err = SendReceive( EHttpDownloadDelete, TIpcArgs() );
+      		}
+
+        // Server deleted it in server-side, so close this down in client-side:
+        iDownloadMgr->CloseDownload( this );            
+        }
+    else
+        {
+        CLOG_WRITE_FORMAT( "RHttpDownload to be deleted: 0x%x", this )
+        iExtension->iToBeDeleted = ETrue;
+        }
+        
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::Move
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::Move()
+    {
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    CLOG_WRITE( "RHttpDownload::Move" )
+
+    return SendReceive( EHttpDownloadMove, TIpcArgs() );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::GetIntAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetIntAttribute( const TUint aAttribute, 
+                                              TInt32& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::GetIntAttributeL" )
+
+    if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetIntAttribute( aAttribute, aValue);;
+	    }
+    
+    // IPC optimalization; some of the atributes are kept in the client side
+    // and either refreshed with the events or they are not changed.
+	TBool isProgressive (EFalse);
+	GetBoolAttribute( EDlAttrProgressive, isProgressive );
+	if (!isProgressive)
+		{
+		if( iExtension->GetIntAttribute( aAttribute, aValue ) )
+			{
+			return KErrNone;
+			}
+		}
+
+    TPckg<TInt32> pckg( aValue );
+
+    return SendReceive( EHttpDownloadGetIntAttribute, TIpcArgs( aAttribute, KNonMoIndex, &pckg ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::GetIntAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetIntAttribute( const TUint aAttribute, 
+                                              const TInt32& aMoIndex,
+                                              TInt32& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::GetIntAttributeL" )
+
+    TPckg<TInt32> pckg( aValue );
+
+    return SendReceive( EHttpDownloadGetIntAttribute, TIpcArgs( aAttribute, aMoIndex, &pckg ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::GetBoolAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetBoolAttribute( const TUint aAttribute, 
+                                                TBool& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::GetBoolAttributeL" )
+    
+    if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetBoolAttribute( aAttribute, aValue);;
+	    }
+
+    TPckg<TBool> pckg( aValue );
+
+    return SendReceive( EHttpDownloadGetBoolAttribute, TIpcArgs( aAttribute, KNonMoIndex, &pckg ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::GetBoolAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetBoolAttribute( const TUint aAttribute,
+                                               const TInt32& aMoIndex,
+                                               TBool& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::GetBoolAttributeL" )
+    
+    if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetBoolAttribute( aAttribute, aMoIndex, aValue);;
+	    }
+    
+
+    TPckg<TBool> pckg( aValue );
+
+    return SendReceive( EHttpDownloadGetBoolAttribute, TIpcArgs( aAttribute, aMoIndex, &pckg ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::GetStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetStringAttribute( const TUint aAttribute,
+                                                 TDes16& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::GetStringAttributeL" )
+
+    if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetStringAttribute( aAttribute, aValue);
+    	}
+
+    // IPC optimalization; some of the atributes are kept in the client side
+    // and either refreshed with the events or they are not changed.    
+    if( iExtension->GetStringAttribute( aAttribute, aValue) )
+        {
+        return KErrNone;
+        }
+
+    return SendReceive( EHttpDownloadGetStringAttribute, 
+                        TIpcArgs( aAttribute, KNonMoIndex, &aValue ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::GetStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetStringAttribute( const TUint aAttribute,
+                                                 const TInt32& aMoIndex,
+                                                 TDes16& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::GetStringAttributeL" )
+    
+    if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetStringAttribute( aAttribute, aMoIndex, aValue);
+    	}
+
+    return SendReceive( EHttpDownloadGetStringAttribute, 
+                        TIpcArgs( aAttribute, aMoIndex, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::GetStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetStringAttribute( const TUint aAttribute, TDes8& aValue  )
+    {
+   
+   CLOG_WRITE( "RHttpDownload::GetStringAttributeL" )
+ 
+    if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetStringAttribute( aAttribute, aValue);
+    	}
+  
+    // IPC optimalization; some of the atributes are kept in the client side
+    // and either refreshed with the events or they are not changed.
+    if( iExtension->GetStringAttribute( aAttribute, aValue) )
+        {
+        return KErrNone;
+        }
+
+    return SendReceive( EHttpDownloadGetString8Attribute, 
+                        TIpcArgs( aAttribute, KNonMoIndex, &aValue ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::GetStringAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetStringAttribute( const TUint aAttribute,
+                                                 const TInt32& aMoIndex,
+                                                 TDes8& aValue  )
+    {
+    CLOG_WRITE( "RHttpDownload::GetStringAttributeL" )
+    
+     if(iClosedSubSession)
+    	{
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    	return iDlExtension->GetStringAttribute( aAttribute, aMoIndex, aValue);
+    	}
+  
+
+    return SendReceive( EHttpDownloadGetString8Attribute, 
+                        TIpcArgs( aAttribute, aMoIndex, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::GetFileHandleAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::GetFileHandleAttribute( RFile& aFile )
+    {
+    CLOG_WRITE("RHttpDownload::GetFileHandleAttribute")
+    
+    if(iClosedSubSession)
+	    {
+    	return KErrNotSupported;
+    	}
+    	
+    TInt ssh;			// sub-session (RFile) handle
+	TInt fsh;			// session (RFs) handle
+	TPckgBuf<TInt> fh;		
+	fsh = SendReceive(EHttpDownloadGetRFile, TIpcArgs(&fh));
+	if (fsh < 0)	// error ?
+		{
+		return fsh;
+		}
+
+	ssh = fh();
+
+	// Adopt the file using the returned handles
+    return aFile.AdoptFromServer(fsh, ssh);
+    }
+
+
+// ---------------------------------------------------------
+// RHttpDownload::SetIntAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetIntAttribute( const TUint aAttribute, 
+                                              TInt32 aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetIntAttributeL" )
+    
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+
+    TInt err = SendReceive( EHttpDownloadSetIntAttribute, 
+                            TIpcArgs( aAttribute, aValue ) );
+    if( KErrNone == err )
+        {
+        iExtension->SetIntAttribute( aAttribute, aValue );
+        }
+    
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SetBoolAttribute
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetBoolAttribute( const TUint aAttribute, TBool aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetBoolAttributeL" )
+	
+	if(iClosedSubSession)
+    	{
+    		
+    	if(!iDlExtension)
+    		{
+    		return KErrGeneral;
+    		}
+    		iDlExtension->SetBoolAttribute( aAttribute, aValue);
+    		return;
+    	}
+    	
+	if (aAttribute == EDlAttrProgressive)
+	{
+		if (iCodDownload)
+		{
+        // set attached attribute to handle progressive downloads in the COD Handler (for OMA2)
+		iCodDownload->SetCodDlAttached(aValue);
+		}
+	}
+
+    return SendReceive( EHttpDownloadSetBoolAttribute, 
+                        TIpcArgs( aAttribute, aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SetStringAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetStringAttribute( const TUint aAttribute, 
+                                                  const TDesC16& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetStringAttributeL" )
+    
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+
+    TInt err = SendReceive( EHttpDownloadSetStringAttribute, 
+                        TIpcArgs( aAttribute, KNonMoIndex, &aValue ) );
+    if( KErrNone == err )
+        {
+        iExtension->SetStringAttribute( aAttribute, aValue );
+        } 
+    return err;                           
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SetStringAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetStringAttribute( const TUint aAttribute,  
+                                                 const TInt32& aMoIndex,
+                                                 const TDesC16& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetStringAttributeL" )
+    
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    return SendReceive( EHttpDownloadSetStringAttribute, 
+                        TIpcArgs( aAttribute, aMoIndex, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SetStringAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetStringAttribute( const TUint aAttribute, const TDesC8& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetStringAttributeL" )
+
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    	
+    TInt err = SendReceive( EHttpDownloadSetString8Attribute, 
+                            TIpcArgs( aAttribute, &aValue ) );
+
+    if( KErrNone == err )
+        {
+        iExtension->SetStringAttribute( aAttribute, aValue );
+        }
+
+    return err;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SetStringAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetFileHandleAttribute( RFile& aFile )
+    {
+    if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    if( !aFile.SubSessionHandle() )
+        // file is not opened
+        {
+        return KErrBadHandle;
+        }
+    // store the RFs handle in message slot 0 and the RFile handle in slot 1
+	TIpcArgs ipcArgs;
+	aFile.TransferToServer(ipcArgs, 0, 1);		
+
+	// send to server
+	return SendReceive(EHttpDownloadSetRFile, ipcArgs); 
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::SetDownloadDataAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetDownloadDataAttribute( const TDesC8& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetDownloadDataAttribute" )
+    
+    return SendReceive( EHttpDownloadDataAttribute, TIpcArgs( &aValue ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::SetTrackDataAttributeL
+// ---------------------------------------------------------
+//
+EXPORT_C TInt RHttpDownload::SetTrackDataAttribute( const TInt aIndex, const TDesC8& aValue )
+    {
+    CLOG_WRITE( "RHttpDownload::SetTrackDataAttribute" )
+    
+    return SendReceive( EHttpDownloadTrackAttribute, TIpcArgs( aIndex, &aValue ) );
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::IsDownload
+// ---------------------------------------------------------
+//
+TBool RHttpDownload::IsDownload( TInt aHandle )
+    {
+    CLOG_WRITE( "RHttpDownload::IsDownload" )
+
+    return (iHandle == aHandle) ? ETrue : EFalse;
+    }
+// ---------------------------------------------------------
+// RHttpDownload::IsDownload
+// ---------------------------------------------------------
+//
+TBool RHttpDownload::IsDownloadL( const TUriParser8& aParsedReqUrl, const TDesC8& aHashedMsgBody )
+    {
+    CLOG_WRITE( "RHttpDownload::IsDownload" );
+
+    TBuf8<KMaxUrlLength> url_Own;
+	TBuf8<KHashLength> hash_owned;
+	
+	TInt errURL(KErrNone);
+	TInt errHashedMsg(KErrNone);
+	
+	if( iClosedSubSession)
+    	{
+    	errURL = iDlExtension->GetStringAttribute( EDlAttrReqUrl, url_Own );
+    	if(!errURL)
+    		{
+    		errHashedMsg = iDlExtension->GetStringAttribute( EDlAttrHashedMsgBody, hash_owned );	
+    		}
+    	}
+    else
+    	{
+    	errURL = GetStringAttribute( EDlAttrReqUrl, url_Own );
+    	if(!errURL)
+    		{
+	    	errHashedMsg = GetStringAttribute( EDlAttrHashedMsgBody, hash_owned );
+    		}
+    	}
+    	
+    TBool retVal( EFalse );
+    
+    if( !errURL )
+        {
+        HBufC8* escaped_own = EscapeUtils::EscapeDecodeL( url_Own );
+        CleanupStack::PushL( escaped_own );
+        
+        TUriParser8 parsed_Own;
+        
+        parsed_Own.Parse( *escaped_own );
+        
+        if( !aParsedReqUrl.Extract( EUriHost ).CompareF( parsed_Own.Extract( EUriHost ) ) &&
+            aParsedReqUrl.Extract( EUriPath ) == parsed_Own.Extract( EUriPath ) &&
+            aParsedReqUrl.Extract( EUriQuery ) == parsed_Own.Extract( EUriQuery ) &&
+            aParsedReqUrl.Extract( EUriFragment ) == parsed_Own.Extract( EUriFragment ) )
+            {
+
+
+            if( !errHashedMsg )
+                //
+                {
+                if( 0 == aHashedMsgBody.Compare( hash_owned ) )
+                    {
+                    retVal = ETrue;
+                    }
+                }
+            else
+                // hashed message body cannot be compared due to some unknown reason.
+                // Lets assume that the contents are the same.
+                {
+                retVal = ETrue;
+                }
+            }
+            
+        CleanupStack::PopAndDestroy( escaped_own );
+        }
+        
+    return retVal;
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::BufferAttributesL
+// ---------------------------------------------------------
+//
+void RHttpDownload::BufferAttributesL()
+    {
+    CLOG_ENTERFN("RHttpDownload::BufferAttributesL");
+ 
+       if(iClosedSubSession)
+    	{
+    	return;
+    	}
+ 
+   
+    HBufC8* buf = iExtension->AllocAttribBufL( ETrue );
+    CleanupStack::PushL( buf );
+    TPtr8 ptr = buf->Des();
+    
+    User::LeaveIfError( SendReceive( EHttpDownloadBufferAttributes, 
+                        TIpcArgs( &ptr ) ) );
+    iExtension->UnpackAttribL( ptr );                    
+    CleanupStack::PopAndDestroy( buf );    // buf
+    }
+
+// -----------------------------------------------------------------------------
+// RHttpDownload::SetEventType
+// -----------------------------------------------------------------------------
+//
+void RHttpDownload::SetEventType( THttpDownloadState aEventType )
+    {
+    CLOG_ENTERFN("RHttpDownload::SetEventType");
+    
+     if(iClosedSubSession)
+    	{
+    	return ;
+    	}
+    	
+    if( iExtension )
+        {
+        iExtension->SetEventType( aEventType );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// RHttpDownload::SetHttpTransactionL
+// -----------------------------------------------------------------------------
+//
+void RHttpDownload::SetHttpTransactionL( TInt aHttpTransaction )
+    {
+    iDownloadMgr->IncrementEventPriorityFlag();
+    CLOG_ENTERFN("RHttpDownload::SetHttpTransactionL");
+    
+    THTTPHdrVal hdrVal;
+
+    iClientSideDownload = ETrue;
+    
+    iHttpTransaction = REINTERPRET_CAST( RHTTPTransaction* , aHttpTransaction );
+    iTransactionObserver = CTransactionObserver::NewL( this );
+
+    RHTTPTransactionPropertySet propSet = iHttpTransaction->PropertySet();
+
+    RStringPool strPool = iHttpTransaction->Session().StringPool();
+    // set transaction property with the event handler callback functions' pointer
+    RStringF transactionCallbackStr = strPool.OpenFStringL( KTransactionCallback );
+    CleanupClosePushL( transactionCallbackStr );
+    THTTPHdrVal tokenVal = (TInt)(MHTTPTransactionCallback*)iTransactionObserver;
+    iHttpTransaction->PropertySet().RemoveProperty( transactionCallbackStr );
+    iHttpTransaction->PropertySet().SetPropertyL( transactionCallbackStr, tokenVal );
+
+    CleanupStack::PopAndDestroy(); // transactionCallbackStr
+
+    //
+    RHTTPHeaders headers( iHttpTransaction->Response().GetHeaderCollection() );
+    THTTPHdrFieldIter it = headers.Fields();
+    TInt length( 0 );
+    HBufC8* header = NULL;
+
+    for( TInt i = 0; i < 2; ++i )
+        {
+        while ( !it.AtEnd() )
+            {
+            RStringTokenF fieldName = it();
+            RStringF fieldNameStr = strPool.StringF (fieldName );
+
+            TPtrC8 rawData;
+
+            headers.GetRawField( fieldNameStr, rawData );
+
+            if( !header )
+                {
+                length += fieldNameStr.DesC().Length() + 
+                          1 + // KColon
+                          rawData.Length() +
+                          KHttpFieldSeparator().Length();
+                }
+            else
+                {
+                header->Des().Append( fieldNameStr.DesC() );
+                header->Des().Append( KColon );
+                header->Des().Append( rawData );
+                header->Des().Append( KHttpFieldSeparator );
+                }
+
+            ++it;
+            }
+
+        if( !header )
+            {
+            header = HBufC8::NewL( length );
+            it.First();
+            }
+        }
+
+    if( header )
+        {
+        SetStringAttribute( EDlAttrResponseHeader, *header );
+        }
+
+    delete header; header = NULL;
+    
+    //realm
+    if (propSet.Property(strPool.StringF(
+		HTTP::ERealm, RHTTPSession::GetTable()), hdrVal))
+        {
+        SetStringAttribute( EDlAttrRealm, hdrVal.Str().DesC() );
+        }
+
+    // username
+    if (propSet.Property(strPool.StringF(
+        HTTP::EUsername, RHTTPSession::GetTable()), hdrVal))
+        {
+        SetStringAttribute( EDlAttrUsername, hdrVal.Str().DesC() );
+        }
+
+    // password
+    if (propSet.Property(strPool.StringF(
+        HTTP::EPassword, RHTTPSession::GetTable()), hdrVal))
+        {
+        SetStringAttribute( EDlAttrPassword, hdrVal.Str().DesC() );
+        }
+
+    // proxy realm    
+    if (propSet.Property(strPool.StringF(
+	    HttpFilterCommonStringsExt::EProxyRealm,
+	    HttpFilterCommonStringsExt::GetTable()), hdrVal))
+        {
+        SetStringAttribute( EDlAttrProxyRealm, hdrVal.Str().DesC() );
+        }
+
+    // proxy username
+    if (propSet.Property(strPool.StringF(
+	    HttpFilterCommonStringsExt::EProxyUsername,
+	    HttpFilterCommonStringsExt::GetTable()), hdrVal))
+        {
+        SetStringAttribute( EDlAttrProxyUsername, hdrVal.Str().DesC() );
+        }
+
+    // proxy password
+    if (propSet.Property(strPool.StringF(
+	    HttpFilterCommonStringsExt::EProxyPassword, RHTTPSession::GetTable()), hdrVal))
+        {
+        SetStringAttribute( EDlAttrProxyPassword, hdrVal.Str().DesC() );
+        }
+
+    RStringF method = iHttpTransaction->Request().Method();
+    if( method == strPool.StringF( HTTP::EGET, RHTTPSession::GetTable()) )
+        {
+        SetIntAttribute( EDlAttrMethod, EMethodGET );
+        }
+    else if( method == strPool.StringF( HTTP::EHEAD, RHTTPSession::GetTable()) )
+        {
+        SetIntAttribute( EDlAttrMethod, EMethodHEAD );
+        }
+    else if( method == strPool.StringF( HTTP::EPOST, RHTTPSession::GetTable()) )
+        {
+        SetIntAttribute( EDlAttrMethod, EMethodPOST );
+        }
+
+    // Hashed message body
+    TBool hasBody = iHttpTransaction->Request().HasBody();
+    if( hasBody )
+        {
+        TPtrC8 dataPart;
+		MHTTPDataSupplier* reqBody = iHttpTransaction->Request().Body();
+		reqBody->Reset();
+        reqBody->GetNextDataPart( dataPart );
+        TBuf8<KHashLength> hash;
+        HashL( dataPart, hash );
+        SetStringAttribute( EDlAttrHashedMsgBody, hash );
+        }
+
+    if( iHttpTransaction->PropertySet().Property( 
+                               strPool.StringF(HttpFilterCommonStringsExt::EContentInflated, 
+                               HttpFilterCommonStringsExt::GetTable()), 
+                               hdrVal ))
+        // Content was original encoded -> we don't know the actual content size.
+        {
+        SetIntAttribute( EDlAttrMultipleMOLength, KDefaultContentLength );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// RHttpDownload::DeleteTransaction
+// -----------------------------------------------------------------------------
+//
+void RHttpDownload::DeleteTransaction()
+    {
+    CLOG_ENTERFN("RHttpDownload::DeleteTransaction");
+    
+    iClientSideDownload = EFalse;
+    
+    if( iHttpTransaction )
+        {
+        iHttpTransaction->Close();
+        delete iHttpTransaction;
+        iHttpTransaction = NULL;
+        }
+
+    if( iTransactionObserver )
+        {
+        delete iTransactionObserver;
+        iTransactionObserver = NULL;
+        }
+        
+    iDownloadMgr->DecrementEventPriorityFlag();
+    }
+
+// -----------------------------------------------------------------------------
+// RHttpDownload::InitCodDownloadL
+// -----------------------------------------------------------------------------
+//    
+void RHttpDownload::InitCodDownloadL( const TDesC8& aBuf, 
+                                      const TDesC8& aMimeType,
+                                      CEikonEnv* aEikEnv )
+	{
+	CLOG_ENTERFN("RHttpDownload::InitCodDownloadL");
+
+    if(iCodDownload)
+        {
+        delete iCodDownload;
+        iCodDownload = NULL;
+        }
+
+    if(iCodObserver)
+        {
+        delete iCodObserver;
+        iCodObserver = NULL;
+        }
+
+	SetBoolAttribute( EDlAttrCodDownload, ETrue );
+
+    if(!iCodObserver)
+        {
+        iCodObserver = CCodObserver::NewL( iDownloadMgr );
+        }
+
+    TBool silent( EFalse );
+    iDownloadMgr->GetBoolAttribute( EDlMgrSilentMode, silent );
+    if( silent )
+        {
+        aEikEnv = NULL;
+        }
+
+    if( 0 == aMimeType.Compare( KMultiPartMimeType() ) )
+        {
+        TInt cleanupcount( 0 );
+        HBufC8* boundbuff = HBufC8::NewLC( KMaxContentTypeLength ); cleanupcount++;
+        TPtr8 boundary = boundbuff->Des();
+        // Leave if media type doesn't exist; there is no boundary
+        User::LeaveIfError( GetStringAttribute( EDlAttrMediaTypeBoundary, boundary ) );                
+        HBufC* buf16 = HBufC::NewLC( KMaxUrlLength ); cleanupcount++;       
+        TPtr buf16ptr = buf16->Des();
+        User::LeaveIfError( GetStringAttribute( EDlAttrReqUrl, buf16ptr ) );
+
+        if(!iCodDownload)                                 
+            {
+            iCodDownload = CCodDownload::NewL( aBuf,
+                                           aMimeType,
+                                           *iCodObserver, 
+                                           aEikEnv,
+                                           &boundary,
+                                           &buf16ptr );
+            }
+        CleanupStack::PopAndDestroy( cleanupcount );      
+        }
+    else
+        {
+
+        if(!iCodDownload)                                 	    
+            iCodDownload = CCodDownload::NewL( aBuf, aMimeType, *iCodObserver, aEikEnv );
+        }
+
+	if( !iWait )
+		{
+		iWait = new (ELeave) CActiveSchedulerWait;
+		}
+
+	SDMgrCodUserData* userData = new (ELeave) SDMgrCodUserData;
+	userData->iHandle = iHandle;
+	userData->iPrevCodEvent = (MCodDownloadObserver::TEvent)KInitPrevCodEvent;
+	iCodDownload->SetUserData( (TAny*)userData );
+	iDownloadMgr->IncrementEventPriorityFlag();	
+	}
+	
+
+void RHttpDownload::InitPausedCodDownloadL( const TUid aAppUid )
+	{
+
+    TBuf8<KMaxContentTypeLength> contentType; 
+	
+    GetStringAttribute( EDlAttrDDType , contentType );	
+	
+	CEikonEnv* eikenv = CEikonEnv::Static();
+	
+	
+    TInt32 download; 
+    GetIntAttribute(EDlAttrId , download);
+
+    
+    if(iCodDownload)
+        {
+        delete iCodDownload;
+        iCodDownload = NULL;
+        }
+
+    if(iCodObserver)
+        {
+        delete iCodObserver;
+        iCodObserver = NULL;
+        }
+
+	SetBoolAttribute( EDlAttrCodDownload, ETrue );
+
+    if(!iCodObserver)
+        {
+        iCodObserver = CCodObserver::NewL( iDownloadMgr );
+        }
+
+    TBool silent( EFalse );
+    iDownloadMgr->GetBoolAttribute( EDlMgrSilentMode, silent );
+    if( silent )
+        {
+        eikenv = NULL;
+        }
+	
+    if( 0 == contentType.Compare( KMultiPartMimeType() ) )
+        {
+        /*
+        TInt cleanupcount( 0 );
+        HBufC8* boundbuff = HBufC8::NewLC( KMaxContentTypeLength ); cleanupcount++;
+        TPtr8 boundary = boundbuff->Des();
+        // Leave if media type doesn't exist; there is no boundary
+        User::LeaveIfError( GetStringAttribute( EDlAttrMediaTypeBoundary, boundary ) );                
+        HBufC* buf16 = HBufC::NewLC( KMaxUrlLength ); cleanupcount++;       
+        TPtr buf16ptr = buf16->Des();
+        User::LeaveIfError( GetStringAttribute( EDlAttrReqUrl, buf16ptr ) );
+
+        if(!iCodDownload)                                 
+            {
+            iCodDownload = CCodDownload::NewL( aBuf,
+                                           aMimeType,
+                                           *iCodObserver, 
+                                           aEikEnv,
+                                           &boundary,
+                                           &buf16ptr );
+            }
+        CleanupStack::PopAndDestroy( cleanupcount );    */  
+        }
+    else
+        {
+
+        if(!iCodDownload)                                 	    
+            iCodDownload = CCodDownload::NewL( download, aAppUid, contentType, *iCodObserver, eikenv );
+        }
+
+	SDMgrCodUserData* userData = new (ELeave) SDMgrCodUserData;
+	userData->iHandle = iHandle;
+	userData->iPrevCodEvent = (MCodDownloadObserver::EDone);
+	iCodDownload->SetUserData( (TAny*)userData );
+	iDownloadMgr->IncrementEventPriorityFlag();	    	
+	
+	
+	}
+// ---------------------------------------------------------
+// RHttpDownload::CheckContentTypeAndCreateCodDownloadL
+// ---------------------------------------------------------
+//
+TBool RHttpDownload::CheckContentTypeAndCreateCodDownloadL()
+	{
+	CLOG_ENTERFN("RHttpDownload::CheckContentTypeAndCreateCodDownloadL");
+	
+	TBool ret( ETrue ); // False if it is not a cod descriptor
+	                    // set in the if statement
+
+    TBuf8<KMaxContentTypeLength> ddContentType;    
+
+    GetStringAttribute( EDlAttrDDType, ddContentType );	
+
+    if( ( 0 == ddContentType.Compare( KCodMimeType() ) ) ||
+        ( 0 == ddContentType.Compare( KDdMimeType() ) ) ||
+        ( 0 == ddContentType.Compare( KDd2MimeType() ) ) ||
+        ( 0 == ddContentType.Compare( KMultiPartMimeType() ) ) )
+        {
+               
+        // This way we save IPC
+        TBuf<KMaxPath>               fileName;
+        RFile                        file;
+        RFs                          fs;
+        TInt                         size( 0 );
+        
+        CleanupClosePushL< RFs >( fs );
+        CleanupClosePushL< RFile >( file );
+        
+        // Get DD Filename for creating the download
+		User::LeaveIfError
+            ( GetStringAttribute( EDlAttrDdFileName, fileName ) );
+            
+        User::LeaveIfError( fs.Connect() );
+        
+        TInt err = file.Open( fs, fileName,
+            EFileShareReadersOnly | EFileStream | EFileRead );
+        if ( err == KErrInUse )
+            {
+            err = file.Open( fs, fileName,
+                EFileShareAny | EFileStream | EFileRead );
+            }
+        User::LeaveIfError( err );         
+    	User::LeaveIfError( file.Size( size ) );
+    	HBufC8* buf = HBufC8::NewLC( size );
+    	TPtr8 ptr = buf->Des();
+    	User::LeaveIfError( file.Read( ptr ) );
+    	CEikonEnv* eikenv = CEikonEnv::Static();
+    	
+        InitCodDownloadL( ptr, 
+                          ddContentType, 
+                          eikenv );
+                                   
+        CleanupStack::PopAndDestroy( 3 ); //  buf, file, fs
+        }
+    else
+        {
+        ret = EFalse;
+        }
+        
+	return ret;
+	}
+
+
+// ---------------------------------------------------------
+// RHttpDownload::SetOnError
+// ---------------------------------------------------------
+//
+TInt RHttpDownload::SetOnError( TInt aError,
+                                THttpDownloadMgrError aDlError )
+    {
+    CLOG_WRITE( "RHttpDownload::SetOnError" )
+     
+     if(iClosedSubSession)
+    	{
+    	return KErrNotSupported;
+    	}
+    	    
+    return SendReceive( EHttpDownloadSetOnError, 
+                        TIpcArgs( aError, aDlError ) );
+    }
+
+// -----------------------------------------------------------------------------
+// RHttpDownload::IsClientSideDownload
+// -----------------------------------------------------------------------------
+// 
+TBool RHttpDownload::IsClientSideDownload() const
+    {
+    return iClientSideDownload;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::IsToBeDeleted
+// ---------------------------------------------------------
+//
+TBool RHttpDownload::IsToBeDeleted()
+    {
+    CLOG_WRITE( "RHttpDownload::IsToBeDeleted" )
+    return iExtension->iToBeDeleted;
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::EventPriorityFlag
+// ---------------------------------------------------------
+//       
+TInt RHttpDownload::EventPriorityFlag() const
+    {
+    return iDownloadMgr->EventPriorityFlag();
+    }
+
+// ---------------------------------------------------------
+// RHttpDownload::ActiveMoIndex
+// ---------------------------------------------------------
+//    
+TInt32 RHttpDownload::ActiveMoIndex() const
+	{
+	return iExtension->iMoIndex;
+	}
+
+// ---------------------------------------------------------
+// RHttpDownload::GetProductDownloadedSize
+// ---------------------------------------------------------
+//  
+TInt RHttpDownload::GetProductDownloadedSize( )
+    {
+    TPckg<TInt32> pckg( iExtension->iMoDownloadedSize );
+    return SendReceive( EHttpDownloadGetIntAttribute, TIpcArgs( EDlAttrMultipleMODownloadedSize, KNonMoIndex, &pckg ) );
+    }
+    
+// ---------------------------------------------------------
+// RHttpDownload::StopWaitingAS()
+// ---------------------------------------------------------
+//       
+void RHttpDownload::StopWaitingAS()
+    {
+    if(iWait && iWait->IsStarted())
+    	{
+    	iWait->AsyncStop();
+    	}
+    }