codhandler/codeng/src/RoapSaver.cpp
changeset 0 dd21522fd290
child 26 cb62a4f66ebe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/codhandler/codeng/src/RoapSaver.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,480 @@
+/*
+* Copyright (c) 2005 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:  Implementation of class CRoapSaver.   
+*
+*/
+
+
+// INCLUDE FILES
+
+#include <RoapEng.h>
+#include <roaptrigger.h>
+#include "RoapSaver.h"
+#include "RoapData.h"
+#include "CodLoadObserver.h"
+#include "CodLogger.h"
+#include "CodError.h"
+#include "CodPanic.h"
+#include "CodProgress.h"
+#include "CodData.h"
+#include <AiwGenericParam.h>
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CRoapSaver::NewL()
+// ---------------------------------------------------------
+//
+CRoapSaver* CRoapSaver::NewL
+        (
+        const TDesC8& aType,
+        CRoapData*& aData,
+        TCodProgress* aProgress,
+        TInt aProgressBytes,
+        const TFileName& aTempPath,
+        const TFileName& aRootPath,
+        const TFileName& aFname
+        )
+    {
+    CRoapSaver* saver = new (ELeave) CRoapSaver
+        ( aType, aData, aProgress, aProgressBytes, aTempPath, aRootPath, aFname );
+    CleanupStack::PushL( saver );
+    saver->ConstructL();
+    CleanupStack::Pop( saver );
+    return saver;
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::~CRoapSaver()
+// ---------------------------------------------------------
+//
+CRoapSaver::~CRoapSaver()
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::~CRoapSaver") ));
+    delete iEng;
+    delete iBuf;
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::~CRoapSaver") ));
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::OpenStoreL()
+// ---------------------------------------------------------
+//
+void CRoapSaver::OpenStoreL()
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::OpenStoreL") ));
+    __ASSERT_DEBUG( iState == EInit, CodPanic( ECodInternal ) );
+    __ASSERT_DEBUG( !iBuf, CodPanic( ECodInternal ) );
+    iSize = 0;
+    iState = EStoreOpen;
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::OpenStoreL") ));
+    }
+    
+// ---------------------------------------------------------
+// CRoapSaver::AppendData()
+// ---------------------------------------------------------
+//
+TInt CRoapSaver::AppendData( const TDesC8& aData )
+    {
+    CLOG(( ECodEng, 4, \
+        _L("-> CRoapSaver::AppendData (%d) bytes"), aData.Length() ));
+//TODO: iState = EInstalling for dd2    __ASSERT_DEBUG( iState == EStoreOpen, CodPanic( ECodInternal ) );
+    TInt err = CheckMaxSize( aData.Size() );
+    if ( !err )
+        {
+        TInt needed = iSize + aData.Length();
+        if ( !iBuf )
+            {
+            iBuf = HBufC8::New( needed );
+            if ( !iBuf )
+                {
+                err = KErrNoMemory;
+                }
+            }
+        if ( !err && needed > iBuf->Des().MaxLength() )
+            {
+            HBufC8* buf = iBuf->ReAlloc( needed );
+            if ( buf )
+                {
+                iBuf = buf;
+                }
+            else
+                {
+                err = KErrNoMemory;
+                }
+            }
+        if ( !err )
+            {
+            iBuf->Des().Append( aData );
+            iSize += aData.Length();
+            }
+        }
+    CLOG(( EHttpLoad, 2, _L("<- CFileSaver::AppendData returns (%d)"), err ));
+    return err;
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::CloseStore()
+// ---------------------------------------------------------
+//
+void CRoapSaver::CloseStore()
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::CloseStore") ));
+    iState = EStoreClosed;
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::CheckResponseAttributesL()
+// ---------------------------------------------------------
+//
+void CRoapSaver::CheckResponseAttributesL( const CCodData& /*aData*/ )
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::CheckResponseAttributesL") ));
+//TODO: tmp EInstalling for dd2    __ASSERT_DEBUG( iState == EStoreClosed, CodPanic( ECodInternal ) );
+#ifdef __TEST_COD_LOG
+    TPtrC8 mime( iType.Des8() );
+    CLOG(( ECodEng, 4, _L8("  MIME==<%S>, size(%d)"), &mime, iSize ));
+#endif /* def __TEST_COD_LOG */
+
+    if ( !iSize )
+        {
+        CLOG(( ECodEng, 4, _L("  0 bytes data") ));
+        User::Leave( KErrCodAttributeMismatch );
+        }
+
+    // Compare content MIME type against descriptor.
+
+    // Size is not checked, no exact match is required. Quote form spec:
+    // "The storage size and the execution size are dependent on the
+    // environment and may be different from the value of the size attribute.
+    // The transport size may also be different, if compression or some
+    // packaging format is used."
+    //
+    // There is a safety upper bound on the transaction size, that is already
+    // applied. See SetMaxSize().
+
+
+// TODO (??) type not checked, ROAP Trigger is always accepted.
+// HACK HACK DRM HACK
+//    if( iType != TDataType( aData.Type() ) )
+//        {
+//        CLOG(( ECodEng, 4, _L("  mismatch") ));
+//        User::Leave( KErrCodAttributeMismatch );
+//        }
+
+    iState = ERespChecked;
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::CheckResponseAttributesL (match)") ));
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::InstallL()
+// ---------------------------------------------------------
+//
+void CRoapSaver::InstallL( TRequestStatus* aStatus, const TDesC& aName, const TBool /*aAttached*/ )
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::InstallL") ));
+//TODO:    __ASSERT_DEBUG( iState == ERespChecked, CodPanic( ECodInternal ) );
+    __ASSERT_ALWAYS( aStatus, CodPanic( ECodInternal ) );
+    __ASSERT_DEBUG( iBuf, CodPanic( ECodInternal ) );
+//TODO:    __ASSERT_DEBUG( iType == TDataType( KOma2TriggerContentType ), \
+//        CodPanic( ECodInternal ) );
+
+#ifdef __TEST_COD_LOG
+    TPtrC8 ptr( iBuf->Des() );
+    CDUMP(( ECodEng, 2, _S("Trigger:"), _S("        "), \
+        (const TUint8*)ptr.Ptr(), ptr.Size() ));
+#endif /* def __TEST_COD_LOG */
+
+    iContentName.Set( aName );  // TODO, must presist - use CodData instead?
+    __ASSERT_DEBUG( !iEng, CodPanic( ECodInternal ) );
+    iEng = Roap::CRoapEng::NewL();
+    if ( iData )
+        {
+        iData->Reset();
+        }
+    else
+        {
+        iData = CRoapData::NewL();
+        }
+    iEng->SetTriggerL
+        (
+        *iBuf,
+        iParams,
+        iData->iType,
+        iData->iContextStatus,
+        iData->iDomainOperation,
+        iData->iContentIdList
+        );
+
+//TODO:    __ASSERT_DEBUG( !iData->iRiAlias, CodPanic( ECodInternal ) );
+    if ( iEng->Trigger().iRiAlias )
+        {
+        iData->iRiAlias = iEng->Trigger().iRiAlias->AllocL();
+        }
+
+#ifdef __TEST_COD_LOG
+    CLOG(( ECodEng, 3, _L("  Type(%d)"), iData->iType ));
+    CLOG(( ECodEng, 3, _L("  ContextStatus(%d)"), iData->iContextStatus ));
+    CLOG(( ECodEng, 3, _L("  DomainOp(%d)"), iData->iDomainOperation ));
+    for ( TInt i = 0; i < iData->iContentIdList.Count(); i++ )
+        {
+        ptr.Set( iData->iContentIdList[i]->Des() );
+        CLOG(( ECodEng, 3, _L8("  ContentId #%d <%S>"), i, &ptr ));
+        }
+    if ( iData->iRiAlias )
+        {
+        ptr.Set( iData->iRiAlias->Des() );
+        CLOG(( ECodEng, 3, _L8("  RiAlias <%S>"), &ptr ));
+        }
+    else
+        {
+        CLOG(( ECodEng, 3, _L8("  RiAlias NULL") ));
+        }
+#endif /* def __TEST_COD_LOG */
+    
+    if ( iObserver )
+        {
+        CLOG(( ECodEng, 3, \
+            _L("CRoapSaver::StartRoapL notify RoapTriggerParsedL") ));
+        iObserver->RoapTriggerParsedL( *iData );
+        }
+
+    // CodHandler implements 'auto-accept' for ROAP Trigger.
+    // ROAP is initiated without user interaction.
+    iEng->AcceptL( this, aStatus );
+    iState = EInstalling;
+
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::InstallL") ));
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::CancelInstall()
+// ---------------------------------------------------------
+//
+void CRoapSaver::CancelInstall()
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::CancelInstall") ));
+    if ( iEng )
+        {
+        iEng->Cancel();
+        }
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::CancelInstall") ));
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::ReleaseContent()
+// ---------------------------------------------------------
+//
+void CRoapSaver::ReleaseContent( TFileName& aFname, TUid& aHandler )
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::ReleaseContent") ));
+    // Note: assert EInstalling state, not EInstalled. This object never gets
+    // EInstalled as the request status is not ours -> it does not know
+    // when installing is completed.
+//TODO: EStoreClose for dd2    __ASSERT_DEBUG( iState == EInstalling, CodPanic( ECodInternal ) );
+    aFname = iFname;
+    aHandler = iHandler;
+    iFname = KNullDesC;
+    iHandler = KNullUid;
+    iContentName.Set( KNullDesC );
+    delete iEng;
+    iEng = NULL;
+    iState = EInit;
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::ReleaseFileName()
+// ---------------------------------------------------------
+//
+void CRoapSaver::ReleaseFileName( TFileName& /*aFname*/)
+{
+}
+
+// ---------------------------------------------------------
+// CRoapSaver::Cleanup()
+// ---------------------------------------------------------
+//
+void CRoapSaver::Cleanup( TBool /* aDeleteFile */)
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::Cleanup") ));
+    if ( iEng )
+        {
+        iEng->Cancel();
+#ifdef __TEST_COD_LOG
+        TInt err =  // ('Log-only' variable.)
+#endif /* def __TEST_COD_LOG */
+        iEng->DoCleanup();
+        CLOG(( ECodEng, 2, _L("  CRoapSaver::Cleanup err(%d)"), err ));
+        delete iEng;
+        iEng = NULL;
+        }
+    iContentName.Set( KNullDesC );
+    iState = EInit;
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::Cleanup") ));
+    }
+
+// ---------------------------------------------------------
+// CRoapSaver::CRoapSaver()
+// ---------------------------------------------------------
+//
+CRoapSaver::CRoapSaver
+    (
+    const TDesC8& aType,
+    CRoapData*& aData,
+    TCodProgress* aProgress,
+    TInt aProgressBytes,
+    const TFileName& aTempPath,
+    const TFileName& aRootPath,
+    const TFileName& aFname
+    )
+: CCodSaver( aType ),
+  iData( aData ),
+  iProgress( aProgress ),
+  iProgressBytes( aProgressBytes ),
+  iTempPath( aTempPath ),
+  iRootPath( aRootPath ),
+  iFname( aFname)
+    {
+    CLOG(( ECodEng, 2, _L("*** CRoapSaver::CRoapSaver") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapSaver::ConnectionConfL()
+// ----------------------------------------------------------
+//
+TBool CRoapSaver::ConnectionConfL()
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::ConnectionConfL") ));
+    TBool conf( EFalse );
+    if ( iObserver )
+        {
+        CLOG(( ECodEng, 3, \
+            _L("CRoapSaver::ConnectionConfL notify ConnectionConfL") ));
+        conf = iObserver->ConfirmConnectL();
+        }
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::ConnectionConfL (%d)"), conf ));
+    return conf;
+    }
+    
+// ----------------------------------------------------------
+// CRoapSaver::ContactRiConfL()
+// ----------------------------------------------------------
+//
+TBool CRoapSaver::ContactRiConfL()
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::ContactRiConfL") ));
+    // CodHandler implements 'auto-accept' for ROAP Trigger.
+    return ETrue;
+    }
+    
+// ----------------------------------------------------------
+// CRoapSaver::TransIdConfL()
+// ----------------------------------------------------------
+//
+TBool CRoapSaver::TransIdConfL()
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::TransIdConfL") ));
+    return EFalse;
+    }
+    
+// ----------------------------------------------------------
+// CRoapSaver::RightsObjectDetailsL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::RightsObjectDetailsL
+( const RPointerArray<CDRMRights>& /*aRightsList*/ )
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::RightsObjectDetailsL") ));
+    }
+		    
+// ----------------------------------------------------------
+// CRoapSaver::ContentDownloadInfoL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::ContentDownloadInfoL
+( TPath& aTempFolder, TFileName& aContentName, TInt& aMaxSize )
+    {
+    aTempFolder = iTempPath;
+    aContentName = iContentName;
+    aMaxSize = iMaxSize;        // TODO must to be set.
+    }
+
+// ----------------------------------------------------------
+// CRoapSaver::ContentDetailsL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::ContentDetailsL
+( const TDesC& aPath, const TDesC8& aType, const TUid& aAppUid )
+    {
+    iFname = aPath;
+    iType = aType;
+    iHandler = aAppUid;
+    }
+                                      
+// ----------------------------------------------------------
+// CRoapSaver::HandleDCFPartL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::HandleDCFPartL( const TDesC8& /*aFilename*/ )
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::HandleDCFPartL") ));
+    // DRM Engine does not support multipart ROAP response yet.
+    // This method will never be called.
+    User::Leave( KErrNotSupported );
+    }
+        
+// ----------------------------------------------------------
+// CRoapSaver::RoapProgressInfoL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::RoapProgressInfoL( const TInt aProgressInfo )
+    {
+    CLOG(( ECodEng, 2, _L("CRoapSaver::RoapProgressInfoL (%d)"), \
+        aProgressInfo ));
+    if ( iProgress )
+        {
+        iProgress->SetAmountL( aProgressInfo );
+        }
+    }
+
+
+// ----------------------------------------------------------
+// CRoapSaver::ErrorUrlL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::ErrorUrlL( const TDesC8& /* aErrorUrl */)
+{
+	
+}
+// ----------------------------------------------------------
+// CRoapSaver::PostResponseUrlL()
+// ----------------------------------------------------------
+//
+void CRoapSaver::PostResponseUrlL( const TDesC8& aPrUrl )
+    {
+    CLOG(( ECodEng, 2, _L("-> CRoapSaver::PostResponseUrlL") ));
+    CLOG(( ECodEng, 2, _L("aPrUrl = '%S'"), &aPrUrl ));
+
+    //Send an event to MCodLoadObserver which sends an event to DownloadMgr, which handles the 
+    // PostResponse URL like NextUriL.
+    if ( iObserver )
+        {
+        iObserver->HandleRoapPostResponseUrlL( aPrUrl );
+        }
+
+    CLOG(( ECodEng, 2, _L("<- CRoapSaver::PostResponseUrlL") ));
+
+    }
+
+