commondrm/drmutility/src/DrmUtilityDmgrWrapper.cpp
changeset 0 95b198f216e5
child 18 8a03a285ab14
child 23 493788a4a8a4
equal deleted inserted replaced
-1:000000000000 0:95b198f216e5
       
     1 /*
       
     2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Dynamically loadable wrapper for Download manager
       
    15 *
       
    16 */
       
    17 
       
    18 #include <centralrepository.h>
       
    19 #include <cdblen.h>
       
    20 #include <cmconnectionmethod.h>
       
    21 #include <cmdestination.h>
       
    22 #include <cmconnectionmethoddef.h>
       
    23 #include <cmmanager.h>
       
    24 
       
    25 #ifdef __SERIES60_NATIVE_BROWSER
       
    26 #include <browseruisdkcrkeys.h>
       
    27 #endif
       
    28 
       
    29 #ifdef RD_MULTIPLE_DRIVE
       
    30 #include <driveinfo.h>
       
    31 #endif
       
    32 
       
    33 #include <stringloader.h>
       
    34 #include <data_caging_path_literals.hrh>
       
    35 
       
    36 #include <coneresloader.h>
       
    37 #include <apparc.h>
       
    38 #include <drmutilitydmgrwrapper.rsg>
       
    39 
       
    40 #include "roapeng.h"
       
    41 #include "roapsyncwrapper.h"
       
    42 #include "roapdef.h"
       
    43 
       
    44 #include "drmutilitydmgrwrapper.h"
       
    45 #include "drmutilitydmgrwrapperlogger.h"
       
    46 
       
    47 // DEBUG macros
       
    48 #ifdef _DEBUG
       
    49 #define DRMDEBUGLIT( a, b ) \
       
    50 _LIT( a , b )
       
    51 #define DRMDEBUG( a ) \
       
    52 RDebug::Print( a )
       
    53 #define DRMDEBUG2( a, b ) \
       
    54 RDebug::Print( a, b )
       
    55 #else
       
    56 #define DRMDEBUGLIT( a, b )
       
    57 #define DRMDEBUG( a )
       
    58 #define DRMDEBUG2( a, b )
       
    59 #endif
       
    60 
       
    61 // CONSTANTS
       
    62 #ifndef __SERIES60_NATIVE_BROWSER
       
    63 const TUid KCRUidBrowser = {0x10008D39};
       
    64 const TUint32 KBrowserDefaultAccessPoint = 0x0000000E;
       
    65 const TUint32 KBrowserAccessPointSelectionMode = 0x0000001E;
       
    66 #endif
       
    67 
       
    68 #ifndef RD_MULTIPLE_DRIVE
       
    69 _LIT( KDriveZ, "z:" );
       
    70 _LIT( KDrmUtilityTriggerFilePath, "d:\\" );
       
    71 #else
       
    72 _LIT( KRomDriveFormatter, "%c:" );
       
    73 _LIT( KKDrmUtilityTriggerFilePathFormatter, "%c:\\" );
       
    74 #endif
       
    75 
       
    76 _LIT( KCDrmUtilityDmgrWrapperResFileName,"DrmUtilityDmgrWrapper.rsc" );
       
    77 const TInt KProgressInfoFinalValue( 200 );
       
    78 const TInt KProgressInfoIncrementSmall( 5 );
       
    79 const TInt KProgressInfoIncrementMedium( 10 );
       
    80 const TInt KProgressInfoIncrementLarge( 30 );
       
    81 
       
    82 // ======== LOCAL FUNCTIONS ========
       
    83 
       
    84 // ---------------------------------------------------------------------------
       
    85 // DeleteHttpDowload
       
    86 // ---------------------------------------------------------------------------
       
    87 //
       
    88 LOCAL_C void DeleteHttpDowload( TAny* aDownload )
       
    89     {
       
    90     reinterpret_cast< RHttpDownload* >( aDownload )->Delete();
       
    91     }
       
    92 
       
    93 // ---------------------------------------------------------------------------
       
    94 // IapIdOfDefaultSnapL
       
    95 // for trapping purposes only
       
    96 // ---------------------------------------------------------------------------
       
    97 //
       
    98 LOCAL_C TUint32 IapIdOfDefaultSnapL(
       
    99     RCmManager& aCmManager,
       
   100     const TUint32 aDefaultSnap )
       
   101     {
       
   102     RCmDestination dest( aCmManager.DestinationL( aDefaultSnap ) );
       
   103     CleanupClosePushL( dest );
       
   104     TUint32 iapIdOfDest( 0 );
       
   105 
       
   106     if ( dest.ConnectionMethodCount() <= 0 )
       
   107         {
       
   108         User::Leave( KErrNotFound );
       
   109         }
       
   110 
       
   111     RCmConnectionMethod cMeth( dest.ConnectionMethodL( 0 ) );
       
   112     CleanupClosePushL( cMeth );
       
   113 
       
   114     iapIdOfDest = cMeth.GetIntAttributeL( CMManager::ECmIapId );
       
   115     CleanupStack::PopAndDestroy( &cMeth );
       
   116     CleanupStack::PopAndDestroy( &dest );
       
   117     return iapIdOfDest;
       
   118     }
       
   119 
       
   120 
       
   121 // ======== MEMBER FUNCTIONS ========
       
   122 
       
   123 // ---------------------------------------------------------------------------
       
   124 // CDrmUtilityDmgrWrapper::CDrmUtilityDmgrWrapper
       
   125 // ---------------------------------------------------------------------------
       
   126 //
       
   127 CDrmUtilityDmgrWrapper::CDrmUtilityDmgrWrapper() :
       
   128     iUseCoeEnv( EFalse )
       
   129     {
       
   130     }
       
   131 
       
   132 // ---------------------------------------------------------------------------
       
   133 // CDrmUtilityDmgrWrapper::ConstructL
       
   134 // ---------------------------------------------------------------------------
       
   135 //
       
   136 void CDrmUtilityDmgrWrapper::ConstructL()
       
   137     {
       
   138     CLOG_WRITE( "DMgrWrapper::ConstructL" );
       
   139     const TInt KDrmUtilityDmgrWrapperUid = 0x102830FE;
       
   140     iDlMgr.ConnectL( TUid::Uid(KDrmUtilityDmgrWrapperUid), *this, EFalse );
       
   141     iProgressInfo = NULL;
       
   142     iProgressNoteDialog = NULL;
       
   143     iDialogDismissed = ETrue;
       
   144     }
       
   145 
       
   146 
       
   147 
       
   148 // ---------------------------------------------------------------------------
       
   149 // CDrmUtilityDmgrWrapper::NewL
       
   150 // ---------------------------------------------------------------------------
       
   151 //
       
   152 CDrmUtilityDmgrWrapper* CDrmUtilityDmgrWrapper::NewL()
       
   153     {
       
   154     CLOG_WRITE( "DMgrWrapper::NewL" );
       
   155     CDrmUtilityDmgrWrapper* self( CDrmUtilityDmgrWrapper::NewLC() );
       
   156     CleanupStack::Pop( self );
       
   157     return self;
       
   158     }
       
   159 
       
   160 
       
   161 // ---------------------------------------------------------------------------
       
   162 // CDrmUtilityDmgrWrapper::NewLC
       
   163 // ---------------------------------------------------------------------------
       
   164 //
       
   165 CDrmUtilityDmgrWrapper* CDrmUtilityDmgrWrapper::NewLC()
       
   166     {
       
   167     CLOG_WRITE( "DMgrWrapper::NewLC" );
       
   168     CDrmUtilityDmgrWrapper* self( new( ELeave ) CDrmUtilityDmgrWrapper() );
       
   169     CleanupStack::PushL( self );
       
   170     self->ConstructL();
       
   171     return self;
       
   172     }
       
   173 
       
   174 
       
   175 // ---------------------------------------------------------------------------
       
   176 // CDrmUtilityDmgrWrapper::~CDrmUtilityDmgrWrapper
       
   177 // ---------------------------------------------------------------------------
       
   178 //
       
   179 CDrmUtilityDmgrWrapper::~CDrmUtilityDmgrWrapper()
       
   180     {
       
   181     CLOG_WRITE( "DMgrWrapper destructor" );
       
   182     if ( iProgressNoteDialog )
       
   183        {
       
   184        // deletes the dialog
       
   185        TRAPD( err, iProgressNoteDialog->ProcessFinishedL() );
       
   186        if ( err )
       
   187            {
       
   188            delete iProgressNoteDialog;
       
   189            }
       
   190        iProgressNoteDialog = NULL;
       
   191        }
       
   192     delete iErrorUrl;
       
   193     delete iPostResponseUrl;
       
   194 
       
   195 #ifdef _DEBUG
       
   196 
       
   197     if ( iDlMgr.Handle() )
       
   198         {
       
   199         iDlMgr.Close();
       
   200         }
       
   201 
       
   202 #else
       
   203 
       
   204     iDlMgr.Close();
       
   205 
       
   206 #endif
       
   207     }
       
   208 
       
   209 
       
   210 // ---------------------------------------------------------------------------
       
   211 // CDrmUtilityDmgrWrapper::DownloadAndHandleRoapTriggerL
       
   212 // ---------------------------------------------------------------------------
       
   213 //
       
   214 void CDrmUtilityDmgrWrapper::DownloadAndHandleRoapTriggerL( const HBufC8* aUrl )
       
   215     {
       
   216     CLOG_WRITE( "DMgrWrapper::DownloadAndHandleRoapTriggerL" );
       
   217     iUseCoeEnv = EFalse;
       
   218     DoDownloadAndHandleRoapTriggerL( aUrl );
       
   219     HandlePostResponseUrlL();
       
   220     }
       
   221 
       
   222 
       
   223 // ---------------------------------------------------------------------------
       
   224 // CDrmUtilityDmgrWrapper::DownloadAndHandleRoapTriggerL
       
   225 // ---------------------------------------------------------------------------
       
   226 //
       
   227 void CDrmUtilityDmgrWrapper::DownloadAndHandleRoapTriggerL(
       
   228     const HBufC8* aUrl, CCoeEnv& aCoeEnv )
       
   229     {
       
   230     CLOG_WRITE( "DMgrWrapper::DownloadAndHandleRoapTriggerL" );
       
   231     iCoeEnv = &aCoeEnv;
       
   232     iUseCoeEnv = ETrue;
       
   233     DoDownloadAndHandleRoapTriggerL( aUrl );
       
   234     HandlePostResponseUrlL();
       
   235     }
       
   236 
       
   237 
       
   238 // ---------------------------------------------------------------------------
       
   239 // CDrmUtilityDmgrWrapper::HandlePostResponseUrlL
       
   240 // ---------------------------------------------------------------------------
       
   241 //
       
   242 void CDrmUtilityDmgrWrapper::HandlePostResponseUrlL()
       
   243     {
       
   244     if ( iPostResponseUrl )
       
   245         {
       
   246         DoDownloadAndHandleRoapTriggerL( iPostResponseUrl );
       
   247         // prevent infinite post response fetches.
       
   248         delete iPostResponseUrl;
       
   249         iPostResponseUrl = NULL;
       
   250 
       
   251         // Ensure progress note gets deleted.
       
   252         // It remains open if prUrl initialted ROAP operation has PrUrl
       
   253         // (unsupported chained metering report)
       
   254         RemoveProgressNoteL();
       
   255         }
       
   256     }
       
   257 
       
   258 
       
   259 // ---------------------------------------------------------------------------
       
   260 // CDrmUtilityDmgrWrapper::DoDownloadAndHandleRoapTriggerL
       
   261 // ---------------------------------------------------------------------------
       
   262 //
       
   263 void CDrmUtilityDmgrWrapper::DoDownloadAndHandleRoapTriggerL(
       
   264     const HBufC8* aUrl )
       
   265     {
       
   266     RFs fs;
       
   267     RFile roapTrigger;
       
   268     HBufC8* triggerBuf( NULL );
       
   269     TBool result( EFalse );
       
   270     TFileName triggerFileName;
       
   271 
       
   272     CLOG_WRITE( "DMgrWrapper::DoDownloadAndHandleRoapTriggerL" );
       
   273     User::LeaveIfError( fs.Connect() );
       
   274     CleanupClosePushL( fs );
       
   275     User::LeaveIfError( fs.ShareProtected() );
       
   276 
       
   277 #ifndef RD_MULTIPLE_DRIVE
       
   278 
       
   279     User::LeaveIfError( roapTrigger.Temp(
       
   280             fs, KDrmUtilityTriggerFilePath, triggerFileName, EFileWrite ) );
       
   281 
       
   282 #else //RD_MULTIPLE_DRIVE
       
   283 
       
   284     TInt driveNumber( -1 );
       
   285     TChar driveLetter;
       
   286     DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRam, driveNumber );
       
   287     fs.DriveToChar( driveNumber, driveLetter );
       
   288 
       
   289     TFileName utilityTriggerFilePath;
       
   290 
       
   291     utilityTriggerFilePath.Format( KKDrmUtilityTriggerFilePathFormatter,
       
   292         (TUint)driveLetter );
       
   293 
       
   294     User::LeaveIfError( roapTrigger.Temp(
       
   295             fs, utilityTriggerFilePath, triggerFileName, EFileWrite ) );
       
   296 
       
   297 #endif
       
   298 
       
   299 
       
   300     TPtrC8 KNullPtr8( NULL, 0 );
       
   301     RHttpDownload* downloadPtr( iDlMgr.FindDownload( *aUrl, KNullPtr8 ) );
       
   302     if ( downloadPtr )
       
   303         {
       
   304         // Stale download found.
       
   305         // Remove it, and re-create a new download.
       
   306         downloadPtr->Delete();
       
   307         downloadPtr = NULL;
       
   308         }
       
   309 
       
   310     // create and start download
       
   311     RHttpDownload& download = iDlMgr.CreateDownloadL( *aUrl, result );
       
   312     // Put download for proper cleanup.
       
   313     TCleanupItem item( DeleteHttpDowload, &download );
       
   314     CleanupStack::PushL( item );
       
   315 
       
   316     CleanupClosePushL( roapTrigger );
       
   317 
       
   318     if ( !iPostResponseUrl )
       
   319         {
       
   320         // No post response retieval. Note must be created.
       
   321         ShowProgressNoteL();
       
   322         }
       
   323 
       
   324     if ( result )
       
   325         {
       
   326         const TInt KReadBufSize( 512 );
       
   327         TInt triggerFileSize( 0 );
       
   328 
       
   329         CLOG_WRITE(
       
   330             "DMgrWrapper::DoDownloadAndHandleRoapTriggerL: download created" );
       
   331         iDownloadSuccess = EFalse;
       
   332         iConnectionError = EFalse;
       
   333 
       
   334         SetDefaultAccessPointL();
       
   335 
       
   336         User::LeaveIfError( download.SetFileHandleAttribute( roapTrigger ) );
       
   337         User::LeaveIfError(
       
   338             download.SetBoolAttribute( EDlAttrNoContentTypeCheck, ETrue ) );
       
   339         User::LeaveIfError( download.Start() );
       
   340 
       
   341         // wait until download is finished
       
   342         iWait.Start();
       
   343 
       
   344         // Check success of download
       
   345         CLOG_WRITE(
       
   346             "DMgrWrapper::DoDownloadAndHandleRoapTriggerL: download finished" );
       
   347 
       
   348         CleanupStack::Pop( &roapTrigger );
       
   349         roapTrigger.Close();
       
   350         if ( !iDownloadSuccess )
       
   351             {
       
   352             RemoveProgressNoteL();
       
   353             if ( iConnectionError )
       
   354                 {
       
   355                 User::Leave( KErrCouldNotConnect );
       
   356                 }
       
   357             else
       
   358                 {
       
   359                 User::Leave( KErrGeneral );
       
   360                 }
       
   361             }
       
   362         User::LeaveIfError( roapTrigger.Open( fs,
       
   363                                               triggerFileName,
       
   364                                               EFileShareReadersOrWriters ) );
       
   365         CleanupClosePushL( roapTrigger );
       
   366 
       
   367         // Get filehandle of ROAP trigger
       
   368         // Read file to buffer
       
   369         User::LeaveIfError( roapTrigger.Size( triggerFileSize ) );
       
   370         triggerBuf = HBufC8::NewLC( triggerFileSize );
       
   371 
       
   372         RBuf8 readBuf;
       
   373         readBuf.CleanupClosePushL();
       
   374         readBuf.CreateL( KReadBufSize );
       
   375 
       
   376         User::LeaveIfError( roapTrigger.Read( readBuf, KReadBufSize ) );
       
   377         triggerBuf->Des().Copy( readBuf );
       
   378         while ( readBuf.Length() == KReadBufSize )
       
   379             {
       
   380             User::LeaveIfError( roapTrigger.Read( readBuf, KReadBufSize ) );
       
   381             triggerBuf->Des().Append( readBuf );
       
   382             }
       
   383 
       
   384         CleanupStack::PopAndDestroy( &readBuf );
       
   385 
       
   386         if ( iUseCoeEnv && iProgressInfo )
       
   387             {
       
   388             iProgressInfo->IncrementAndDraw( KProgressInfoIncrementMedium );
       
   389             }
       
   390 
       
   391         // And let ROAP handle it...
       
   392         CRoapSyncWrapper* roapWrapper( CRoapSyncWrapper::NewL() );
       
   393         CleanupStack::PushL( roapWrapper );
       
   394         TRAPD( err, roapWrapper->HandleTriggerL( *triggerBuf ) );
       
   395         if ( err )
       
   396             {
       
   397             TInt errorType( 0 );
       
   398             TRAPD( err2,
       
   399                 iErrorUrl = roapWrapper->GetErrorUrlL( err, errorType ) );
       
   400             if ( err2 )
       
   401                 {
       
   402                 RemoveProgressNoteL();
       
   403                 delete iErrorUrl;
       
   404                 iErrorUrl = NULL;
       
   405                 User::Leave( err2 );
       
   406                 }
       
   407             else if ( errorType != KErrRoapTemporary )
       
   408                 {
       
   409                 RemoveProgressNoteL();
       
   410                 delete iErrorUrl;
       
   411                 iErrorUrl = NULL;
       
   412                 User::Leave( err );
       
   413                 }
       
   414             else
       
   415                 {
       
   416                 RemoveProgressNoteL();
       
   417                 User::Leave( err );
       
   418                 }
       
   419             }
       
   420         if ( iPostResponseUrl )
       
   421             {
       
   422             delete iPostResponseUrl;
       
   423             iPostResponseUrl = NULL;
       
   424             }
       
   425         iPostResponseUrl = roapWrapper->GetPostResponseUrlL();
       
   426         CleanupStack::PopAndDestroy( 2, triggerBuf );
       
   427 
       
   428         if ( iUseCoeEnv && iProgressInfo && !iPostResponseUrl )
       
   429             {
       
   430             // No PrUrl found. Progess is complete.
       
   431             iProgressInfo->SetAndDraw( KProgressInfoFinalValue );
       
   432             }
       
   433         }
       
   434 
       
   435     // Trick to keep note open long enough during prUrl retrieval
       
   436     if ( !iPostResponseUrl )
       
   437         {
       
   438         RemoveProgressNoteL();
       
   439         }
       
   440     else
       
   441         {
       
   442         if ( iUseCoeEnv && iProgressInfo )
       
   443             {
       
   444             iProgressInfo->IncrementAndDraw( KProgressInfoIncrementMedium );
       
   445             }
       
   446         }
       
   447 
       
   448     CleanupStack::PopAndDestroy( &roapTrigger );
       
   449     CleanupStack::PopAndDestroy( &download );
       
   450 
       
   451     fs.Delete( triggerFileName );
       
   452     CleanupStack::PopAndDestroy( &fs );
       
   453     }
       
   454 
       
   455 
       
   456 // ---------------------------------------------------------------------------
       
   457 // CDrmUtilityDmgrWrapper::SetDefaultAccessPointL
       
   458 // ---------------------------------------------------------------------------
       
   459 //
       
   460 void CDrmUtilityDmgrWrapper::SetDefaultAccessPointL()
       
   461     {
       
   462     const TInt KDestinationSelectionMode( 2 );
       
   463     CRepository* repository( NULL );
       
   464     TInt ap( 0 );
       
   465     TInt alwaysAsk( 0 );
       
   466     TUint32 iapd32( 0 );
       
   467     TInt defaultSnap( 0 );
       
   468     TInt err( KErrNone );
       
   469 
       
   470     CLOG_WRITE( "DMgrWrapper::SetDefaultAccessPointL" );
       
   471     DRMDEBUGLIT( KDuiBrApFormat,
       
   472         "CDrmUtilityDmgrWrapper::SetDefaultAccessPointL %d" );
       
   473     DRMDEBUGLIT( KDuiBrApFormat2, " KBrowserDefaultAccessPoint = %d" );
       
   474     DRMDEBUGLIT( KDuiBrApFormat3, " KBrowserAccessPointSelectionMode = %d" );
       
   475     DRMDEBUGLIT( KDuiBrApFormat4, " KBrowserNGDefaultSnapId = %d" );
       
   476 
       
   477     repository = CRepository::NewL( KCRUidBrowser );
       
   478     CleanupStack::PushL( repository );
       
   479     repository->Get( KBrowserDefaultAccessPoint, ap );
       
   480     repository->Get( KBrowserAccessPointSelectionMode, alwaysAsk );
       
   481     repository->Get( KBrowserNGDefaultSnapId, defaultSnap );
       
   482     DRMDEBUG2( KDuiBrApFormat(), __LINE__ );
       
   483     DRMDEBUG2( KDuiBrApFormat2(), ap );
       
   484     DRMDEBUG2( KDuiBrApFormat3(), alwaysAsk );
       
   485     DRMDEBUG2( KDuiBrApFormat4(), defaultSnap );
       
   486 
       
   487     if ( ap <= KErrNotFound && defaultSnap <= KErrNotFound )
       
   488         {
       
   489         alwaysAsk = ETrue;
       
   490         }
       
   491     else
       
   492         {
       
   493         RCmManager cmManager;
       
   494         cmManager.OpenLC();
       
   495         if ( !alwaysAsk )
       
   496             {
       
   497             TRAP( err, iapd32 = cmManager.GetConnectionMethodInfoIntL(
       
   498                     ap, CMManager::ECmIapId ) );
       
   499             }
       
   500         else if ( alwaysAsk == KDestinationSelectionMode )
       
   501             {
       
   502             TRAP( err, iapd32 =
       
   503                 IapIdOfDefaultSnapL( cmManager, defaultSnap ) );
       
   504             }
       
   505         CleanupStack::PopAndDestroy( &cmManager );
       
   506         }
       
   507     if ( !err && ( !alwaysAsk || alwaysAsk == KDestinationSelectionMode ) )
       
   508         {
       
   509         err = iDlMgr.SetIntAttribute( EDlMgrIap, iapd32 );
       
   510         }
       
   511     CleanupStack::PopAndDestroy( repository );
       
   512     }
       
   513 
       
   514 
       
   515 // ---------------------------------------------------------------------------
       
   516 // CDrmUtilityDmgrWrapper::GetErrorUrlL
       
   517 // ---------------------------------------------------------------------------
       
   518 //
       
   519 HBufC8* CDrmUtilityDmgrWrapper::GetErrorUrlL()
       
   520     {
       
   521     if( iErrorUrl )
       
   522         {
       
   523         return iErrorUrl->AllocL();
       
   524         }
       
   525     return NULL;
       
   526     }
       
   527 
       
   528 
       
   529 // ---------------------------------------------------------------------------
       
   530 // From class MHttpDownloadMgrObserver
       
   531 //
       
   532 // CDrmUtilityDmgrWrapper::HandleDMgrEventL
       
   533 // ---------------------------------------------------------------------------
       
   534 //
       
   535 void CDrmUtilityDmgrWrapper::HandleDMgrEventL(
       
   536     RHttpDownload& aDownload,
       
   537     THttpDownloadEvent aEvent )
       
   538     {
       
   539     _LIT8( KDrmUtilityMimeTypeROAPTrigger,
       
   540         "application/vnd.oma.drm.roap-trigger+xml" );
       
   541 
       
   542     CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL" );
       
   543     CLOG_WRITE_FORMAT( "iDownLoadState = %d", aEvent.iDownloadState );
       
   544     CLOG_WRITE_FORMAT( "iProgressState = %d", aEvent.iProgressState );
       
   545 
       
   546     if ( aEvent.iProgressState == EHttpContentTypeReceived )
       
   547         {
       
   548         // check received mimetype
       
   549         RBuf8 contentType;
       
   550         contentType.CleanupClosePushL();
       
   551         contentType.CreateL( KMaxContentTypeLength );
       
   552         User::LeaveIfError(
       
   553             aDownload.GetStringAttribute( EDlAttrContentType, contentType ) );
       
   554         if ( !contentType.FindF( KDrmUtilityMimeTypeROAPTrigger ) )
       
   555             {
       
   556             // ROAP trigger found, continue download
       
   557             User::LeaveIfError( aDownload.Start() );
       
   558             }
       
   559         else
       
   560             {
       
   561             // wrong MIME type, so stop download
       
   562             iDownloadSuccess = EFalse;
       
   563             User::LeaveIfError( aDownload.Delete() );
       
   564             }
       
   565         CleanupStack::PopAndDestroy( &contentType );
       
   566         }
       
   567 
       
   568     if ( aEvent.iDownloadState == EHttpDlCreated )
       
   569         {
       
   570         CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL: EHttpDlCreated" );
       
   571         if ( iUseCoeEnv )
       
   572             {
       
   573         iProgressInfo->IncrementAndDraw( KProgressInfoIncrementMedium );
       
   574             }
       
   575         }
       
   576     else if ( aEvent.iProgressState == EHttpProgDisconnected )
       
   577         {
       
   578         CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL: EHttpProgDisconnected" );
       
   579         // store failure
       
   580         iDownloadSuccess = EFalse;
       
   581         iConnectionError = ETrue;
       
   582         // finished
       
   583         iWait.AsyncStop();
       
   584         }
       
   585     else if ( aEvent.iDownloadState == EHttpDlInprogress )
       
   586         {
       
   587         CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL: EHttpDlInprogress" );
       
   588         if ( iUseCoeEnv )
       
   589             {
       
   590         iProgressInfo->IncrementAndDraw( KProgressInfoIncrementSmall );
       
   591             }
       
   592         }
       
   593     else if ( aEvent.iDownloadState == EHttpDlCompleted )
       
   594         {
       
   595         // store success
       
   596         CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL: EHttpDlCompleted" );
       
   597         iDownloadSuccess = ETrue;
       
   598         if ( iUseCoeEnv )
       
   599             {
       
   600         iProgressInfo->IncrementAndDraw( KProgressInfoIncrementLarge );
       
   601             }
       
   602         // finished
       
   603         iWait.AsyncStop();
       
   604         }
       
   605     else if ( aEvent.iDownloadState == EHttpDlFailed )
       
   606         {
       
   607         TInt32 err( KErrNone );
       
   608 
       
   609         CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL: EHttpDlFailed" );
       
   610         // store failure
       
   611         iDownloadSuccess = EFalse;
       
   612         User::LeaveIfError( aDownload.GetIntAttribute( EDlAttrErrorId, err ) );
       
   613         CLOG_WRITE_FORMAT( "EDlAttrErrorId = %d", err );
       
   614 
       
   615         if ( err == EConnectionFailed ||
       
   616              err == ETransactionFailed)
       
   617             {
       
   618             CLOG_WRITE( "DMgrWrapper::HandleDMgrEventL: EConnectionFailed" );
       
   619             iConnectionError = ETrue;
       
   620             }
       
   621 
       
   622         // finished
       
   623         iWait.AsyncStop();
       
   624         }
       
   625     }
       
   626 
       
   627 
       
   628 // ---------------------------------------------------------------------------
       
   629 // CDrmUtilityDmgrWrapper::ShowProgressNoteL
       
   630 // ---------------------------------------------------------------------------
       
   631 //
       
   632 void CDrmUtilityDmgrWrapper::ShowProgressNoteL()
       
   633     {
       
   634     TFileName resFileName;
       
   635 
       
   636     CLOG_WRITE( "DMgrWrapper::ShowProgressNoteL" );
       
   637     if ( iUseCoeEnv )
       
   638         {
       
   639         // Initialize the progress note dialog, it's values,
       
   640         // and execute it
       
   641 #ifndef RD_MULTIPLE_DRIVE
       
   642 
       
   643         resFileName.Copy( KDriveZ );
       
   644 
       
   645 #else //RD_MULTIPLE_DRIVE
       
   646 
       
   647         TInt driveNumber( -1 );
       
   648         TChar driveLetter;
       
   649         DriveInfo::GetDefaultDrive( DriveInfo::EDefaultRom, driveNumber );
       
   650 
       
   651         iCoeEnv->FsSession().DriveToChar( driveNumber, driveLetter );
       
   652 
       
   653         resFileName.Format( KRomDriveFormatter, (TUint)driveLetter );
       
   654 
       
   655 #endif
       
   656 
       
   657         resFileName.Append( KDC_RESOURCE_FILES_DIR );
       
   658         resFileName.Append( KCDrmUtilityDmgrWrapperResFileName );
       
   659         RConeResourceLoader loader( *iCoeEnv );
       
   660         loader.OpenL( resFileName );
       
   661 
       
   662         iProgressNoteDialog = new (ELeave) CAknProgressDialog(
       
   663             reinterpret_cast< CEikDialog** >( &iProgressNoteDialog ) );
       
   664         iProgressNoteDialog->PrepareLC( R_SILENT_PROGRESS_NOTE );
       
   665         iProgressNoteDialog->SetCallback( this );
       
   666         iProgressInfo = iProgressNoteDialog->GetProgressInfoL();
       
   667         iProgressInfo->SetFinalValue( KProgressInfoFinalValue );
       
   668         iDialogDismissed = EFalse;
       
   669         iProgressNoteDialog->RunLD();
       
   670 
       
   671         loader.Close();
       
   672         }
       
   673 
       
   674     }
       
   675 
       
   676 
       
   677 // ---------------------------------------------------------------------------
       
   678 // CDrmUtilityDmgrWrapper::RemoveProgressNoteL
       
   679 // ---------------------------------------------------------------------------
       
   680 //
       
   681 void CDrmUtilityDmgrWrapper::RemoveProgressNoteL()
       
   682     {
       
   683 
       
   684     if ( iUseCoeEnv )
       
   685         {
       
   686         if (iProgressNoteDialog && !iDialogDismissed)
       
   687             {
       
   688             // deletes the dialog
       
   689             TRAPD(err, iProgressNoteDialog->ProcessFinishedL());
       
   690             if (err != KErrNone)
       
   691                 {
       
   692                 delete iProgressNoteDialog;
       
   693                 }
       
   694             iProgressNoteDialog = NULL;
       
   695             }
       
   696         }
       
   697 
       
   698     }
       
   699 
       
   700 
       
   701 // ---------------------------------------------------------------------------
       
   702 // From class MAknProgressDialogCallback
       
   703 //
       
   704 // CDrmUtilityDmgrWrapper::DialogDismissedL
       
   705 // ---------------------------------------------------------------------------
       
   706 //
       
   707 void CDrmUtilityDmgrWrapper::DialogDismissedL( TInt /*aButtonId*/ )
       
   708     {
       
   709     iDialogDismissed = ETrue;
       
   710 
       
   711     // Already freed, just set to NULL
       
   712     iProgressNoteDialog = NULL;
       
   713     iProgressInfo = NULL;
       
   714 
       
   715     if( iWait.IsStarted() )
       
   716         {
       
   717         iWait.AsyncStop();
       
   718         }
       
   719 
       
   720     }
       
   721 
       
   722 
       
   723 // ======== GLOBAL FUNCTIONS ========
       
   724 
       
   725 //------------------------------------------------------------------------------
       
   726 // GateFunctionDRM
       
   727 // DRM gate function
       
   728 //------------------------------------------------------------------------------
       
   729 EXPORT_C TAny* GateFunctionDMgr()
       
   730     {
       
   731     CDrmUtilityDmgrWrapper* launcher = NULL;
       
   732     TRAPD( err, launcher = CDrmUtilityDmgrWrapper::NewL() );
       
   733     if( err != KErrNone )
       
   734         {
       
   735         return NULL;
       
   736         }
       
   737 
       
   738     return launcher;
       
   739     }
       
   740