codhandler/roapapp/src/RoapAppUi.cpp
changeset 0 dd21522fd290
child 13 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/codhandler/roapapp/src/RoapAppUi.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,989 @@
+/*
+* Copyright (c) 2002 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 CRoapAppUi.   
+*      
+*
+*/
+
+
+#include <avkon.hrh>
+#include <eikbtgpc.h>
+#include <eikapp.h>
+#include <apgcli.h>
+#include <RoapApp.rsg>
+#include <avkon.rsg>
+#include <AknNoteWrappers.h>
+#include <AknQueryDialog.h>
+#include <StringLoader.h>
+#include <DocumentHandler.h>
+#include <DcfRep.h>
+#include <caf/caf.h>
+#include <DRMCommon.h>
+#include <aknmessagequerydialog.h>
+#include <AknNoteDialog.h>                  
+#include <FeatMgr.h>                    
+#include <hlplch.h>             
+#include <RoapDef.h>
+#include "RoapAppUi.h"
+#include "RoapAppView.h" 
+#include "RoapAppDocument.h" 
+#include "RoapAppData.h" 
+#include "RoapAppWaitDialog.h" 
+#include "RoapApp.hrh"
+#include "RoapAppPanic.h"
+#include "RequestCompleteCallback.h"
+#include "RoapAppLogger.h"
+#include <HttpDownloadMgrCommon.h>
+
+#ifdef __SERIES60_HELP
+// Context-Sensitve Help File
+#include <csxhelp/browser.hlp.hrh>
+#endif // __SERIES60_HELP
+//#include "browser.hlp.hrh" // replace with DRMUI.hlp.hrh when ready 
+
+// ================= CONSTANTS =======================
+/// For launching more info DRM_HLP_REGISTRATION
+_LIT(KDRM_HLP_REGISTRATION,"DRM_HLP_REGISTRATION"); 
+
+/// Temp file directory:
+_LIT( KRoapTempFilePath, "c:\\system\\temp\\" );
+
+/// Next Line
+_LIT( KNextLine, "\n" );
+
+// ROAP App UID
+LOCAL_D const TUid KROAPAppUid = { 0x10008d64 };
+
+// BrowserNG UID
+LOCAL_D const TUid KCRUidBrowser   = {0x10008D39};
+
+// KBrowserDefaultAccessPoint
+LOCAL_D const TInt KBrowserDefaultAccessPoint = 0x0E;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------
+// CRoapAppUi::CRoapAppUi()
+// ----------------------------------------------------------
+//
+CRoapAppUi::CRoapAppUi()
+    {
+    CLOG(( 2, _L("*** CRoapAppUi::CRoapAppUi") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ConstructL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::ConstructL()
+    {
+    BaseConstructL( EAknEnableMSK | EAknEnableSkin );
+    iView = CRoapAppView::NewL( ClientRect(), this );
+    iCallback = new ( ELeave ) CRequestCompleteCallback();
+    
+    TRAPD( err, iDownloadMgr.ConnectL( KROAPAppUid, *this, EFalse ) );
+	User::LeaveIfError(err);
+    
+#ifndef __WINSCW__
+
+    CRepository *repository = CRepository::NewL( KCRUidBrowser );
+
+    TInt retVal(0);
+    repository->Get(KBrowserDefaultAccessPoint, retVal);
+    delete repository;
+    repository = NULL;
+    
+    CLOG(( 2, _L("   KBrowserDefaultAccessPoint: %d"), retVal ));
+    
+    iDownloadMgr.SetIntAttribute(EDlMgrIap, retVal );
+    
+#endif
+    
+    iPostResponseURLDownLoad = EFalse;	
+ 
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::~CRoapAppUi()
+// ----------------------------------------------------------
+//
+CRoapAppUi::~CRoapAppUi()
+    {
+    
+ CLOG(( 2, _L("*** -> CRoapAppUi::~CRoapAppUi") ));
+       
+    if( iDownloadMgr.Handle() )
+ 	    {
+ 	    iDownloadMgr.DeleteAll();
+ 	    iDownloadMgr.Close();
+ 	    }
+    
+    // We must Cancel the model before deleting the callback.
+    RoapDocument()->Engine().Cancel();
+    delete iCallback;
+    delete iDocHandler;
+    delete iWaitNote;
+    delete iView;
+    if ( iDoorObserver )
+        {
+        iDoorObserver->NotifyExit( MApaEmbeddedDocObserver::ENoChanges );
+        }
+    iFile.Close();
+    iFs.Close();
+    CLOG(( 2, _L("<- CRoapAppUi::~CRoapAppUi") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::OpenFileL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::OpenFileL( const TDesC& aFileName )
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::OpenFileL aFileName<%S>"), &aFileName ));
+
+    iPostResponseURLDownLoad = EFalse;	
+    Document()->OpenFileL( ETrue, aFileName, iCoeEnv->FsSession() );
+    CLOG(( 2, _L("<- CRoapAppUi::OpenFileL") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::HandleCommandL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::HandleCommandL( TInt aCommand )
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::HandleCommandL aCommand(0x%x)"), \
+        aCommand ));
+    switch ( aCommand )
+        {
+        // From blank screen show during startup (incl. parsing).
+        case EAknSoftkeyBack:
+        // CAknShutter generated command.
+        case EEikCmdExit:
+            {
+            Exit();
+            break;
+            }
+
+        case EAknSoftkeyEmpty:
+            {
+            break;
+            }
+        
+        case ERoapAppCmdCancel:
+            {
+            CancelRoap();
+            break;
+            }
+        default:
+            {
+            CLOG(( 0, _L("  unknown command") ));
+            __ASSERT_DEBUG
+                ( EFalse, RoapAppPanic( ERoapAppUnknownCommand ) );
+            break;
+            }
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::HandleCommandL") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ProcessCommandParametersL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::ProcessCommandParametersL
+( TApaCommand aCommand, TFileName& aDocumentName, const TDesC8& /*aTail*/ )
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::ProcessCommandParametersL") ));
+    CLOG(( 2, _L("   CRoapAppUi: aCommand: %d / aDocumentName: %S"), aCommand, &aDocumentName ));
+    if ( aCommand == EApaCommandOpen )
+        {
+        OpenFileL( aDocumentName );
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::ProcessCommandParametersL") ));
+    return EFalse;
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::HandleResourceChangeL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::HandleResourceChangeL( TInt aType )
+    {
+    CAknAppUi::HandleResourceChangeL( aType );
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        iView->SetRect( ClientRect() );
+        }
+    iView->HandleResourceChange( aType );
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ConnectionConfL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::ConnectionConfL()
+    {
+    // TODO ask user.
+    return ETrue;
+    }
+    
+// ----------------------------------------------------------
+// CRoapAppUi::ContactRiConfL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::ContactRiConfL()
+    {
+    // TODO ask user.
+    return ETrue;
+    }
+    
+// ----------------------------------------------------------
+// CRoapAppUi::TransIdConfL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::TransIdConfL()
+    {
+    return EFalse;
+    }
+    
+// ----------------------------------------------------------
+// CRoapAppUi::RightsObjectDetailsL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::RightsObjectDetailsL
+( const RPointerArray<CDRMRights>& /*aRightsList*/ )
+    {
+    // TODO
+    }
+		    
+// ----------------------------------------------------------
+// CRoapAppUi::ContentDownloadInfoL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::ContentDownloadInfoL
+( TPath& aTempFolder, TFileName& aContentName, TInt& aMaxSize )
+    {
+    aTempFolder = KRoapTempFilePath;
+    aContentName = KNullDesC;
+    aMaxSize = -1;  // -1 == 'unknown'.
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ContentDetailsL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::ContentDetailsL
+( const TDesC& /*aPath*/, const TDesC8& /*aType*/, const TUid& /*aAppUid*/ )
+    {
+    // TODO
+    }
+                                      
+// ----------------------------------------------------------
+// CRoapAppUi::HandleDCFPartL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::HandleDCFPartL( const TDesC8& /*aFilename*/ )
+    {
+    // DRM Engine does not support multipart ROAP response yet.
+    // This method will never be called.
+    User::Leave( KErrNotSupported );
+    }
+        
+// ----------------------------------------------------------
+// CRoapAppUi::RoapProgressInfoL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::RoapProgressInfoL( const TInt /*aProgressInfo*/ )
+    {
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ErrorUrlL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::ErrorUrlL( const TDesC8& /* aErrorUrl */)
+{	
+}
+
+// ----------------------------------------------------------
+// CRoapAppUi::PostResponseUrlL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::PostResponseUrlL( const TDesC8& aPrUrl )
+{
+    CLOG(( 2, _L("-> CRoapAppUi::PostResponseUrlL(\n    %S)"), &aPrUrl ));
+
+    TBool retVal( ETrue );    
+ 
+    //RoapApp is made as client of DownloadMgr. A new download session is created with PostResponse URL,
+    //which handles the response like in any other download
+    RHttpDownload& download = iDownloadMgr.CreateDownloadL(aPrUrl, retVal );
+    download.SetBoolAttribute( EDlAttrNoContentTypeCheck, ETrue );
+    //set the Download status of PostResponse URL 
+    iPostResponseURLDownLoad = ETrue;
+    User::LeaveIfError( download.Start());
+
+}
+		
+// ----------------------------------------------------------
+// CRoapAppUi::HandleServerAppExit()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::HandleServerAppExit( TInt /*aReason*/ )
+    {
+    RunAppShutter();
+    }
+
+// ---------------------------------------------------------
+// CRoapAppUi::LaunchHelpL()
+// ---------------------------------------------------------
+//
+void CRoapAppUi::LaunchHelpL( const TDesC& aContext )
+    {
+    CArrayFix<TCoeHelpContext>* contexts = 
+        new(ELeave) CArrayFixFlat<TCoeHelpContext>( 1 );
+    CleanupStack::PushL( contexts );
+    TCoeHelpContext context;
+    context.iMajor = KDRMHelperUid;
+    context.iContext = aContext;
+    contexts->AppendL( context );
+    CleanupStack::Pop(); // contexts
+    
+    #ifdef __SERIES60_HELP
+    HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), contexts );
+    #endif // __SERIES60_HELP
+    }
+
+
+// ----------------------------------------------------------
+// CRoapAppUi::ShowRoapCallback(TAny* aPtr)
+// ----------------------------------------------------------
+//
+
+TInt CRoapAppUi::ShowRoapCallback( TAny* aPtr )
+{
+    TInt err( KErrNone );    
+    CRoapAppUi* self = static_cast<CRoapAppUi*>(aPtr);
+    TRAP( err, self->LaunchHelpL( KDRM_HLP_REGISTRATION ) ); // KOSS_HLP_SAVED_PAGES for testing       
+    return err;        
+}
+
+
+// ----------------------------------------------------------
+// CRoapAppUi::HandleTriggerParsedL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::HandleTriggerParsedL()
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::HandleTriggerParsedL") ));
+    TBool doRoap( ETrue );
+    const CRoapAppData& data( RoapDocument()->Data() );
+
+    if ( data.iContextStatus == Roap::EInvalidContext )
+        {
+#ifdef RD_DRM_SILENT_RIGHTS_ACQUISITION
+        HBufC* header = StringLoader::LoadLC( R_QTN_DRM_MSQ_QRY_TITLE_REGISTRAT ); 
+        HBufC* regtxt = StringLoader::LoadLC( R_QTN_DRM_MSQ_QUERY_REGISTRATION );
+        HBufC* moreinfo = NULL; 
+        TBool helpFeature = FeatureManager::FeatureSupported( KFeatureIdHelp );
+        if ( helpFeature )
+            {        
+            moreinfo = StringLoader::LoadLC( R_QTN_DRM_MSQ_QUERY_LINK_MORE_INF  );
+            }
+        else 
+            {
+            moreinfo = KNullDesC().AllocLC();
+            }
+                
+
+        HBufC* regtxt_moreinfo = HBufC::NewLC(regtxt->Length() + moreinfo->Length() + 1 );
+        TPtr regPtr( regtxt_moreinfo->Des() );
+        regPtr += *regtxt;
+        regPtr += KNextLine; 
+        regPtr += *moreinfo; 
+      
+        
+        CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( *regtxt_moreinfo );
+        dlg->PrepareLC( R_ROAP_REGISTERCANCEL_QUERY  );
+
+        CAknPopupHeadingPane* hPane = dlg->QueryHeading();
+        if ( hPane )                                         
+            {
+            hPane->SetTextL( *header );
+            }
+            
+        if ( helpFeature )
+            {        
+            // set link 
+            dlg->SetLinkTextL(*moreinfo);
+            TCallBack callback(ShowRoapCallback, this); 
+            dlg->SetLink(callback);             
+            } 
+        
+        TInt ret = dlg->RunLD();
+        if( ret != EAknSoftkeyYes ) 
+            {
+            doRoap = EFalse; 
+            }            
+         CleanupStack::PopAndDestroy(4); // header, regtxt, moreinfo, regtxt_moreinfo    
+#else  // for RD_DRM_SILENT_RIGHTS_ACQUISITION
+        // No valid RI context, ROAP will involve device registration.
+        // User must confirm.
+        CLOG(( 4, _L("  invalid RI context") ));
+        CAknQueryDialog* dialog = CAknQueryDialog::NewL();
+        dialog->PrepareLC( R_ROAP_APP_CONFIRM_QUERY );
+        HBufC* prompt;
+        if ( data.iRiAlias )
+            {
+            // "Registration with %U needed. Register phone?"
+            HBufC* riAlias16 = HBufC::NewLC( data.iRiAlias->Length() );
+            riAlias16->Des().Copy( *data.iRiAlias );
+            prompt = StringLoader::LoadL
+                ( R_QTN_DRM_QUERY_REGISTER_WITH_U, *riAlias16, iCoeEnv );
+            CleanupStack::PopAndDestroy( riAlias16 );
+            CleanupStack::PushL( prompt );
+            }
+        else
+            {
+            // "Registration with content provider needed. Register phone?"
+            prompt = StringLoader::LoadLC
+                ( R_QTN_DRM_QUERY_REGISTER_WITH_CP, iCoeEnv );
+            }
+        dialog->SetPromptL( *prompt );
+        CleanupStack::PopAndDestroy( prompt );
+        if ( !dialog->RunLD() ) 
+            {
+            CLOG(( 4, _L("  cancelled") ));
+            doRoap = EFalse;    // User cancelled registration.
+            }
+#endif // for RD_DRM_SILENT_RIGHTS_ACQUISITION
+    }
+        
+    if ( doRoap )
+        {
+        StartRoapL();
+        }
+    else
+        {
+          CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog
+              (CAknNoteDialog::EConfirmationTone,CAknNoteDialog::EUndefinedTimeout);
+          dialog->PrepareLC( R_ROAP_REGISTER_CANCEL_OK_INFO );
+          HBufC* infoPrompt = StringLoader::LoadLC
+              ( R_QTN_DRM_INFO_PHONE_NOT_REGISTER, iCoeEnv );
+          dialog->SetTextL( *infoPrompt); 
+		  CleanupStack::PopAndDestroy( infoPrompt ); 
+          if ( !dialog->RunLD() )
+		      {
+              CLOG(( 2, _L("Select Cancel") ));
+			  }
+		  RunAppShutter();    
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::HandleTriggerParsedL") ));
+    }
+    
+// ----------------------------------------------------------
+// CRoapAppUi::StartRoapL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::StartRoapL()
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::StartRoapL") ));
+    __ASSERT_DEBUG( !iWaitNote, RoapAppPanic( ERoapAppInternal ) );
+    TInt resId = 0;
+    switch ( RoapDocument()->Data().iType )
+        {
+        case Roap::ERegistrationTrigger:
+            {
+            resId = R_QTN_DRM_WAIT_REGISTERING_DEVICE;
+            break;
+            }
+        case Roap::ERoAcquisitionTrigger:
+            {
+            resId = R_QTN_DRM_WAIT_GETTING_KEY;
+            break;
+            }
+        case Roap::EJoinDomainTrigger:
+            {
+            if ( RoapDocument()->Data().iDomainOperation ==
+                 Roap::EJoinDomainOperation )
+                {
+                resId = R_QTN_DRM_WAIT_JOINING_DOMAIN;
+                }
+            else
+                {
+                resId = R_QTN_DRM_WAIT_UPDATING_ACCOUNT;
+                }
+            break;
+            }
+        case Roap::ELeaveDomainTrigger:
+            {
+            resId = R_QTN_DRM_WAIT_REMOVE_FR_ACCOUNT;
+            break;
+            }
+        case Roap::EMeteringReportTrigger:
+            {
+            resId = R_QTN_DRM_WAIT_UPDATE_METERING_INFO;
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrNotSupported );
+            break;
+            }
+        }
+    __ASSERT_DEBUG( resId, RoapAppPanic( ERoapAppInternal ) );
+    iWaitNote = new (ELeave) CRoapAppWaitDialog
+        ( REINTERPRET_CAST( CEikDialog**, &iWaitNote ), *this );
+    iWaitNote->PrepareLC( R_ROAP_APP_WAIT_NOTE );
+    HBufC* prompt = iCoeEnv->AllocReadResourceLC( resId );
+    iWaitNote->SetTextL( *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    iWaitNote->RunLD();
+    RoapDocument()->Engine().AcceptL( this, &iCallback->iStatus );
+    iCallback->CallbackOnCompletion( TCallBack( StaticRoapDone, this ) );
+    CLOG(( 2, _L("<- CRoapAppUi::StartRoapL") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::CancelRoap()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::CancelRoap()
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::CancelRoap") ));
+    RoapDocument()->Engine().Cancel();
+    CLOG(( 2, _L("<- CRoapAppUi::CancelRoap") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::RoapDone()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::RoapDone()
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::RoapDone") ));
+    delete iWaitNote;
+    iWaitNote = NULL;
+    TInt err = iCallback->iStatus.Int();
+    TBool exitApp( ETrue ); // Exit by default.
+    if ( err )
+        {
+        TRAP_IGNORE( exitApp = RoapFailedL( err ) );
+        }
+    else
+        {
+        TRAP_IGNORE( exitApp = RoapOkL() );
+        }
+    if ( exitApp && !iPostResponseURLDownLoad)
+        {
+        RunAppShutter();
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::RoapDone") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::RoapOkL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::RoapOkL()
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::RoapOkL") ));
+    TBool exitApp( ETrue );
+    switch( RoapDocument()->Data().iType )
+        {
+        case Roap::ERegistrationTrigger:
+            {
+            ConfNoteL( R_QTN_DRM_CONF_DEVICE_REGISTERED );
+            break;
+            }
+        case Roap::ERoAcquisitionTrigger:
+            {
+            exitApp = RoAcqOkL();
+            break;
+            }
+        case Roap::EJoinDomainTrigger:
+            {
+            if ( RoapDocument()->Data().iDomainOperation ==
+                 Roap::EJoinDomainOperation )
+                {
+                ConfNoteL( R_QTN_DRM_CONF_JOINED_TO_DOMAIN );
+                }
+            else
+                {
+                ConfNoteL( R_QTN_DRM_CONF_ACCOUNT_UPDATED );
+                }
+            break;
+            }
+        case Roap::ELeaveDomainTrigger:
+            {
+            ConfNoteL( R_QTN_DRM_INFO_REMOVE_FR_ACCOUNT );
+            break;
+            }
+        case Roap::EMeteringReportTrigger:
+            {
+            ConfNoteL( R_QTN_DRM_CONF_ACCOUNT_UPDATED );
+            break;
+            }            
+        default:
+            {
+            // We should never get here.
+            __ASSERT_DEBUG( EFalse, RoapAppPanic( ERoapAppInternal ) );
+            }
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::RoapOkL returns(%d)"), exitApp ));
+    return exitApp;
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::RoAcqOkL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::RoAcqOkL()
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::RoAcqOkL") ));
+    __ASSERT_DEBUG \
+        ( RoapDocument()->Data().iType == Roap::ERoAcquisitionTrigger, \
+          RoapAppPanic( ERoapAppInternal ) );
+
+    TFileName name;    // Note, filename and extension only! Not full path.
+    TDataType type;
+    TUid appUid( TUid::Null() );
+    if ( RoapDocument()->Data().iContentIdList.Count() )
+        {
+        __ASSERT_DEBUG( !iFs.Handle(), RoapAppPanic( ERoapAppInternal ) );
+        __ASSERT_DEBUG( !iFile.SubSessionHandle(), \
+            RoapAppPanic( ERoapAppInternal ) );
+        User::LeaveIfError( iFs.Connect() );
+        User::LeaveIfError( iFs.ShareProtected() );
+        CDcfRep* dcfRep = CDcfRep::NewL();
+        CleanupStack::PushL( dcfRep );
+        // It is not specified what to do if we have more content ids.
+        // Best guess: open the first.
+        TPtrC8 cid( *(RoapDocument()->Data().iContentIdList[0]) );
+        TRAPD( err, dcfRep->GetFileHandleL ( cid, iFile, iFs ) );
+        if ( !err && CanOpenL( iFile ) )
+            {
+            User::LeaveIfError( iFile.Name( name ) );
+            RApaLsSession apaLs;
+            User::LeaveIfError( apaLs.Connect() );
+            CleanupClosePushL<RApaLsSession>( apaLs );
+            User::LeaveIfError( apaLs.AppForDocument( iFile, appUid, type ) );
+            CleanupStack::PopAndDestroy();  // apaLs
+            }
+#ifdef __TEST_ROAP_APP_LOG
+        else
+            {
+            CLOG(( 4, _L8("  err(%d) getting file by cid<%S>"), err, &cid ));
+            }
+#endif /* def __TEST_ROAP_APP_LOG */
+        CleanupStack::PopAndDestroy( dcfRep );
+        }
+
+    TBool exitApp( ETrue );
+    if ( appUid.iUid )
+        {
+        // MO (related to the received RO) is already here and is supported
+        // by the system. Ask user if he wants to open it now.
+        __ASSERT_DEBUG( iFs.Handle(), RoapAppPanic( ERoapAppInternal ) );
+        __ASSERT_DEBUG( iFile.SubSessionHandle(), \
+            RoapAppPanic( ERoapAppInternal ) );
+        __ASSERT_DEBUG( name.Length(), RoapAppPanic( ERoapAppInternal ) );
+        CAknQueryDialog* dialog = CAknQueryDialog::NewL();
+        dialog->PrepareLC( R_ROAP_APP_CONFIRM_QUERY );
+        HBufC* prompt = StringLoader::LoadLC
+            ( R_QTN_DRM_QUERY_KEY_RECEIVED_OPEN, name, iEikonEnv );
+        dialog->SetPromptL( *prompt );
+        CleanupStack::PopAndDestroy( prompt );
+        if ( dialog->RunLD() ) 
+            {
+            CLOG(( 4, _L("  launching <%S>, handler(0x%x)"), \
+                &name, appUid.iUid ));
+            __ASSERT_DEBUG( !iDocHandler, RoapAppPanic( ERoapAppInternal ) );
+            iDocHandler = CDocumentHandler::NewL
+                ( (CEikProcess*)Application()->Process() );
+            iDocHandler->SetExitObserver( this );
+            User::LeaveIfError
+                ( iDocHandler->OpenFileEmbeddedL( iFile, type ) );
+            exitApp = EFalse;
+            }
+        }
+    else
+        {
+        ConfNoteL( R_QTN_DRM_INFO_ACT_KEY_RECEIVED );
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::RoAcqOkL returns(%d)"), exitApp ));
+    return exitApp;
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::RoapFailedL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::RoapFailedL( TInt aError )
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::RoapFailedL aError(%d)"), aError ));
+    TBool exitApp( ETrue );
+    TInt resId = 0;
+    switch ( aError )
+        {
+        case KErrCancel:
+            {
+            // For Cancel, just do nothing.
+            break;
+            }
+        case KErrRoapDomainFull:
+            {
+            resId = R_QTN_DRM_INFO_ACCOUNT_IS_FULL;
+            break;
+            }
+        case KErrRoapInvalidDomain:
+            {
+            resId = R_QTN_DRM_ACCOUNT_NOT_RECOGNISED;
+            break;
+            }
+        case KErrRoapServer:
+            {
+            // Temporary server error. For RoAcq, offer retry; for other
+            // ROAP-s, fall through to default handling (plain error note).
+            if ( RoapDocument()->Data().iType == Roap::ERoAcquisitionTrigger )
+                {
+                CAknQueryDialog* dialog = CAknQueryDialog::NewL();
+                dialog->PrepareLC( R_ROAP_APP_CONFIRM_QUERY );
+                HBufC* prompt = StringLoader::LoadLC
+                    ( R_QTN_DRM_GET_KEY_FAILED_RETRY, iEikonEnv );
+                dialog->SetPromptL( *prompt );
+                CleanupStack::PopAndDestroy( prompt );
+                if ( dialog->RunLD() ) 
+                    {
+                    StartRoapL();
+                    exitApp = EFalse;
+                    }
+                break;
+                }
+            // Not RoAcq: fall through to default (error note).
+            }
+        default:
+            {
+            // Default error message is based on trigger type.
+            switch ( RoapDocument()->Data().iType )
+                {
+                case Roap::ERegistrationTrigger:
+                    {
+                    resId = R_QTN_DRM_INFO_DEVICE_REGIST_FAIL;
+                    break;
+                    }
+                case Roap::ERoAcquisitionTrigger:
+                    {
+                    resId = R_QTN_DRM_INFO_GETTING_KEY_FAILED;
+                    break;
+                    }
+                case Roap::EJoinDomainTrigger:
+                    {
+                    if ( RoapDocument()->Data().iDomainOperation ==
+                         Roap::EJoinDomainOperation )
+                        {
+                        resId = R_QTN_DRM_INFO_REGISTRATION_FAILED;
+                        }
+                    else
+                        {
+                        resId = R_QTN_DRM_INFO_UPDATE_DOMAIN_FAIL;
+                        }
+                    break;
+                    }
+                case Roap::ELeaveDomainTrigger:
+                    {
+                    resId = R_QTN_DRM_REMOVE_FR_ACCOUNT_FAIL;
+                    break;
+                    }
+                case Roap::EMeteringReportTrigger:
+                    {
+                    resId = R_QTN_DRM_INFO_REGISTRATION_FAILED;
+                    break;
+                    }                    
+                default:
+                    {
+                    __ASSERT_DEBUG( EFalse, \
+                        RoapAppPanic( ERoapAppInternal ) );
+                    }
+                }
+            break;
+            }
+        }
+    if ( resId )
+        {
+        InfoNoteL( resId );
+        }
+    CLOG(( 2, _L("<- CRoapAppUi::RoapFailedL returns(%d)"), exitApp ));
+    return exitApp;
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::StaticRoapDone()
+// ----------------------------------------------------------
+//
+TInt CRoapAppUi::StaticRoapDone( TAny* aPtr )
+    {
+    STATIC_CAST( CRoapAppUi*, aPtr )->RoapDone();
+    return EFalse;  // TCallback should return EFalse as TInt.
+    }
+    
+// ----------------------------------------------------------
+// CRoapAppUi::RoapDocument()
+// ----------------------------------------------------------
+//
+CRoapAppDocument* CRoapAppUi::RoapDocument()
+    {
+    return STATIC_CAST( CRoapAppDocument*, Document() );
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::HandleDialogCommandL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::HandleDialogCommandL( TInt aCommand )
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::HandleDialogCommandL aCommand(%d)"), \
+        aCommand ));
+    HandleCommandL( aCommand );
+    CLOG(( 2, _L("<- CRoapAppUi::HandleDialogCommandL") ));
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::InfoNoteL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::InfoNoteL( TInt aPromptResourceId )
+    {
+    HBufC* prompt = iCoeEnv->AllocReadResourceLC( aPromptResourceId );
+    CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
+    note->ExecuteLD( *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::InfoNoteL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::InfoNoteL( const TDesC& aPrompt )
+    {
+    CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
+    note->ExecuteLD( aPrompt );
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ConfNoteL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::ConfNoteL( TInt aPromptResourceId )
+    {
+    HBufC* prompt = iCoeEnv->AllocReadResourceLC( aPromptResourceId );
+    CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote( ETrue );
+    note->ExecuteLD( *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::ConfNoteL()
+// ----------------------------------------------------------
+//
+void CRoapAppUi::ConfNoteL( const TDesC& aPrompt )
+    {
+    CAknConfirmationNote* note = new (ELeave) CAknConfirmationNote( ETrue );
+    note->ExecuteLD( aPrompt );
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::CanOpenL()
+// ----------------------------------------------------------
+//
+TBool CRoapAppUi::CanOpenL( RFile& aFile ) const
+    {
+    CLOG(( 2, _L("-> CRoapAppUi::CanOpenL") ));
+    TBool canOpen( EFalse );
+    using namespace ContentAccess;
+    TInt err;
+    CData* data = NULL;
+    // 'No right' style errors leave, need to TRAP.
+    TRAP( err, data = CData::NewL( aFile, KDefaultContentObject, EPeek ) );
+    // Note, 'data' not pushed. No leaving calls below.
+    if ( !err &&
+                 (
+                 !data->EvaluateIntent( EPlay ) ||
+                 !data->EvaluateIntent( EView ) ||
+                 !data->EvaluateIntent( EExecute )
+                 )
+       )
+        {
+        canOpen = ETrue;
+        }
+    delete data;
+    CLOG(( 2, _L("<- CRoapAppUi::CanOpenL (%d)"), canOpen ));
+    return canOpen;
+    }
+
+// ----------------------------------------------------------
+// CRoapAppUi::HandleOnePassRoL()
+// ----------------------------------------------------------
+//    
+void CRoapAppUi::HandleOnePassRoL(TInt aError ) 
+    {
+    iCallback->iStatus = aError;
+    RoapDone();
+    }
+
+
+// ----------------------------------------------------------
+// CRoapAppUi::HandleDMgrEventL()
+// ----------------------------------------------------------
+//    
+void CRoapAppUi::HandleDMgrEventL( RHttpDownload& aDownload, THttpDownloadEvent aEvent )
+    {
+    
+    CLOG(( 2, _L("-> CRoapAppUi::HandleDMgrEventL") ));
+    
+   	
+	if(EHttpDlCompleted == aEvent.iDownloadState)
+		{
+        HBufC8* contentType = HBufC8::NewLC(KMaxContentTypeLength);
+        TPtr8 contentTypePtr = contentType->Des(); 
+        User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrContentType, contentTypePtr ) );
+        TBool isRoapTriggerType = !contentType->Compare(KRoapMimeType);  
+		CleanupStack::PopAndDestroy( contentType );
+		
+        HBufC* fileName = HBufC::NewLC( KMaxPath );
+        TPtr fileNamePtr = fileName->Des();
+        User::LeaveIfError( aDownload.GetStringAttribute( EDlAttrDestFilename, fileNamePtr ) );
+
+		if(isRoapTriggerType)
+			{
+			OpenFileL(fileNamePtr);
+			CleanupStack::PopAndDestroy( fileName );
+			return;
+			}
+		CleanupStack::PopAndDestroy( fileName );
+		iPostResponseURLDownLoad = EFalse;	
+		RoapDone();		
+		}
+	else if( EHttpDlFailed == aEvent.iDownloadState || EHttpDlPaused == aEvent.iDownloadState )
+		{
+		iCallback->iStatus = KErrRoapGeneral;
+		iPostResponseURLDownLoad = EFalse;	
+		RoapDone();		
+		}
+		
+	CLOG(( 2, _L("<- CRoapAppUi::HandleDMgrEventL") ));
+    }
+