ncdengine/provider/server/src/ncddescriptordownloadsuboperation.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/src/ncddescriptordownloadsuboperation.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,364 @@
+/*
+* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+*
+*/
+
+
+#include <s32mem.h>
+#include <f32file.h>
+
+#include "ncddescriptordownloadsuboperation.h"
+#include "catalogsbasemessage.h"
+#include "catalogshttpsession.h"
+#include "catalogshttpconfig.h"
+#include "catalogshttpoperation.h"
+#include "catalogsdebug.h"
+#include "ncdhttpheaders.h"
+#include "catalogsutils.h"
+#include "catalogshttpheaders.h"
+#include "catalogscontext.h"
+#include "ncdproviderdefines.h"
+#include "ncdgeneralmanager.h"
+
+
+const TInt KBodyExpandSize = 4096;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// NewL
+// ---------------------------------------------------------------------------
+//
+CNcdDescriptorDownloadSubOperation* CNcdDescriptorDownloadSubOperation::NewL( 
+    CNcdGeneralManager& aGeneralManager,
+    MCatalogsHttpSession& aHttpSession,
+    const TDesC& aUri,
+    MNcdOperationObserver& aObserver,
+    MCatalogsSession& aSession )
+    {
+    CNcdDescriptorDownloadSubOperation* self = new( ELeave ) 
+        CNcdDescriptorDownloadSubOperation( 
+            aGeneralManager, aHttpSession, aSession );
+    CleanupClosePushL( *self );
+    self->ConstructL( aUri, aObserver );
+
+    CleanupStack::Pop();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNcdDescriptorDownloadSubOperation::~CNcdDescriptorDownloadSubOperation()
+    {
+    DLTRACEIN( ( "" ) );
+    if ( iDownload ) 
+        {
+        iDownload->Release();
+        iDownload = NULL;
+        }
+    
+    delete iBody;
+    iBody = NULL;
+    DLTRACEOUT((""));
+    }
+
+
+// ---------------------------------------------------------------------------
+// Download config getter
+// ---------------------------------------------------------------------------
+//
+MCatalogsHttpConfig& CNcdDescriptorDownloadSubOperation::Config()
+    {
+    DASSERT( iDownload );
+    return iDownload->Config();
+    }
+
+
+// ---------------------------------------------------------------------------
+// Download request header getter
+// ---------------------------------------------------------------------------
+//
+MCatalogsHttpHeaders& CNcdDescriptorDownloadSubOperation::RequestHeaders()
+    {
+    DASSERT( iDownload );
+    return iDownload->Config().RequestHeaders();    
+    }
+
+// ---------------------------------------------------------------------------
+// Download response header getter
+// ---------------------------------------------------------------------------
+//
+const MCatalogsHttpHeaders& CNcdDescriptorDownloadSubOperation::ResponseHeadersL()
+    {
+    DASSERT( iDownload );
+    return iDownload->ResponseHeadersL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// HttpOperation
+// ---------------------------------------------------------------------------
+//
+MCatalogsHttpOperation& 
+    CNcdDescriptorDownloadSubOperation::HttpOperation()
+    {
+    DASSERT( iDownload );
+    return *iDownload;
+    }
+
+// ---------------------------------------------------------------------------
+// Body
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CNcdDescriptorDownloadSubOperation::Body() const
+    {
+    if ( iBody && iBody->Size() ) 
+        {
+        iBodyPtr.Set( iBody->Ptr( 0 ) );
+        return iBodyPtr;
+        }
+    return KNullDesC8();
+    }
+
+// ---------------------------------------------------------------------------
+// Start
+// ---------------------------------------------------------------------------
+//
+TInt CNcdDescriptorDownloadSubOperation::Start()
+    {
+    DLTRACEIN((""));
+    TInt ret = iDownload->Start();
+        
+    if ( ret >= KErrNone ) 
+        {
+        DLTRACEOUT((""));
+        return KErrNone;
+        }
+    DLTRACEOUT((""));
+    return ret;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Cancel
+// ---------------------------------------------------------------------------
+//
+void CNcdDescriptorDownloadSubOperation::Cancel() 
+    {    
+    DLTRACEIN(( "" ));
+    if ( iDownload ) 
+        {
+        // Cancel also releases the dl
+        iDownload->Cancel();
+        iDownload = NULL;
+        }
+    DLTRACEOUT(( "" ));
+    }
+
+
+// ---------------------------------------------------------------------------
+// HandleHttpEvent
+// ---------------------------------------------------------------------------
+//
+void CNcdDescriptorDownloadSubOperation::HandleHttpEventL( 
+    MCatalogsHttpOperation& aOperation, 
+    TCatalogsHttpEvent aEvent )
+    {
+    DLTRACEIN( ( "" ) );
+    (void) aOperation; // suppresses compiler warning
+    DASSERT( &aOperation == iDownload );
+    DASSERT( aOperation.OperationType() == ECatalogsHttpTransaction );
+
+    TCatalogsTransportProgress progress( iDownload->Progress() );
+    
+    iProgress = TNcdSendableProgress( iDownloadState,
+        iDownload->OperationId().Id(), progress.iProgress,
+        progress.iMaxProgress );
+
+    switch( aEvent.iOperationState ) 
+        {
+        // Handle completed operation
+        case ECatalogsHttpOpCompleted:
+            {
+            DLTRACE(("ECatalogsHttpOpCompleted"));
+            iDownloadState = ENcdDownloadComplete;
+            NotifyObserversComplete( KErrNone );            
+            break;
+            }
+        
+        // Handle operation in progress
+        case ECatalogsHttpOpInProgress:
+            {
+            iDownloadState = ENcdDownloadInProgress;
+            switch ( aEvent.iProgressState ) 
+                {
+                
+                case ECatalogsHttpResponseBodyReceived:
+                    {                
+                    DLTRACE(("Response body received"));
+                    TRAP( iError, 
+                        {                        
+                        // Append the body
+                        iBody->InsertL( iBody->Size(), iDownload->Body() );
+                        });
+                    
+                    if ( iError != KErrNone ) 
+                        {
+                        DLERROR(("Error when appending body: %d", iError ));
+                        iDownload->Release();
+                        iDownload = NULL;
+                        iOperationState = EStateComplete;
+                        iDownloadState = ENcdDownloadFailed;
+                        NotifyObserversComplete( iError );
+                        }
+                    else 
+                        {                    
+                        iOperationState = EStateRunning;
+                        DLTRACE(("Inform observer about progress"));
+                        NotifyObserversProgress();
+                        }
+                    break;
+                    }
+                
+                case ECatalogsHttpStarted:
+                    {
+                    DLTRACE(("Operation started"));
+                    iOperationState = EStateRunning;
+                    iProgress.iState = ENcdDownloadStarted;
+                    DLTRACE(("Inform observer about progress"));
+                    NotifyObserversProgress();
+                    
+                    break;
+                    }
+                
+                default:
+                    break;
+                }
+            break;
+            }
+        
+        default:
+            {
+            break;
+            }
+        }
+    DLTRACEOUT((""));
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// HandleHttpError
+// ---------------------------------------------------------------------------
+//
+TBool CNcdDescriptorDownloadSubOperation::HandleHttpError(
+    MCatalogsHttpOperation& aOperation,
+    TCatalogsHttpError aError )
+    {    
+    DLTRACEIN( ( "Error type: %i, id: %i", aError.iType, aError.iError ) );
+    DASSERT( &aOperation == iDownload );
+    
+    aOperation.Release();
+    iDownload = NULL;
+    iError = aError.iError;
+    iDownloadState = ENcdDownloadFailed;
+    iOperationState = EStateComplete;   
+
+    // notify observer
+    NotifyObserversComplete( iError );
+    return ETrue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// RunOperation
+// ---------------------------------------------------------------------------
+//
+TInt CNcdDescriptorDownloadSubOperation::RunOperation()
+    {
+    DLTRACEIN(( "Pending message: %X", iPendingMessage ));
+    return KErrNone;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+CNcdDescriptorDownloadSubOperation::CNcdDescriptorDownloadSubOperation(
+    CNcdGeneralManager& aGeneralManager,
+    MCatalogsHttpSession& aHttpSession,
+    MCatalogsSession& aSession ) :
+        CNcdBaseOperation( aGeneralManager, NULL, EDescriptorDownloadSubOperation, aSession ),
+        iHttpSession( aHttpSession ),
+        iBodyPtr( NULL, 0 )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// ConstructL
+// ---------------------------------------------------------------------------
+//
+void CNcdDescriptorDownloadSubOperation::ConstructL( const TDesC& aUri, 
+    MNcdOperationObserver& aObserver )
+    {
+    DLTRACEIN(( _L("URI: %S"), &aUri ));
+    // Call ConstructL for the base class
+    CNcdBaseOperation::ConstructL();    
+
+    
+    AddObserverL( &aObserver );
+
+    iBody = CBufFlat::NewL( KBodyExpandSize );
+    
+    // Create the transaction
+    iDownload = iHttpSession.CreateTransactionL( aUri, this );
+    
+ 
+    DLTRACEOUT(( "" ));
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// NotifyObserversComplete
+// ---------------------------------------------------------------------------
+//
+void CNcdDescriptorDownloadSubOperation::NotifyObserversComplete( TInt aError )
+    {
+    Open(); // increase ref count in CCatalogsCommunicable
+    for( TInt i = 0; i < iObservers.Count(); ++i ) 
+        {
+        iObservers[i]->OperationComplete( this, aError );
+        }
+    Close();
+    }
+
+
+// ---------------------------------------------------------------------------
+// NotifyObserversProgress
+// ---------------------------------------------------------------------------
+//
+void CNcdDescriptorDownloadSubOperation::NotifyObserversProgress()
+    {
+    Open(); // increase ref count in CCatalogsCommunicable
+    for( TInt i = 0; i < iObservers.Count(); ++i ) 
+        {
+        iObservers[i]->Progress( *this );
+        }
+    Close();
+    }