browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrSrvObject.cpp
changeset 0 dd21522fd290
child 8 7c90e6132015
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserutilities/downloadmgr/DownloadMgrClntSrv/src/DownloadMgrSrvObject.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,962 @@
+/*
+* 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 Download Mgr Server.
+*
+*/
+
+
+// INCLUDE FILES
+#include "DownloadMgrLogger.h"
+#include "DownloadMgrServer.h"
+#include "DownloadMgrDef.h"
+#include "DownloadMgrDefAttrib.h"
+#include <HttpClientApp.h>
+#include <HttpClientAppInstance.h>
+#include <HttpDownload.h>
+#include <e32svr.h>
+#include <basched.h>
+//#include <e32uid.h>
+
+// CONSTANTS
+
+// GLOBAL FUNCTIONS
+
+// ---------------------------------------------------------
+// CDownloadSubSession::NewL
+// ---------------------------------------------------------
+//
+CDownloadSubSession * CDownloadSubSession::NewL( CDownloadMgrSession* aSession,
+                                           CHttpDownload* aDownload )
+	{
+    CLOG_ENTERFN_NULL( "CDownloadSubSession::NewL" )
+	CDownloadSubSession* self = new (ELeave) CDownloadSubSession();
+	CleanupStack::PushL( self );
+	self->ConstructL( aSession, aDownload );
+	CleanupStack::Pop( self ); // self
+	return self;
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::CDownloadSubSession
+// ---------------------------------------------------------
+//
+CDownloadSubSession::CDownloadSubSession()
+:iEvent( EFalse )
+    {
+    CLOG_CREATE;
+    }
+
+
+// ---------------------------------------------------------
+// CDownloadSubSession::ConstructL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::ConstructL( CDownloadMgrSession *aSession,
+                                   CHttpDownload* aDownload )
+	{
+    CLOG_ENTERFN( "CDownloadSubSession::ConstructL" )
+	iSession = aSession;
+    iDownload = aDownload;
+
+#ifdef _DEBUG
+    TInt32 dlId;
+    
+    aDownload->GetIntAttributeL( EDlAttrId, dlId );
+    CLOG_NAME_2( _L("Download_%d_%d"), aSession->SessionId(), dlId );
+#endif
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::~CDownloadSubSession
+// ---------------------------------------------------------
+//
+CDownloadSubSession::~CDownloadSubSession()
+    {
+    CLOG_WRITE( "CDownloadSubSession::~CDownloadSubSession()" )
+    // Trigger the event queue
+    TUint dummy( 0 );
+    if( iSession )
+        {
+        iSession->Event( NULL, (THttpDownloadState)dummy, (THttpProgressState)dummy, (TInt32)dummy );
+        }
+    if( iAttribs )
+        {
+        iAttribs->ResetAndDestroy();
+        delete iAttribs;
+        iAttribs = NULL;
+        }    
+    CLOG_CLOSE;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::CloseCounter
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::CloseDownload()
+	{
+    CLOG_WRITE( "CDownloadSubSession::CloseDownload" )
+   
+    iSession->ClientAppInstance()->ClientApp()->UnregisterDownload( iDownload ); 
+	iDownload->DetachClientInstance(iSession->ClientAppInstance());
+	iSession->DeleteDownload( Message().Int3() );
+	}
+
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::Message
+// ---------------------------------------------------------
+//
+
+const RMessage2& CDownloadSubSession::Message() const
+	{
+    CLOG_WRITE( "CDownloadSubSession::Message()" );
+    CLOG_WRITE_FORMAT( "iSession = %x", iSession );
+	return iSession->CurrentMessage();
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::DispatchDownloadMessageL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::DispatchMessageL( const RMessage2& aMessage )
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::DispatchMessageL" )
+	switch( aMessage.Function() )
+        {
+        case EHttpDownloadStart:
+            {
+            StartL();
+            return;
+            }
+        case EHttpDownloadEventSubscription:
+            {
+            InitDownloadEvent( aMessage );
+            // Send event from the queue
+            TUint dummy( 0 );
+            iSession->Event( NULL, (THttpDownloadState)dummy, (THttpProgressState)dummy, (TInt32)dummy );
+            // This is an asyncron request will be completed later!
+            iSession->SetComplete( EFalse );
+            return;
+            }
+        case EHttpDownloadEventCancel:
+            {
+            CancelDownloadEvent();
+            return;
+            }
+        case EHttpDownloadPause:
+            {
+            PauseL();
+            return;
+            }
+        case EHttpDownloadReset:
+            {
+            Reset();
+            return;
+            }
+        case EHttpDownloadDelete:
+            {
+            Delete();
+            return;
+            }
+        case EHttpDownloadMove:
+            {
+            MoveL();
+            return;
+            }
+        case EHttpDownloadClose:
+            {
+            CloseDownload();
+            return;
+            }
+            
+        case EHttpDownloadCloseCompleted:
+            {
+            CloseCompletedDownload();
+            return;
+            }
+            
+        case EHttpDownloadGetIntAttribute:
+            {
+            GetIntAttributeL();
+            return;
+            }
+        case EHttpDownloadGetBoolAttribute:
+            {
+            GetBoolAttributeL();
+            return;
+            }
+        case EHttpDownloadGetStringAttribute:
+            {
+            GetStringAttributeL();
+            return;
+            }
+        case EHttpDownloadGetString8Attribute:
+            {
+            GetString8AttributeL();
+            return;
+            }
+        case EHttpDownloadSetIntAttribute:
+            {
+            SetIntAttributeL();
+            return;
+            }
+        case EHttpDownloadSetBoolAttribute:
+            {
+            SetBoolAttributeL();
+            return;
+            }
+        case EHttpDownloadSetStringAttribute:
+            {
+            SetStringAttributeL();
+            return;
+            }
+        case EHttpDownloadSetString8Attribute:
+            {
+            SetString8AttributeL();
+            return;
+            }
+        case EHttpDownloadBufferAttributes:
+            {
+            BufferAttributesL();
+            return;
+            }
+        case EHttpDownloadGetRFile:
+            {
+            GetFileHandleAttributeL();
+            return;
+            }
+        case EHttpDownloadSetRFile:
+            {
+            SetFileHandleAttributeL();
+            return;
+            }
+        case EHttpDownloadDataAttribute:
+            {
+            SetDownloadDataAttributeL();
+            return;
+            }
+        case EHttpDownloadTrackAttribute:
+        	{
+        	SetTrackDataAttributeL();
+        	return;
+        	}
+        case EHttpDownloadSetOnError:
+            {
+            const TInt error = Message().Int0();
+            const THttpDownloadMgrError dlerror 
+                = (THttpDownloadMgrError)Message().Int1();
+            OnError( error, dlerror );
+            return;
+            }
+
+    	default:
+            {
+	    	iSession->PanicClient( EBadRequest );
+            return;
+            }
+        }
+    }
+
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::Start
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::StartL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::StartL" )
+    iDownload->StartL();
+    }
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::Attributes
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::PauseL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::PauseL" )
+    iDownload->PauseL( ETrue );
+    }
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::Reset
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::Reset()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::Reset" )
+    iDownload->Reset();
+    }
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::Delete
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::Delete()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::Delete()" )
+    iSession->RemoveFromQueue( iDownload );
+    iDownload->Delete( iSession->ClientAppInstance() );
+    }
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::CloseCompletedDownload
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::CloseCompletedDownload()
+	{
+    CLOG_WRITE( "CDownloadSubSession::CloseCompletedDownload" )
+    iDownload->DeleteInfoFile( iSession->ClientAppInstance() );
+    iSession->RemoveFromQueue( iDownload );
+    iSession->DeleteDownload( Message().Int3() );
+	}
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::MoveL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::MoveL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::MoveL" )
+    iDownload->MoveL();
+    }
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::InitDownloadEvent
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::InitDownloadEvent( const RMessage2& aMessage )
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::InitDownloadEvent" )
+    __ASSERT_DEBUG( iEvent == EFalse, iSession->PanicClient( EMultipleInitDownloadEvent ) );
+    iMessage = aMessage;
+    iEvent = ETrue;
+    }
+
+/// ---------------------------------------------------------
+// CDownloadSubSession::CancelDownloadEvent
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::CancelDownloadEvent()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::CancelDownloadEvent" )
+    CLOG_WRITE_FORMAT( "CDownloadSubSession::CancelDownloadEvent iEvent = %d", iEvent )
+    if( iEvent )
+        {
+        iMessage.Complete( KErrCancel );
+        iEvent = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Event
+// ---------------------------------------------------------
+//
+TBool CDownloadSubSession::EventL( TInt32 aDownloadState, TInt32 aProgressState, TInt32 aMoIndex )
+    {
+    TBool retVal( iEvent );
+    CLOG_ENTERFN( "CDownloadSubSession::Event" )
+    if( iEvent )
+        {
+        CLOG_WRITE_FORMAT( " aDownloadState = %d", aDownloadState )
+        CLOG_WRITE_FORMAT( " aProgressState = %d", aProgressState )
+        CLOG_WRITE_FORMAT( " aMoIndex = %d", aMoIndex )
+
+        TPckgBuf<TInt32> pckgDownloadState( aDownloadState );
+        TPckgBuf<TInt32> pckgProgressState( aProgressState );
+        
+        TInt ret = iMessage.Write( 0, pckgDownloadState );
+	    if( ret != KErrNone )
+            {
+            CLOG_WRITE_FORMAT( " iMessage.Write( 0, pckgDownloadState ) returned error code: %d", ret )
+		    iSession->PanicClient( EBadDescriptor );
+            }
+        else
+            {
+            ret = iMessage.Write( 1, pckgProgressState );
+	        if( ret != KErrNone )
+                {
+                CLOG_WRITE_FORMAT( " iMessage.Write( 1, pckgProgressState ) returned error code: %d", ret )
+		        iSession->PanicClient( EBadDescriptor );
+                }
+	     	else
+	            {
+	            HBufC8* eventAttr = NULL;
+	            
+	            TInt32 userdata( 0 );
+	            iDownload->GetIntAttributeL( EDlAttrUserData, userdata );
+	            
+	            TInt32 moDownloadedsize( 0 );
+	            iDownload->GetIntAttributeL( EDlAttrMultipleMODownloadedSize, moDownloadedsize );
+	            
+	            TInt32 moLength( 0 );
+	            iDownload->GetIntAttributeL( EDlAttrMultipleMOLength, moLength );
+	            
+	            TInt32 downloadedsize( 0 );
+	            iDownload->GetIntAttributeL( EDlAttrDownloadedSize, downloadedsize );
+	            
+	            TInt32 length( 0 );
+	            iDownload->GetIntAttributeL( EDlAttrLength, length );
+	            	            
+	            // Mask  media object index with userdata.
+			    // For example if aMoIndex = 0x00000004 and userdata = 0x00000005,
+			    // then maskData = 0x00040005.
+			    TInt32 maskedData = (aMoIndex << 16);
+			    maskedData = (maskedData | (userdata & 0x0000FFFF));
+	            
+	            TRAPD( err, eventAttr = TDMgrUtils::PackEventAttribL( maskedData, moDownloadedsize, downloadedsize, moLength, length ) );           
+	            if( KErrNone == err )
+	                {      
+	                TPtr8 ptr = eventAttr->Des();
+	                ret = iMessage.Write( 2, ptr );
+	    	        if( ret != KErrNone )
+	                    {
+	                    CLOG_WRITE_FORMAT( " iMessage.Write( 2, ptr ) returned error code: %d", ret )
+	    		        iSession->PanicClient( EBadDescriptor );
+	                    }
+	                }
+	            delete eventAttr;
+	            }
+            }
+        EventComplete( KErrNone );
+        }
+    CLOG_WRITE_FORMAT( "Event sent: %d", retVal )
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::CreateAttribPackL
+// ---------------------------------------------------------
+//
+HBufC8* CDownloadSubSession::CreateAttribPackL( TBool aBuffered )
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::CreateEventAttribPackLC" )
+    iAttribs = 
+        new (ELeave) CArrayPtrFlat< CDefaultAttrib >( 1 );
+    
+    TInt32 value( 0 );
+    iDownload->GetIntAttributeL( EDlAttrUserData, value );
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL( EDlAttrUserData, value );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib );
+    
+    iDownload->GetIntAttributeL( EDlAttrMultipleMODownloadedSize, value );
+    attrib = CDefaultAttrib::NewL( EDlAttrMultipleMODownloadedSize, value );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib );
+    
+    iDownload->GetIntAttributeL( EDlAttrDownloadedSize, value );
+    attrib = CDefaultAttrib::NewL( EDlAttrDownloadedSize, value );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib );
+    
+    iDownload->GetIntAttributeL( EDlAttrMultipleMOLength, value );
+    attrib = CDefaultAttrib::NewL( EDlAttrMultipleMOLength, value );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    iDownload->GetIntAttributeL( EDlAttrLength, value );
+    attrib = CDefaultAttrib::NewL( EDlAttrLength, value );
+    CleanupStack::PushL( attrib );
+    iAttribs->AppendL( attrib );
+    CleanupStack::Pop( attrib ); 
+    
+    if( aBuffered )
+        {
+        TBool deleteStr;
+        HBufC8* tempBuf = iDownload->GetString8AttributeL( 
+                                     EDlAttrReqUrl, 
+                                     deleteStr );
+        if( deleteStr )
+            {
+            CleanupStack::PushL( tempBuf );
+            }
+        TInt length = tempBuf->Length();                             
+        attrib = CDefaultAttrib::NewL( EDlAttrReqUrl, tempBuf->Des() );
+        CleanupStack::PushL( attrib );
+        iAttribs->AppendL( attrib );
+        CleanupStack::Pop( attrib );
+        if( deleteStr )
+            {
+            CleanupStack::PopAndDestroy( tempBuf );  // tempBuf
+            }
+        
+        iDownload->GetIntAttributeL( EDlAttrId, value );    
+        attrib = CDefaultAttrib::NewL( EDlAttrId, value );
+        CleanupStack::PushL( attrib );
+        iAttribs->AppendL( attrib );
+        CleanupStack::Pop( attrib );          
+        }
+
+    HBufC8* buf = TDMgrUtils::PackedAttributesL( iAttribs );
+    iAttribs->ResetAndDestroy();
+    delete iAttribs;
+    iAttribs = NULL;
+    return buf;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::OnError
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::OnError( TInt aError,
+                                   THttpDownloadMgrError aDlError )
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::OnError" )
+
+    iDownload->OnError( aError, aDlError );
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::EventComplete
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::EventComplete( TInt aErrorStatus )
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::EventComplete" )
+    if( iEvent )
+        {
+        iMessage.Complete( aErrorStatus );
+        iEvent = EFalse;
+        }
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::GetIntAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::GetIntAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::GetIntAttributeL" )
+
+    const TInt attr = Message().Int0();
+    TInt32 moIndex = Message().Int1();
+    TInt32 value;
+	
+	if (moIndex == KNonMoIndex)
+    	iDownload->GetIntAttributeL( (THttpDownloadAttrib)attr, value );
+	else
+		iDownload->GetIntAttributeL( (THttpDownloadAttrib)attr, moIndex, value );
+
+    TPckg<TInt32> pckg( value );
+
+    Write( 2, pckg );
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::GetBoolAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::GetBoolAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::GetBoolAttributeL" )
+
+    const TInt attr = Message().Int0();
+    TInt32 moIndex = Message().Int1();
+    TBool value;
+
+	if (moIndex == KNonMoIndex)
+    	iDownload->GetBoolAttributeL( (THttpDownloadAttrib)attr, value );
+	else
+		iDownload->GetBoolAttributeL( (THttpDownloadAttrib)attr, moIndex, value );
+
+    TPckg<TBool> pckg( value );
+
+    Write( 2, pckg );
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::GetStringAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::GetStringAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::GetStringAttributeL" )
+    const TInt attr = Message().Int0();
+    TInt32 moIndex = Message().Int1();
+
+    TBool deleteStr;
+	HBufC* tempBuf = NULL;
+	if (moIndex == KNonMoIndex)
+		tempBuf = iDownload->GetStringAttributeL( (THttpDownloadAttrib)attr, deleteStr );
+	else
+		tempBuf = iDownload->GetStringAttributeL( (THttpDownloadAttrib)attr, moIndex, deleteStr );
+
+    TPtr value( tempBuf->Des() );
+
+    Write( 2, value );
+
+    if( deleteStr )
+        {
+        delete tempBuf;
+        }
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::GetString8AttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::GetString8AttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::GetString8AttributeL" )
+    const TInt attr = Message().Int0();
+    TInt32 moIndex = Message().Int1();
+
+    TBool deleteStr;
+	HBufC8* tempBuf = NULL;
+	if (moIndex == KNonMoIndex)
+		tempBuf = iDownload->GetString8AttributeL( (THttpDownloadAttrib)attr, deleteStr );
+	else
+		tempBuf = iDownload->GetString8AttributeL( (THttpDownloadAttrib)attr, moIndex, deleteStr );
+
+    TPtr8 value( tempBuf->Des() );
+
+    Write( 2, value );
+
+    if( deleteStr )
+        {
+        delete tempBuf;
+        }
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::GetFileHandleAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::GetFileHandleAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::GetFileHandleAttributeL" )
+
+    RFile* file = iDownload->GetFileHandleAttributeL();
+
+    // transfer to client: store the RFile handle into the package buffer in slot 0 
+    // and complete the message with the RFs handle
+    User::LeaveIfError( file->TransferToClient( Message(), 0) );
+    }
+    
+// ---------------------------------------------------------
+// CDownloadSubSession::SetIntAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetIntAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetIntAttributeL" )
+    const TInt attr = Message().Int0();
+    const TInt32 value = Message().Int1();
+    iDownload->SetIntAttributeL( (THttpDownloadAttrib)attr, value );
+    }
+        
+// ---------------------------------------------------------
+// CDownloadSubSession::SetBoolAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetBoolAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetBoolAttributeL" )
+    const TInt attr = Message().Int0();
+    const TBool value = (TBool)Message().Int1();
+    iDownload->SetBoolAttributeL( (THttpDownloadAttrib)attr, value );
+    }
+		
+// ---------------------------------------------------------
+// CDownloadSubSession::SetStringAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetStringAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetStringAttributeL" )
+    const TInt attr = Message().Int0();
+    const TInt moIndex = Message().Int1();
+
+    TInt desLen = Message().GetDesLength( 2 );
+
+	HBufC* writeBuf = HBufC::NewLC( desLen );
+	TPtr initptr = writeBuf->Des();
+
+    Read( 2, initptr );
+    
+    if(moIndex != KNonMoIndex)
+        {
+        iDownload->SetStringAttributeL( (THttpDownloadAttrib)attr, moIndex, initptr );    
+        }
+    else
+        {
+        iDownload->SetStringAttributeL( (THttpDownloadAttrib)attr, initptr );    
+        }
+    
+    CleanupStack::PopAndDestroy( writeBuf ); // writeBuf
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::SetString8AttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetString8AttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetString8AttributeL" )
+    const TInt attr = Message().Int0();
+
+    TInt desLen = Message().GetDesLength( 1 );
+
+	HBufC8* writeBuf = HBufC8::NewLC( desLen ); 
+	TPtr8 initptr = writeBuf->Des();
+
+    Read( 1, initptr );
+
+    iDownload->SetStringAttributeL( (THttpDownloadAttrib)attr, initptr );
+    CleanupStack::PopAndDestroy( writeBuf ); // writeBuf;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::SetFileHandleAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetFileHandleAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetFileHandleAttributeL" )
+    
+    RFile* file = new (ELeave) RFile;
+    CleanupStack::PushL( file );
+    
+    file->AdoptFromClient( Message(), 0, 1 );
+    
+    // ownership is passed to the engine
+    iDownload->SetFileHandleAttributeL( file );
+    
+    CleanupStack::Pop( file );
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::SetDownloadDataAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetDownloadDataAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetDownloadDataAttributeL" )
+    
+    TInt desLen = Message().GetDesLength( 0 );
+    
+    HBufC8* writeBuf = HBufC8::NewLC( desLen );
+    TPtr8 initPtr = writeBuf->Des();
+    
+    Read( 0, initPtr);
+    
+    // ownership is passed to the engine
+    iDownload->SetDownloadDataAttributeL(writeBuf);
+    
+    CleanupStack::PopAndDestroy(writeBuf);
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::SetTrackDataAttributeL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetTrackDataAttributeL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetTrackDataAttributeL" )
+    
+    const TInt index = Message().Int0();
+    TInt desLen = Message().GetDesLength( 1 );
+    
+    HBufC8* writeBuf = HBufC8::NewLC( desLen );
+    TPtr8 initPtr = writeBuf->Des();
+    
+    Read( 1, initPtr);
+    
+    // ownership is passed to the engine
+    iDownload->SetTrackDataAttributeL(index, writeBuf);
+    
+    CleanupStack::PopAndDestroy(writeBuf);
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::SetDefAttributesL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetDefAttributesL()
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetDefAttributesL" )
+
+    TInt desLen = Message().GetDesLength( 2 );
+
+	HBufC8* attribBuf = HBufC8::NewLC( desLen ); 
+	TPtr8 attribs = attribBuf->Des();
+
+    Read( 2, attribs );
+
+    CDefaultAttrib* attrib = CDefaultAttrib::NewL();
+    CleanupStack::PushL( attrib );
+    TDMgrUtils util;
+    util.iPtr.Set( attribs );
+    util.iCurrent = 0;
+    
+    while( util.NextAttribL( attrib, attribs ) )
+        {
+        switch( attrib->iType )
+            {
+            case CDefaultAttrib::EString8:
+                {
+                iDownload->SetStringAttributeL( attrib->iAttribute,
+                                                attrib->AsTPtrC8L() );
+                }
+                break;
+            case CDefaultAttrib::EString16:
+                {
+                iDownload->SetStringAttributeL( attrib->iAttribute,
+                                                attrib->AsTPtrC16L() );
+                }
+                break;
+            case CDefaultAttrib::EInt:
+                {
+                iDownload->SetIntAttributeL( attrib->iAttribute,
+                                             attrib->AsTInt32L() );
+                }
+                break;
+            case CDefaultAttrib::EBool:
+                {
+                iDownload->SetBoolAttributeL( attrib->iAttribute,
+                                              attrib->AsTBoolL() );
+                }
+                break;
+            default:
+                break;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( 2 ); // attribBuf, attrib;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Write
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::Write( TInt aParam, TDesC8& aDes )
+	{
+    CLOG_ENTERFN( "CDownloadSubSession::Write" )
+
+    TInt ret = Message().Write( aParam, aDes );
+
+    CLOG_WRITE_FORMAT( "CDownloadSubSession::Write ret = %d", ret );
+    CLOG_WRITE_FORMAT( "CDownloadSubSession = %x", this );
+	if( ret != KErrNone )
+        {
+		iSession->PanicClient( EBadDescriptor );
+        }
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Write
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::Write( TInt aParam, TDesC16& aDes )
+	{
+    CLOG_ENTERFN( "CDownloadSubSession::Write" )
+
+    TInt ret = Message().Write( aParam, aDes );
+
+	if( ret != KErrNone )
+        {
+		iSession->PanicClient( EBadDescriptor );
+        }
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Read
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::Read( TInt aParam, TDes8& aDes )
+	{
+    CLOG_ENTERFN( "CDownloadSubSession::Read" )
+
+    TInt ret = Message().Read( aParam, aDes );
+
+	if( ret != KErrNone )
+        {
+		iSession->PanicClient( EBadDescriptor );
+        }
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Read
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::Read( TInt aParam, TDes16& aDes )
+	{
+    CLOG_ENTERFN( "CDownloadSubSession::Read" )
+
+    TInt ret = Message().Read( aParam, aDes );
+
+	if( ret != KErrNone )
+        {
+		iSession->PanicClient( EBadDescriptor );
+        }
+	}
+
+// ---------------------------------------------------------
+// CDownloadSubSession::IsCurrentDownload
+// ---------------------------------------------------------
+//
+TBool CDownloadSubSession::IsDownload( CHttpDownload* aDownload )
+    {
+    CLOG_WRITE( "CDownloadSubSession::IsDownload" );
+    __ASSERT_DEBUG( iDownload, iSession->PanicClient( EBadSubsessionHandle ) );
+    return (iDownload == aDownload) ? ETrue : EFalse;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Handle
+// ---------------------------------------------------------
+//
+TUint CDownloadSubSession::Handle()
+    {
+    CLOG_WRITE( "CDownloadSubSession::Handle" )
+    return iHandle;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::SetHandle
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::SetHandle( TUint aHandle )
+    {
+    CLOG_ENTERFN( "CDownloadSubSession::SetHandle" )
+    iHandle = aHandle;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::Download
+// ---------------------------------------------------------
+//
+CHttpDownload* CDownloadSubSession::Download()
+    {
+    CLOG_WRITE( "CDownloadSubSession::Download" )
+    return iDownload;
+    }
+
+// ---------------------------------------------------------
+// CDownloadSubSession::BufferAttributesL
+// ---------------------------------------------------------
+//
+void CDownloadSubSession::BufferAttributesL()
+    {
+    HBufC8* attr = CreateAttribPackL( ETrue );
+    TPtr8 ptr = attr->Des();
+    Write( 0, ptr );
+    delete  attr;
+    }