internetradio2.0/irdataprovider/src/irdataprovider.cpp
changeset 14 896e9dbc5f19
equal deleted inserted replaced
12:608f67c22514 14:896e9dbc5f19
       
     1 /*
       
     2 * Copyright (c) 2006-2007 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:
       
    15 *
       
    16 */
       
    17 #ifdef REQUEST_ZIP_RESPONSE
       
    18 #include <ezgzip.h>
       
    19 #include <bautils.h>
       
    20 #include <f32file.h>
       
    21 #endif
       
    22 
       
    23 #include "irdataprovider.h"
       
    24 #include "irdataproviderobserver.h"
       
    25 #include "irdebug.h"
       
    26 #include "irhttpdataprovider.h"
       
    27 #include "irhttprequestdata.h"
       
    28 #include "irsettings.h"
       
    29 
       
    30 #ifdef REQUEST_ZIP_RESPONSE
       
    31 _LIT( KGzXmlFile, "iSdsResponse.xml.gz" );
       
    32 #endif
       
    33 _LIT( KXmlFile, "iSdsResponse.xml" );
       
    34 
       
    35 // ---------------------------------------------------------------------------
       
    36 //  CIRDataProvider::NewL()
       
    37 //  Creates instance of CIRDataProvider.
       
    38 // ---------------------------------------------------------------------------
       
    39 //
       
    40 EXPORT_C CIRDataProvider *CIRDataProvider::NewL(
       
    41                                           MIRDataProviderObserver &aObserver )
       
    42     {
       
    43     IRLOG_DEBUG( "CIRDataProvider::NewL - Entering" );
       
    44     CIRDataProvider *self = NewLC( aObserver );
       
    45     CleanupStack::Pop(self);
       
    46     IRLOG_DEBUG( "CIRDataProvider::NewL - Exiting" );
       
    47     return self;
       
    48     }
       
    49 
       
    50 // ---------------------------------------------------------------------------
       
    51 //  CIRDataProvider::NewL()
       
    52 //  Creates instance of CIRDataProvider.
       
    53 // ---------------------------------------------------------------------------
       
    54 //
       
    55 EXPORT_C CIRDataProvider *CIRDataProvider::NewL(
       
    56                   MIRDataProviderObserver &aObserver, const TDesC &aFileName )
       
    57     {
       
    58     IRLOG_DEBUG( "CIRDataProvider::NewL(..., &aFileName) - Entering" );
       
    59     CIRDataProvider *self = NewLC( aObserver, aFileName );
       
    60     CleanupStack::Pop(self);
       
    61     IRLOG_DEBUG( "CIRDataProvider::NewL(..., &aFileName) - Exiting." );
       
    62     return self;
       
    63     }
       
    64 
       
    65 // ---------------------------------------------------------------------------
       
    66 //  CIRDataProvider::~CIRDataProvider()
       
    67 //  Destructs an instance of CIRDataProvider.
       
    68 // ---------------------------------------------------------------------------
       
    69 //
       
    70 CIRDataProvider::~CIRDataProvider()
       
    71     {
       
    72     IRLOG_DEBUG( "CIRDataProvider::~CIRDataProvider() - Entering" );
       
    73 
       
    74     if ( iHttpDataProvider )
       
    75         {
       
    76         iHttpDataProvider->CancelTransaction();
       
    77         delete iHttpDataProvider;
       
    78         }
       
    79 
       
    80     if ( iIRSettings )
       
    81         {
       
    82         iIRSettings->Close();
       
    83         }
       
    84 
       
    85     if ( iDataProviderTimer )
       
    86         {
       
    87         iDataProviderTimer->Cancel();
       
    88         delete iDataProviderTimer;
       
    89         }
       
    90 
       
    91     if ( iResponseHeaders )
       
    92         {
       
    93         delete iResponseHeaders;
       
    94         }
       
    95     
       
    96     iFile.Close();
       
    97     iFsSession.Close(); // Close the file server session
       
    98     IRLOG_DEBUG( "CIRDataProvider::~CIRDataProvider() - Exiting" );
       
    99     }
       
   100 
       
   101 // General functions exported ( These are the API`s exposed )( HTTP )
       
   102 
       
   103 // ---------------------------------------------------------------------------
       
   104 //  CIRDataProvider::IRHttpIssueRequest(TDesC8& aUri)
       
   105 //  Used to issue an Http request
       
   106 // ---------------------------------------------------------------------------
       
   107 //
       
   108 EXPORT_C void CIRDataProvider::IRHttpIssueRequestL(
       
   109      CIRHttpRequestData &aRequestObject )
       
   110     {
       
   111     IRHttpCancelRequest();
       
   112     IRLOG_DEBUG( "CIRDataProvider::IRHttpIssueRequestL - Entering" );
       
   113     IRRDEBUG2("CIRDATAPROVIDER::IRHTTPISSUEREQUESTL",KNullDesC);
       
   114     CIRHttpResponseData* newResponseHeaders = new ( ELeave ) CIRHttpResponseData;
       
   115     delete iResponseHeaders;
       
   116     iResponseHeaders = newResponseHeaders;
       
   117 
       
   118     // Create or replace the file used to store xml response from iSDS
       
   119 #ifdef REQUEST_ZIP_RESPONSE
       
   120     User::LeaveIfError( iFile.Replace( iFsSession, iXmlGzFilePath, EFileWrite ) );
       
   121 #else
       
   122     User::LeaveIfError( iFile.Replace( iFsSession, iXmlFilePath, EFileWrite ) );
       
   123 #endif
       
   124     
       
   125     iHttpDataProvider->CancelTransaction();
       
   126 
       
   127     TInt err = iHttpDataProvider->IssueHttpRequestL( aRequestObject );
       
   128     // Cancel the timer if active
       
   129     iDataProviderTimer->Cancel();
       
   130     // Start the timer for timeout
       
   131     iDataProviderTimer->After( iTimeOut );
       
   132     if ( err == KErrCouldNotConnect )
       
   133         {
       
   134         // If error in IssueHttpRequest then close the open file
       
   135         iFile.Close();
       
   136         iDataProviderTimer->Cancel();
       
   137         iDataProviderObserver.IRHttpGeneralError( err );
       
   138         // Cancel any possibly pending transactions
       
   139         iHttpDataProvider->CancelTransaction();
       
   140         }
       
   141 
       
   142     IRLOG_DEBUG( "CIRDataProvider::IRHttpIssueRequestL - Exiting." );
       
   143     }
       
   144 
       
   145 // ---------------------------------------------------------------------------
       
   146 //  CIRDataProvider::IRHttpCancelRequest()
       
   147 //  Used to cancel a request
       
   148 // ---------------------------------------------------------------------------
       
   149 //
       
   150 EXPORT_C void CIRDataProvider::IRHttpCancelRequest()
       
   151     {
       
   152     IRLOG_DEBUG( "CIRDataProvider::IRHttpCancelRequest - Entering" );
       
   153     // Cancel the timer if active
       
   154     iDataProviderTimer->Cancel();
       
   155     // Cancel any possibly pending transactions
       
   156     iHttpDataProvider->CancelTransaction();
       
   157     // Close the file handle used to store the xml response
       
   158     iFile.Close();
       
   159     IRLOG_DEBUG( "CIRDataProvider::IRHttpCancelRequest - Exiting." );
       
   160     }
       
   161 
       
   162 // ---------------------------------------------------------------------------
       
   163 //  CIRDataProvider::ReleaseResources()
       
   164 //  Used to release the resources held by the IRHttpDataProvider
       
   165 // ---------------------------------------------------------------------------
       
   166 //
       
   167 EXPORT_C void CIRDataProvider::ReleaseResources()
       
   168     {
       
   169     IRLOG_DEBUG( "CIRDataProvider::ReleaseResources - Entering" );
       
   170     // Release the resources held by the IRHttpDataProvider
       
   171     iHttpDataProvider->ReleaseResources();
       
   172     IRLOG_DEBUG( "CIRDataProvider::ReleaseResources - Exiting" );
       
   173     }
       
   174 
       
   175 
       
   176 //These are the callback functions used by CIRHttpDataProvider to
       
   177 //provide the CIRDataProvider with the data after processing the
       
   178 //HTTP request.
       
   179 
       
   180 // ---------------------------------------------------------------------------
       
   181 //  CIRDataProvider::HttpEventComplete()
       
   182 //  Used to Indicate to the observer that the request event has completed
       
   183 // ---------------------------------------------------------------------------
       
   184 //
       
   185 void CIRDataProvider::HttpEventComplete()
       
   186     {
       
   187     IRLOG_DEBUG( "CIRDataProvider::HttpEventComplete - Entering" );
       
   188     iFile.Close();
       
   189     iDataProviderTimer->Cancel();
       
   190     
       
   191 #ifdef REQUEST_ZIP_RESPONSE
       
   192     // unzip the gz file
       
   193     TRAP_IGNORE( UnzipFileL( iXmlFilePath ) );
       
   194     // delete the original gz file
       
   195     BaflUtils::DeleteFile( iFsSession, iXmlGzFilePath );
       
   196 #endif
       
   197     
       
   198     // Need to take a member to a local variable, as the IRHttpDataReceived 
       
   199     // may initiate an IRHttpIssueRequestL() call, causing the headers 
       
   200     // to be replaced with empty ones, and causing crashes.
       
   201     CIRHttpResponseData* currentHeaders = iResponseHeaders;
       
   202     // prevents the destructor to delete in case something streange happens.
       
   203     iResponseHeaders = NULL;
       
   204     iDataProviderObserver.IRHttpDataReceived( iXmlFilePath, *currentHeaders );
       
   205 
       
   206     delete currentHeaders;
       
   207     IRLOG_DEBUG( "CIRDataProvider::HttpEventComplete - Exiting." );
       
   208     }
       
   209 
       
   210 // ---------------------------------------------------------------------------
       
   211 //  CIRDataProvider::ExtractHeaderValue()
       
   212 //  
       
   213 // ---------------------------------------------------------------------------
       
   214 //
       
   215 void CIRDataProvider::ExtractHeaderValue( const TDesC8& aHeaderData,
       
   216                                           const TDesC8& aHeaderName, 
       
   217                                           const TDesC8& aDelimeter,
       
   218                                           TDes8& aHolder ) const
       
   219     {
       
   220     IRLOG_DEBUG( "CIRDataProvider::ExtractHeaderValue - Entering" );
       
   221     TInt position = aHeaderData.Find( aHeaderName );
       
   222     if ( position >= 0 )
       
   223         {
       
   224         TPtrC8 headerValue = aHeaderData.Mid( position );
       
   225         TInt delimeterPosition = headerValue.Find( aDelimeter );
       
   226         if ( delimeterPosition != KErrNotFound )
       
   227             {
       
   228             delimeterPosition++;
       
   229             TPtrC8 value = headerValue.Mid( delimeterPosition );
       
   230             aHolder.Copy( value );
       
   231             aHolder.TrimAll();
       
   232             }
       
   233         }
       
   234     IRLOG_DEBUG( "CIRDataProvider::ExtractHeaderValue - Exiting." );
       
   235     }
       
   236 
       
   237 // ---------------------------------------------------------------------------
       
   238 //  CIRDataProvider::HttpHeaderReceived()
       
   239 //  Used by CIRHttpDataProvider to indicate that an HTTP header is received.
       
   240 // ---------------------------------------------------------------------------
       
   241 //
       
   242 void CIRDataProvider::HttpHeaderReceived( const TDesC8& aHeaderData )
       
   243     {
       
   244     IRLOG_DEBUG( "CIRDataProvider::HttpHeaderReceived - Entering." );
       
   245     _LIT8(KDelim,":");
       
   246     _LIT8(KContentType,"Content-Type");
       
   247     ExtractHeaderValue( aHeaderData, KContentType, KDelim,
       
   248                         iResponseHeaders-> iContentType );
       
   249     _LIT8(KMaxAge,"max-age");
       
   250     _LIT8(KDelimEqual,"=");
       
   251     ExtractHeaderValue( aHeaderData, KMaxAge, KDelimEqual,
       
   252                         iResponseHeaders-> iMaxAge );
       
   253     _LIT8(KContentLength,"Content-Length");
       
   254     ExtractHeaderValue( aHeaderData, KContentLength, KDelim,
       
   255                         iResponseHeaders-> iContentLength );
       
   256     _LIT8(KExpires,"Expires");
       
   257     ExtractHeaderValue( aHeaderData, KExpires, KDelim,
       
   258                         iResponseHeaders->iExpires );
       
   259     IRLOG_DEBUG( "CIRDataProvider::HttpHeaderReceived - Exiting." );
       
   260     }
       
   261 
       
   262 // ---------------------------------------------------------------------------
       
   263 //  CIRDataProvider::HttpDateHeaderReceived()
       
   264 //  Used by CIRHttpDataProvider to indicate that an HTTP header is received.
       
   265 // ---------------------------------------------------------------------------
       
   266 //
       
   267 void CIRDataProvider::HttpDateHeaderReceived( const TDesC8 &aHeader,
       
   268                                               const TTime& aTime )
       
   269     {
       
   270     IRLOG_DEBUG( "CIRDataProvider::HttpDateHeaderReceived - Entering." );
       
   271     _LIT8(KDate,"Date");
       
   272     _LIT8(KLastModified,"Last-Modified");
       
   273     TInt position = aHeader.Find( KDate );
       
   274     if ( position != KErrNotFound )
       
   275         {
       
   276         iResponseHeaders->iDate = aTime;
       
   277         //find the difference between device time and response time
       
   278         //and storing the offset
       
   279         SetOffsetSeconds( aTime );
       
   280         return;
       
   281         }
       
   282     position = aHeader.Find( KLastModified );
       
   283     if ( position != KErrNotFound )
       
   284         {
       
   285         iResponseHeaders->iLastModified = aTime;
       
   286         }
       
   287     IRLOG_DEBUG( "CIRDataProvider::HttpDateHeaderReceived - Exiting." );
       
   288     }
       
   289 
       
   290 // ---------------------------------------------------------------------------
       
   291 //  CIRDataProvider::HttpBodyReceived()
       
   292 //  Used by CIRHttpDataProvider to indicate that an HTTP response body
       
   293 //  is received.
       
   294 // ---------------------------------------------------------------------------
       
   295 //
       
   296 void CIRDataProvider::HttpBodyReceived( const TDesC8 &aBodyData )
       
   297     {
       
   298     IRLOG_DEBUG( "CIRDataProvider::HttpBodyReceived - Entering" );
       
   299     TInt FileWritePos = 0;
       
   300     iFile.Seek( ESeekEnd, FileWritePos );
       
   301     iFile.Write( FileWritePos, aBodyData );
       
   302     IRLOG_DEBUG( "CIRDataProvider::HttpBodyReceived - Exiting." );
       
   303     }
       
   304 
       
   305 // ---------------------------------------------------------------------------
       
   306 //  CIRDataProvider::HttpTransactionError()
       
   307 //  Used by CIRHttpDataProvider to indicate that a HTTP Transaction error
       
   308 //  has occured.
       
   309 // ---------------------------------------------------------------------------
       
   310 //
       
   311 void CIRDataProvider::HttpTransactionError( TInt aErrCode )
       
   312     {
       
   313     IRLOG_DEBUG( "CIRDataProvider::HttpTransactionError - Entering" );
       
   314     iFile.Close();
       
   315     iDataProviderTimer->Cancel();
       
   316     iDataProviderObserver.IRHttpGeneralError( aErrCode );
       
   317     // Cancel any possibly pending transactions
       
   318     iHttpDataProvider->CancelTransaction();
       
   319     IRLOG_DEBUG( "CIRDataProvider::HttpTransactionError - Exiting." );
       
   320     }
       
   321 
       
   322 // ---------------------------------------------------------------------------
       
   323 //  CIRDataProvider::HttpResponseCodeRecieved()
       
   324 //  Used by CIRHttpDataProvider to indicate to the iSDS Client that a
       
   325 //  304 Not Changed response received
       
   326 //  Note: Implemented in version 0.2
       
   327 // ---------------------------------------------------------------------------
       
   328 //
       
   329 void CIRDataProvider::HttpResponseCodeRecieved( TInt aResponseCode )
       
   330     {
       
   331     IRLOG_DEBUG( "CIRDataProvider::HttpResponseCodeRecieved - Entering" );
       
   332     iDataProviderObserver.IRHttpResponseCodeReceived( aResponseCode, *iResponseHeaders );
       
   333     IRLOG_DEBUG( "CIRDataProvider::HttpResponseCodeRecieved- Exiting" );
       
   334     }
       
   335 
       
   336 // constructor support
       
   337 // don't export these, because used only by functions in this DLL
       
   338 // ---------------------------------------------------------------------------
       
   339 //  CIRDataProvider::TimerExpired()
       
   340 //  Called to indicate expiry of timer
       
   341 // ---------------------------------------------------------------------------
       
   342 //
       
   343 void CIRDataProvider::TimerExpired()
       
   344     {
       
   345     IRLOG_INFO( "CIRDataProvider::TimerExpired - Entering" );
       
   346     IRHttpCancelRequest();
       
   347     HttpTransactionError( KDataProviderTimeout );
       
   348     IRLOG_INFO( "CIRDataProvider::TimerExpired - Exiting" );
       
   349     }
       
   350 
       
   351 // ---------------------------------------------------------------------------
       
   352 //  CIRDataProvider::CIRDataProvider()
       
   353 //  Default Constructor
       
   354 // ---------------------------------------------------------------------------
       
   355 //
       
   356 CIRDataProvider::CIRDataProvider( MIRDataProviderObserver &aObserver ):
       
   357     iDataProviderObserver( aObserver ) // first-phase C++ constructor
       
   358     {
       
   359     IRLOG_INFO( "CIRDataProvider::CIRDataProvider" );
       
   360     // Definition not required
       
   361     }
       
   362 
       
   363 // ---------------------------------------------------------------------------
       
   364 //  void CIRDataProvider::ConstructL()
       
   365 //  2nd Phase construction
       
   366 // ---------------------------------------------------------------------------
       
   367 //
       
   368 void CIRDataProvider::ConstructL()
       
   369     {
       
   370     IRLOG_DEBUG( "CIRDataProvider::ConstructL - Entering" );
       
   371 #ifdef REQUEST_ZIP_RESPONSE
       
   372     ConstructL( KGzXmlFile );
       
   373 #else
       
   374     ConstructL(KXmlFile);
       
   375 #endif
       
   376     
       
   377     iHttpDataProvider->iSetNonUAProfUserAgent = EFalse;
       
   378     IRLOG_DEBUG( "CIRDataProvider::ConstructL - Exiting" );
       
   379     }
       
   380 
       
   381 // ---------------------------------------------------------------------------
       
   382 //  void CIRDataProvider::ConstructL(TDesC& aFilePath)
       
   383 //  2nd Phase construction
       
   384 // ---------------------------------------------------------------------------
       
   385 //
       
   386 void CIRDataProvider::ConstructL( const TDesC &aFileName )
       
   387     {
       
   388     IRLOG_DEBUG( "CIRDataProvider::ConstructL(const TDesC &aFileName) - Entering" );
       
   389     iHttpDataProvider = CIRHttpDataProvider::NewL( *this );
       
   390     iDataProviderTimer = CIRDataProviderTimer::NewL( EPriorityHigh,  *this );
       
   391     User::LeaveIfError( iFsSession.Connect() );
       
   392     iIRSettings = CIRSettings::OpenL();
       
   393 #ifdef REQUEST_ZIP_RESPONSE
       
   394     iXmlGzFilePath = iIRSettings->PrivatePath();
       
   395     iXmlFilePath = iXmlGzFilePath;
       
   396     iXmlGzFilePath.Append( aFileName );
       
   397     iXmlFilePath.Append( KXmlFile );
       
   398 #else
       
   399     iXmlFilePath = iIRSettings->PrivatePath();
       
   400     iXmlFilePath.Append( aFileName );
       
   401 #endif
       
   402     
       
   403     iTimeOut = iIRSettings->GetTimeOut();
       
   404     iHttpDataProvider->iSetNonUAProfUserAgent = ETrue;
       
   405     IRLOG_DEBUG( "CIRDataProvider::ConstructL(const TDesC &aFileName) - Exiting." );
       
   406     }
       
   407 
       
   408 // ---------------------------------------------------------------------------
       
   409 //  CIRDataProvider::NewLC(MIRDataProviderObserver& aObserver)
       
   410 //  Creates instance of CIRDataProvider.
       
   411 // ---------------------------------------------------------------------------
       
   412 //
       
   413 CIRDataProvider *CIRDataProvider::NewLC( MIRDataProviderObserver &aObserver )
       
   414     {
       
   415     IRLOG_DEBUG( "CIRDataProvider::NewLC - Entering." );
       
   416     CIRDataProvider *self = new( ELeave )CIRDataProvider( aObserver );
       
   417     CleanupStack::PushL( self );
       
   418     self->ConstructL();
       
   419     IRLOG_DEBUG( "CIRDataProvider::NewLC - Exiting." );
       
   420     return self;
       
   421     }
       
   422 
       
   423 // ---------------------------------------------------------------------------
       
   424 //  CIRDataProvider::NewLC(MIRDataProviderObserver& aObserver)
       
   425 //  Creates instance of CIRDataProvider.
       
   426 // ---------------------------------------------------------------------------
       
   427 //
       
   428 CIRDataProvider *CIRDataProvider::NewLC( MIRDataProviderObserver &aObserver,
       
   429     const TDesC &aFileName )
       
   430     {
       
   431     IRLOG_DEBUG( "CIRDataProvider::NewLC - Entering." );
       
   432     CIRDataProvider *self = new( ELeave )CIRDataProvider( aObserver );
       
   433     CleanupStack::PushL( self );
       
   434     self->ConstructL( aFileName );
       
   435     IRLOG_DEBUG( "CIRDataProvider::NewLC - Exiting." );
       
   436     return self;
       
   437     }
       
   438 
       
   439 EXPORT_C CIRHttpDataProvider* CIRDataProvider::GetHttpDataProvider()
       
   440 {
       
   441 IRLOG_DEBUG( "CIRDataProvider::GetHttpDataProvider" );
       
   442 	return iHttpDataProvider;
       
   443 }
       
   444 
       
   445 // ---------------------------------------------------------------------------
       
   446 //  CIRDataProvider::SetOffsetSeconds()
       
   447 //  Stores the offset between device time and response header in settings
       
   448 // ---------------------------------------------------------------------------
       
   449 //
       
   450 void CIRDataProvider::SetOffsetSeconds( const TTime& aTime )
       
   451     {
       
   452     IRLOG_DEBUG( "CIRDataProvider::SetOffsetSeconds - Entering" );
       
   453     TTime currenttime;
       
   454     //calculates the current time
       
   455     currenttime.UniversalTime();
       
   456     //finds offset from isds response
       
   457     TTimeIntervalSeconds offsetseconds;
       
   458     //Find offset from isds response
       
   459     TInt err = currenttime.SecondsFrom( aTime, offsetseconds );
       
   460     if ( err )
       
   461         {
       
   462         //if error offsetseconds is set to zero
       
   463         offsetseconds = 0;
       
   464         }
       
   465     //storing the offset value in setting
       
   466     TRAP_IGNORE( iIRSettings->SetTimeCorrectionL(offsetseconds.Int()) )
       
   467     IRLOG_DEBUG( "CIRDataProvider::SetOffsetSeconds - Exiting." );
       
   468     }
       
   469 
       
   470 #ifdef REQUEST_ZIP_RESPONSE
       
   471 // ---------------------------------------------------------------------------
       
   472 //  CIRDataProvider::UnzipFileL
       
   473 // ---------------------------------------------------------------------------
       
   474 //
       
   475 void CIRDataProvider::UnzipFileL( const TDesC& aOutputFile )
       
   476     {
       
   477     IRLOG_DEBUG( "CIRDataProvider::UnzipFileL - Enter." );
       
   478     RFile outputFile;
       
   479     CleanupClosePushL( outputFile );
       
   480     User::LeaveIfError( outputFile.Replace( iFsSession, aOutputFile, 
       
   481                         EFileStream | EFileWrite | EFileShareExclusive ) );
       
   482     CEZGZipToFile* gZip = 
       
   483         CEZGZipToFile::NewLC( iFsSession, iXmlGzFilePath, outputFile );
       
   484 
       
   485     while ( gZip->InflateL() )
       
   486         {
       
   487         // unzip the gz file, quit when finish
       
   488         }
       
   489     CleanupStack::PopAndDestroy( gZip );
       
   490     CleanupStack::PopAndDestroy( &outputFile );
       
   491     IRLOG_DEBUG( "CIRDataProvider::UnzipFileL - Exit." );
       
   492     }
       
   493 #endif
       
   494 
       
   495 // End of file