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