--- a/svgtviewer/SvgtViewerPlugin/AppObserverUtilSrc/SVGTAppObserverUtil.cpp Tue May 25 12:28:38 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2441 +0,0 @@
-/*
-* Copyright (c) 2004,2005 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: This class provides helper functions and a reference
-* implementation for hyperlink handling, image fetching
-* and saving of the svg content.
-*
-*/
-
-
-#include <browserlauncher.h>
-#include <DocumentHandler.h>
-#include <uri16.h>
-#include <uriutils.h>
-#include <eikenv.h>
-#include <eikappui.h>
-#include <eikapp.h>
-#include <eikdef.h>
-#include <flogger.h>
-#include <cdownloadmgruiuserinteractions.h>
-#include <cdownloadmgruidownloadslist.h>
-#include <cdownloadmgruilibregistry.h>
-#include <browseroverriddensettings.h>
-
-#ifdef __SERIES60_NATIVE_BROWSER
-#include <browseruisdkcrkeys.h> // Include only if s60 native
- // browser available
-#endif
-
-#include <centralrepository.h>
-#include <apgtask.h> // TApaTaskList
-#include <apmstd.h> // RApaLsSession
-#include <commdb.h>
-#include <ApDataHandler.h> // CApDataHandler
-#include <ApAccessPointItem.h> // CApAccessPointItem
-#include <ApUtils.h> // CApUtils
-#include <ApSelect.h> // CApSelect
-#include <aknnotewrappers.h>
-#include <AknGlobalNote.h>
-#include <AknWaitDialog.h>
-#include <AknCommonDialogs.h>
-#include <AknProgressDialog.h>
-#include <StringLoader.h>
-#include <data_caging_path_literals.hrh>
-#include <bautils.h>
-#include <eikprogi.h>
-#include <e32svr.h>
-#include <svgtappobserverutil.rsg>
-#include <SVGTAppObserverUtil.h>
-#include <pathinfo.h>
-#include <sysutil.h>
-#include <imcvcodc.h> //TImCodecB64
-#include <AiwGenericParam.h>
-
-#include "SVGTViewerAppDbgFlags.hrh"
-#include "SVGTViewerAppDownloads.h"
-#include "SVGTAppObserver.h" // temp
-#include "SVGTUIDialog.h" // AppDialog
-#include "SVGTUIDialog.hrh"
-
-#ifdef RD_MULTIPLE_DRIVE
-#include <AknCommonDialogsDynMem.h>
-#endif
-// CONSTANTS
-
-_LIT( KBrowserParameter, "4" ); // magic number for browser to open the URL
-_LIT( KSpace, " " );
-
-_LIT(KJpg, ".jpg" );
-_LIT(KJpeg, ".jpeg" );
-_LIT(KPng, ".png" );
-_LIT(KBmp, ".bmp" );
-_LIT(KSvg, ".svg" );
-_LIT(KSvgz, ".svgz" );
-
-#ifndef __SERIES60_NATIVE_BROWSER
- // Below constants need to be used if s60 native browser is not used.
- const TUid KCRUidBrowser = {0x10008D39};
- const TUint32 KBrowserDefaultAccessPoint = 0x0000000E;
-#endif // __S60_REMOVE_BROWSER
-
-// SMIL Fit Value
-_LIT( KSvgtDefSmilFitValue,"meet" );
-// Resource file for App Observer Util
-_LIT( KResourceFileName, "Z:SVGTAppObserverUtil.rsc" );
-
-_LIT( KEmptyString, "" );
-_LIT( KWww, "www" );
-_LIT( KHttp, "http://");
-_LIT( KDotDot, ".." );
-_LIT( KBSlashStr, "/" );
-_LIT( KSlashStr, "\\" );
-_LIT( KDotSlashStr, ".\\" );
-_LIT( KColonStr, ":" );
-_LIT( KNewLineStr, "\n" );
-
-#ifdef SVGTVIEWERAPP_DBG_FLAG
-_LIT( KFileLoggingDir, "SVGTViewer" );
-_LIT( KFileLog, "SaveLog.txt" );
-#endif
-
-// Maximum length of thread Id in Characters
-const TInt KSvgMaxThreadIdStr = 10;
-
-// ============================ MEMBER FUNCTIONS ===============================
-
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CSVGTAppObserverUtil* CSVGTAppObserverUtil::NewL(
- CSVGTUIDialog* aAppDialog,
- RFile* aFileHdlPtr,
- const TDesC& aFilename,
- TBool aIsFileFullPathAvailable,
- TBool aCanSaveContent,
- TBool aShouldMoveContent)
- {
- CSVGTAppObserverUtil* self =
- CSVGTAppObserverUtil::NewLC( aAppDialog,
- aFileHdlPtr,
- aFilename,
- aIsFileFullPathAvailable,
- aCanSaveContent,
- aShouldMoveContent );
- CleanupStack::Pop( self );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::NewLC
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CSVGTAppObserverUtil* CSVGTAppObserverUtil::NewLC( CSVGTUIDialog* aAppDialog,
- RFile* aFileHdlPtr,
- const TDesC& aFilename,
- TBool aIsFileFullPathAvailable,
- TBool aCanSaveContent,
- TBool aShouldMoveContent)
- {
- CSVGTAppObserverUtil* self =
- new( ELeave ) CSVGTAppObserverUtil( aAppDialog );
- CleanupStack::PushL( self );
- self->ConstructL( aFileHdlPtr, aFilename, aIsFileFullPathAvailable,
- aCanSaveContent, aShouldMoveContent );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CSVGTAppObserverUtil* CSVGTAppObserverUtil::NewL(
- CSVGTUIDialog* aAppDialog,
- RFile* aFileHdlPtr )
- {
- CSVGTAppObserverUtil* self =
- CSVGTAppObserverUtil::NewLC( aAppDialog,
- aFileHdlPtr );
- CleanupStack::Pop( self );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::NewLC
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CSVGTAppObserverUtil* CSVGTAppObserverUtil::NewLC(
- CSVGTUIDialog* aAppDialog,
- RFile* aFileHdlPtr )
- {
- CSVGTAppObserverUtil* self =
- new( ELeave ) CSVGTAppObserverUtil( aAppDialog );
- CleanupStack::PushL( self );
-
- self->ConstructL( aFileHdlPtr );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// Destructor
-// -----------------------------------------------------------------------------
-EXPORT_C CSVGTAppObserverUtil::~CSVGTAppObserverUtil()
- {
-
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
-
- CSVGTViewerAppDownloads* downloads;
-
- iDownloadIter.SetToFirst();
- while ((downloads = iDownloadIter++) != NULL)
- {
- downloads->QueLink().Deque();
- delete downloads;
- iDownloadIter.SetToFirst();
- }
-
- // Close the DMgr UI Library first, as it uses the same
- // Download Manager session that the Viewer uses
- delete iDMgrUiReg;
-
- // Close the Download Manager connection
- iDownloadMgr.Close();
-
- iDMgrDownloadsList = NULL;
- iDMgrUserInteractions = NULL;
-#endif
- // Reset the app dialog, it is already freed in OpenFileL
- iAppDialog = NULL;
-
- delete iFileManager;
- delete iSvgFileName;
- delete iSvgDstFileName;
- delete iDocHandler;
-
- delete iWaitNote;
- delete iTempFileName;
- if ( iResourceOffset != 0 )
- {
- iEikEnv->DeleteResourceFile( iResourceOffset );
- }
-
- // Reset the SVG File Handle as it is owned by the caller
- iSvgFileId = NULL;
- // Reset the Progress Info implementor pointer
- iProgressInfo = NULL;
- // Reset Environment pointer
- iEikEnv = NULL;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::FetchImage
-// Called by Svg engine when there is an image tag encountered in the svg file
-// parameters:
-// aUri: the uri that needs to be downloaded or fetched locally
-// aSession: File Session in which the file is opened.
-// aFileHandle: handle of the downloaded file or locally fetched file.
-// return value:
-// KErrNone if the file is fetched successfully
-// KErrNotFound if the file could not be fetched.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TInt CSVGTAppObserverUtil::FetchImage(
- const TDesC& aUri , RFs& aSession ,
- RFile& aFileHandle )
- {
- TInt ret = KErrNone;
-
- TDownloadNeeded downloadNeeded = ELocalImageFile;
- TRAPD( error, downloadNeeded = IsDownloadNeededL( aUri ) );
-
- if ( error != KErrNone )
- {
- return KErrNotFound;
- }
-
- if ( downloadNeeded == ELocalImageFile )
- {
- TFileName fileName;
- if ( GetLocalFile( aUri, fileName, *iSvgFileName ) )
- {
- return aFileHandle.Open( aSession, fileName, EFileShareAny );
- }
- else
- {
- return KErrNotFound;
- }
- }
- else if ( downloadNeeded == ERemoteImageFile )
- {
- TRAPD( err,ret = StartDownloadingImageL( aUri,
- aSession,
- aFileHandle,
- EFalse,
- EFalse /* Asynchronous mode */) );
- if ( err != KErrNone )
- {
- return KErrNotFound;
- }
- else
- {
- return ret;
- }
-
- }
- else
- {
- return KErrNotFound;
- }
-
- }
-
-TInt CSVGTAppObserverUtil::FetchFont( const TDesC& /* aUri */,
- RFs& /* aSession */, RFile& /* aFileHandle */ )
- {
- return KErrNotSupported;
- }
-
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::LinkActivated
-// Callback Function called by svg engine when a hyperlink is activated
-// ---------------------------------------------------------------------------
-//
-
-EXPORT_C TBool CSVGTAppObserverUtil::LinkActivated( const TDesC& aUri )
- {
- if( aUri.Length() == 0 )
- {
- return KErrNone;
- }
- TRAPD( error, LinkActivatedL( aUri ) );
- return ( error == KErrNone );
- }
-
-
-// --------------------------------------------------------------------
-// CSVGTAppObserverUtil::LinkActivatedWithShow
-// Callback Function called by the svg engine when a hyperlink with show
-// attribute is activated
-// --------------------------------------------------------------------
-//
-EXPORT_C TBool CSVGTAppObserverUtil::LinkActivatedWithShow(
- const TDesC& aUri ,
- const TDesC& aShow )
- {
- if( aUri.Length() == 0 )
- {
- return KErrNone;
- }
- TRAPD( error, LinkActivatedWithShowL( aUri, aShow ) );
- return ( error == KErrNone );
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::GetSmilFitValue
-// Default implementation for observer function to get SMIL fit value.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::GetSmilFitValue( TDes& aSmilValue )
- {
- aSmilValue.Copy( KSvgtDefSmilFitValue );
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::SetDownloadMenu
-// Sets/Unsets the iDownloadMenuEnabled
-// -----------------------------------------------------------------------------
-//
-
-EXPORT_C void CSVGTAppObserverUtil::SetDownloadMenu( TBool aAddDownloadMenu )
- {
- iDownloadMenuEnabled = aAddDownloadMenu;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::SetDownloadMenu
-// Sets/Unsets the iDownloadMenuEnabled
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TBool CSVGTAppObserverUtil::CanShowDownload() const
- {
- if(iDownloadInProgress || iDownloadDone)
- {
- const CDownloadArray& array = iDownloadMgr.CurrentDownloads();
- return ( array.Count() ? ETrue : EFalse );
- }
-
- return EFalse;
- }
-
-// --------------------------------------------------------------------
-// void CSVGTAppObserverUtil::DisplayDownloadMenuL()
-// Call back called by the UI dialog when the downloads menu is
-// selected. This function calls the DisplayDownloadsListL function
-// provided by the download manager ui lib.
-// --------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::DisplayDownloadMenuL()
- {
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
- if ( iDMgrDownloadsList )
- {
- TRAPD( error, iDMgrDownloadsList->DisplayDownloadsListL() );
- {
- if ( error != KErrNone )
- {
-#ifdef _DEBUG
- TBuf<64> buffer;
- _LIT(msg, "AP error : %d" );
- buffer.Format( msg, error );
- iEikEnv->InfoMsg( buffer );
-#endif
- }
- }
- }
-#endif
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::HandleDMgrEventL
-// Called by Download manager when the image is being downloaded.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::HandleDMgrEventL( RHttpDownload& aDownload,
- THttpDownloadEvent aEvent )
- {
-
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
-
-#ifdef _DEBUG
- TBuf<64> buffer;
- _LIT(msg, "download progressing : %d, %d" );
- buffer.Format( msg, aEvent.iDownloadState, aEvent.iProgressState );
- iEikEnv->InfoMsg( buffer );
-#endif
- {
-
- if ( EHttpDlInprogress == aEvent.iDownloadState )
- {
- iDownloadInProgress = ETrue;
- iDownloadDone = EFalse;
- }
-
- if ( EHttpDlCompleted == aEvent.iDownloadState )
- {
-
- iDownloadInProgress = EFalse;
- iDownloadDone = ETrue;
-
- // Get the download item from the list
- CSVGTViewerAppDownloads* downloadItem;
- downloadItem = FindDownload( &aDownload );
-
-#ifdef _DEBUG
-
-
- _LIT(downloadMsg, "download found" );
- iEikEnv->InfoMsg( downloadMsg );
-#endif
-
-
- if ( downloadItem )
- {
- // Get the file Name of the downloaded file
- TFileName fileName;
- aDownload.GetStringAttribute( EDlAttrDestFilename, fileName );
-#ifdef _DEBUG
-
- _LIT(fileNameMsg, "got file name " );
- iEikEnv->InfoMsg( fileNameMsg );
-#endif
-
-//##############################################
-// For AssignImageData
- DoAssignImageDataL(downloadItem, aDownload);
-//##############################################
- downloadItem->SetFileName( fileName );
-
- // Check whether the download happened in a synchronous way
- if ( downloadItem->SynchronousMode() )
- {
- downloadItem->SetDownloadCompleted( ETrue );
-
- // If wait note is being displayed, delete it
- if ( iWaitNote )
- {
- // Delete the download wait note
- TRAPD( err, iWaitNote->ProcessFinishedL() );
- if ( err != KErrNone )
- {
- delete iWaitNote;
- iWaitNote = NULL;
- }
- }
-
- // If synchronous stop the scheduler
- iWait.AsyncStop();
- }
- else
- {
- // Otherwise check the embedded mode and open the file
- // using DocHandler
- downloadItem->QueLink().Deque();
- delete downloadItem;
- }
- }
- }
- else
- {
- // added for if user cancels the download.
- if ( EHttpDlDeleting == aEvent.iDownloadState && !iDownloadDone)
- {
- aDownload.Pause();
- aEvent.iDownloadState = EHttpDlFailed;
- }
-
- if ( EHttpDlFailed == aEvent.iDownloadState )
- {
-#ifdef _DEBUG
-
- _LIT(failMsg, " downloading failed" );
- iEikEnv->InfoMsg( failMsg );
-#endif
-
- TInt32 error = 0;
- TInt32 globalError = 0;
- aDownload.GetIntAttribute( EDlAttrErrorId, error );
- aDownload.GetIntAttribute( EDlAttrGlobalErrorId, globalError );
-
-#ifdef _DEBUG
- TBuf<64> errorBuffer;
- _LIT(failedMsg, "downloading failed : %d, %d" );
- buffer.Format( failedMsg, error, globalError );
- iEikEnv->InfoMsg( errorBuffer );
-#endif
-
- // Get the download item from the list
- CSVGTViewerAppDownloads* downloadItem;
- downloadItem = FindDownload( &aDownload );
- // Check whether the download was started synchronously
- // if( !downloadItem->ImageLinkFlag())
- {
- HBufC* lUriBuf = HBufC::NewLC( KMaxUrlLength );
- TPtr lUriPtr(lUriBuf->Des());
- aDownload.GetStringAttribute( EDlAttrReqUrl, lUriPtr );
- iAppDialog->AssignImageData(lUriPtr , NULL );
- CleanupStack::PopAndDestroy( lUriBuf );
- }
-
- if ( downloadItem )
- {
- if ( downloadItem->SynchronousMode() )
- {
-
- downloadItem->SetDownloadCompleted( EFalse );
- if ( iWaitNote )
- {
- // Delete the download wait note
- TRAPD( err, iWaitNote->ProcessFinishedL() );
- if ( err != KErrNone )
- {
- delete iWaitNote;
- iWaitNote = NULL;
- }
- }
-
- // If synchronous, stop the scheduler started.
- iWait.AsyncStop();
- }
- else
- {
- // Otherwise delete the download item from the list
- downloadItem->QueLink().Deque();
- delete downloadItem;
- }
- }
- }
- }
- }
-#endif
- }
-
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::LinkActivatedL
-// Leave variant of LinkActivated
-// Launches the browser in embedded mode and passes the uri to the browser
-// if the uri is a web page, if the uri refers to a local image file, or a
-// remote image file, launches the file using doc handler.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::LinkActivatedL( const TDesC& aUri )
- {
-
- TDownloadNeeded dnloadNeeded = IsDownloadNeededL( aUri );
-
- if ( dnloadNeeded == ENotAnImageFile )
- {
-
- // (2 = length of the first parameter + space)
- HBufC* parameters = NULL;
- parameters = HBufC::NewLC( aUri.Length() + 2 );
-
- TPtr parametersPtr = parameters->Des();
- parametersPtr.Copy( KBrowserParameter );
- parametersPtr.Append( KSpace );
- parametersPtr.Append( aUri );
-
- // Create BrowserLauncher
- CBrowserLauncher* launcher = NULL;
-
- launcher = CBrowserLauncher::NewLC();
-
- TBrowserOverriddenSettings overriddenSettings;
- launcher->LaunchBrowserSyncEmbeddedL( *parameters, NULL, &overriddenSettings );
-
- //launcher, parameters
- CleanupStack::PopAndDestroy( 2, parameters );
- }
- else
- {
- if ( dnloadNeeded == ERemoteImageFile )
- {
- RFile fileHandle; // param not going to be used
- RFs fileSession; // param not going to be used
- StartDownloadingImageL( aUri,
- fileSession,
- fileHandle,
- EFalse, /* aSynchronous mode */
- ETrue,
- ETrue /* Embedded mode */ );
- }
- else if ( dnloadNeeded == ELocalImageFile )
- {
-
- TFileName fileName;
- TInt error = KErrNone;
-
- if ( GetLocalFile( aUri, fileName, *iSvgFileName ) )
- {
- TRAP( error, LaunchDownloadedFileL( fileName, ETrue, EFalse ) );
- }
- else
- {
- error = KErrNotFound;
- }
-
- if ( error != KErrNone )
- {
- TInt resourceId;
- resourceId = R_SVGT_FILE_NOT_FOUND;
- // Show information note
- HBufC* prompt = StringLoader::LoadLC( resourceId );
- CAknInformationNote* note =
- new ( ELeave ) CAknInformationNote( ETrue );
- note->ExecuteLD( *prompt );
-
- CleanupStack::PopAndDestroy( prompt );
- }
- }
- else
- {
- return;
- }
- }
- }
-
-
-// --------------------------------------------------------------------
-// CSVGTAppObserverUtil::LinkActivatedWithShowL
-// Called by LinkActivatedWithShow
-// Calls LinkActivatedL
-// --------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::LinkActivatedWithShowL(
- const TDesC& aUri ,
- const TDesC& /*aShow*/ )
- {
- LinkActivatedL( aUri );
- }
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::StartDownloadingImageL
-// Called by FetchImage, LinkActivated, LinkActivatedWithShow to download the
-// image. This function calls the download manager client Api's to start the
-// download. The download completion will be indicated by the call back
-// HandleDownloadMgrEventL. As FetchImage is a synchronous function
-// a CActiveSchedulerWait loop is started, after starting the http download.
-// the wait loop is stopped when the call back HandleDownloadMgrEventL is
-// called.
-// 1. CreateDownloadAndSetAttributes
-// 2. check result
-// If result no
-// check the status of the download
-// if Completed
-// return the filehandle
-// if in progress
-// continue downloading
-// if failed
-// return
-// else
-// Start Download
-// 3. If Synchronous
-// Start DownloadWaitNote
-// Start ActiveSchedulerWait.
-// 4. Return
-//
-// parameters:
-// aUri: the hyperlink that needs to be downloaded.
-// aSession: File session in which the file handle is opened.
-// aFileHandle: Handle of the downloaded file
-// aIsSynchronous: flag indicating whether download is synchronous or not
-// aLinkFlag: Image flag to distinguish the Embeded & hyperlink.
-// aIsEmbedded: flag indicating whether downloaded file has to opened in
-// stand alone mode or embedded mode.
-// ---------------------------------------------------------------------------
-//
-TInt CSVGTAppObserverUtil::StartDownloadingImageL(
- const TDesC& aUri,
- RFs& aSession,
- RFile& aFileHandle,
- TBool aIsSynchronous,
- TBool aLinkFlag,
- TBool aIsEmbedded )
- {
-
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
-
-
-#if defined(__WINS__) || defined(__WINSCW__)
- //do nothing, hard code later on
-#else
-
-
- TUint32 Iapid( 0 );
- if ( !GetDefaultInetAccessPointL( Iapid ) )
- {
- return KErrNotFound;
- }
-
-
- iDownloadMgr.SetIntAttribute( EDlMgrIap, (TInt32)Iapid );
-#endif // __wins__|| __winscw__
-
-
-#ifdef _DEBUG
- _LIT( setAP, "Access point set" );
- iEikEnv->InfoMsg( setAP );
-#endif
-
-
- TInt result = ETrue;
- // Add lDownload to cleanup stack and pop it after CreateDownloadL.
- CSVGTViewerAppDownloads *lDownload = CSVGTViewerAppDownloads::NewLC(
- aIsEmbedded, aIsSynchronous, aLinkFlag );
-
- HBufC8* url8 = NULL;
- url8 = HBufC8::NewLC( aUri.Length() );
- url8->Des().Copy( aUri );
-
- lDownload->SetDownloadHandle(
- &iDownloadMgr.CreateDownloadL( *url8 , result ) );
-
- CleanupStack::PopAndDestroy( url8 ); // url8
-
-#ifdef _DEBUG
- _LIT(dlCreated, "download created" );
- iEikEnv->InfoMsg( dlCreated );
-#endif
-
-
- // Add Downloads to the Menu Option
- if ( !iDownloadMenuEnabled && !aIsSynchronous )
- {
- SetDownloadMenu( ETrue );
- }
-
- if ( !result )
- {
-
- // url is already being downloaded or completed
- // Get the download State
- TInt32 downloadState = 0;
- TInt retval = KErrNone;
- lDownload->DownloadHandle()->GetIntAttribute( EDlAttrState,
- downloadState );
-
- if ( downloadState == EHttpDlCompleted )
- {
- TFileName fileName;
- lDownload->DownloadHandle()->GetStringAttribute( EDlAttrDestFilename
- , fileName );
- if ( aIsSynchronous )
- {
- retval = aFileHandle.Open( aSession, fileName, EFileShareAny );
- }
- else
- {
- if(aLinkFlag)
- {
- // Handle Launching downloaded file in asynchronous mode
- LaunchDownloadedFileL( fileName, aIsEmbedded , ETrue);
- }
- else
- {
- DoAssignImageDataL(lDownload, *(lDownload->DownloadHandle()));
- }
-
- }
-
- CleanupStack::PopAndDestroy( lDownload ); // lDownload
- return retval;
- }
- else
- {
- if ( downloadState == EHttpDlFailed )
- {
- // Retry
- // Add to the linked list
- iDownloads.AddFirst( *lDownload );
- CleanupStack::Pop( lDownload ); // lDownload
- lDownload->DownloadHandle()->SetBoolAttribute(
- EDlAttrNoContentTypeCheck, ETrue );
- // Start the download
- lDownload->DownloadHandle()->Start();
-
- return KErrNone;
- }
- else
- {
-
- if ( !FindDownload( lDownload->DownloadHandle() ) )
- {
- // Add to the linked list
- iDownloads.AddFirst( *lDownload );
- CleanupStack::Pop( lDownload ); // lDownload
- }
- else
- {
- CleanupStack::PopAndDestroy( lDownload ); // lDownload
- }
- }
- }
- }
- else
- {
- if ( aIsSynchronous )
- {
- TFileName fileName( KEmptyString );
- GetFileNameFromUri( aUri, fileName );
- LaunchWaitNoteL( R_SVGT_DOWNLOAD_WAIT_NOTE, ETrue, fileName );
- }
- if ( !aIsSynchronous )
- {
- lDownload->DownloadHandle()->SetIntAttribute( EDlAttrAction,
- lDownload->ImageLinkFlag() ? ELaunch : EDoNothing );
-// iIsFetchImageCall ? EDoNothing : ELaunch );
- }
- else
- {
- lDownload->DownloadHandle()->SetIntAttribute( EDlAttrAction,
- EDoNothing );
- lDownload->DownloadHandle()->SetBoolAttribute( EDlAttrSilent,
- ETrue );
- }
-
- lDownload->DownloadHandle()->SetBoolAttribute(
- EDlAttrNoContentTypeCheck, ETrue );
-
-
-#ifdef _DEBUG
- _LIT(dlCreateMsg, "result true dl created" );
- iEikEnv->InfoMsg( dlCreateMsg );
-#endif
-
- // Add to the linked list
- iDownloads.AddFirst( *lDownload );
-
- CleanupStack::Pop( lDownload ); // lDownload
-
- // Start the download
- lDownload->DownloadHandle()->Start();
- }
-
- if ( aIsSynchronous )
- {
- // Start the Scheduler Wait
- if ( !iWait.IsStarted() )
- {
- iWait.Start();
- }
-
-#ifdef _DEBUG
- _LIT(waitLoopMsg, "out of wait loop" );
- iEikEnv->InfoMsg( waitLoopMsg );
-#endif
- if ( iSynchronousDownloadStopped )
- {
- // Download dismissed
- // Cancel the download
- lDownload->DownloadHandle()->Delete();
- return KErrCancel;
- }
-
- CSVGTViewerAppDownloads* downloadItem = NULL;
- downloadItem = FindDownload( lDownload->DownloadHandle() );
-
- if ( downloadItem )
- {
- TInt retval = KErrNone;
- TBool downloadCompleted = downloadItem->DownloadCompleted();
-
- if ( downloadCompleted )
- {
- retval = aFileHandle.Open( aSession,
- downloadItem->FileName(),
- EFileShareAny );
- }
- else
- {
- retval = KErrNotFound;
- }
-
- downloadItem->QueLink().Deque();
- delete downloadItem;
- return retval;
- }
- else
- {
- return KErrNotFound;
- }
- }
- else
- {
- return KErrNone;
- }
-
-#else
- return KErrNotFound;
-#endif
-
- }
-
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::GetDefaultInetAccessPointL
-// if the return value is true, aIapId has the default Iap id.
-// ---------------------------------------------------------------------------
-EXPORT_C TBool CSVGTAppObserverUtil::GetDefaultInetAccessPointL
- ( TUint32& aIapId ) const
- {
-
- // Try to find the default AP.
- // The Browser may stores the default AP in the shared data.
- CRepository* repository = CRepository::NewL( KCRUidBrowser );
- CleanupStack::PushL( repository );
-
- TInt wapApId = 0;
- TRAPD( error, repository->Get( KBrowserDefaultAccessPoint, wapApId ) );
- if ( error != KErrNone )
- {
-#ifdef _DEBUG
- TBuf<64> buffer;
- _LIT(msg, "AP error : %d" );
- buffer.Format( msg, error );
- iEikEnv->InfoMsg( buffer );
- User::After(1000000);
-#endif
- return EFalse;
- }
- TUint32 wapApId32( wapApId );
- TUint32 iapId32( 0 );
-
- CleanupStack::PopAndDestroy( repository );
-
- CCommsDatabase* commsDb = CCommsDatabase::NewL( EDatabaseTypeIAP );
- CleanupStack::PushL( commsDb );
- CApDataHandler* apDataHandler = CApDataHandler::NewLC( *commsDb );
- CApAccessPointItem* apItem = CApAccessPointItem::NewLC();
- TRAPD( err, apDataHandler->AccessPointDataL( wapApId32, *apItem ) );
- CApUtils* apUtils = CApUtils::NewLC( *commsDb );
-
- TBool wapApFound( EFalse );
- TBool iapFound( EFalse );
-
- if ( err == KErrNone )
- {
- wapApFound = ETrue;
- }
- else
- {
- // The first valid access point has to be selected if exists
- CApSelect* apSelect = CApSelect::NewLC
- (
- *commsDb,
- KEApIspTypeAll,
- EApBearerTypeAll,
- KEApSortNameAscending
- );
- if ( apSelect->MoveToFirst() )
- {
- wapApFound = ETrue;
- wapApId32 = apSelect->Uid();
- }
- CleanupStack::PopAndDestroy( apSelect ); // apSelect
- }
-
- if ( wapApFound )
- {
- // Get the IAP ID from the WAP AP ID.
-#ifndef __SERIES60_WSP
- iapId32 = 0;
- TRAPD( errTransl, iapId32 = apUtils->IapIdFromWapIdL( wapApId32 ) );
-
- if ( errTransl == KErrNone )
- {
- iapFound = ETrue;
- }
-#else
- iapId32 = wapApId32;
- iapFound = ETrue;
-#endif // __SERIES60_WSP
- }
-
- CleanupStack::PopAndDestroy( 4 ); // apUtils, apItem,
- // apDataHandler, commsDb
-
- if ( iapFound )
- {
- aIapId = iapId32;
- }
- return iapFound;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::LaunchDownloadedFileL
-// Called by Download manager when the image is downloaded.
-// This function uses the document handler to launch the downloaded file.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::LaunchDownloadedFileL( const TDesC& aFileName,
- TBool /* aIsEmbedded */,
- TBool aAllowSave ) const
- {
-
- TDataType dataType = TDataType();
- RFile fileHandle;
- // Creates a sharable file handle
- iDocHandler->OpenTempFileL( aFileName, fileHandle );
- CleanupClosePushL( fileHandle );
- if ( aAllowSave )
- {
- CAiwGenericParamList& paramList = iDocHandler->InParamListL();
- // To show/hide save confirmation dlg
- TAiwVariant allowSaveVariant(aAllowSave);
- TAiwGenericParam genericParamAllowSave( EGenericParamAllowSave,
- allowSaveVariant );
- paramList.AppendL( genericParamAllowSave );
-
- iDocHandler->OpenFileEmbeddedL( fileHandle, dataType, paramList );
- }
- else
- {
- _LIT( KSvgFile, ".svg");
- _LIT( KSvgzFile, ".svgz");
- _LIT( KSvgbFile, ".svgb");
- if(aFileName.Right(4) == KSvgFile || aFileName.Right(5) == KSvgzFile || aFileName.Right(5) == KSvgbFile)
- {
- iDocHandler->OpenFileEmbeddedL( fileHandle, dataType );
- }
- else
- {
- iDocHandler->OpenFileL( fileHandle, dataType );
- }
- }
- CleanupStack::PopAndDestroy( &fileHandle ); // fileHandle
- }
-
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::IsDownloadNeededL
-// Called by link activated(WithShow), FetchImage
-// to check whether the uri needs a download
-// If the filename is present in the uri and if it is a html,
-// returns ENotAnImageFile
-// If the host is present & filename is not present,
-// returns ENotAnImageFile
-// If the host is present & filename is present,
-// returns ERemoteImageFile
-// If the uri doesnt need a download and if it is locally available,
-// returns ELocalImageFile
-// ---------------------------------------------------------------------------
-//
-EXPORT_C CSVGTAppObserverUtil::TDownloadNeeded
- CSVGTAppObserverUtil::IsDownloadNeededL(
- const TDesC& aUri )
- {
-
- TUriParser UriParser;
-
- TBuf<KMaxFileName> localUri;
- // url starts with www so append http://
- if ( !aUri.Left( 4 ).Compare( KWww ) )
- {
- localUri.Append( KHttp );
- localUri.Append( aUri );
- User::LeaveIfError( UriParser.Parse( localUri ) );
- }
- else
- {
- User::LeaveIfError( UriParser.Parse( aUri ) );
- }
-
- if ( UriParser.IsPresent( EUriHost ) )
- {
- // Extract the Path, filename and extension from the uri
- TFileName filename = UriParser.Extract( EUriPath );
- TParsePtrC fileParser( filename );
-
- if ( fileParser.NamePresent() && fileParser.ExtPresent() )
- {
- if ( fileParser.Ext().Compare( KJpg ) == 0 ||
- fileParser.Ext().Compare( KJpeg ) == 0 ||
- fileParser.Ext().Compare( KBmp ) == 0 ||
- fileParser.Ext().Compare( KPng ) == 0 ||
- fileParser.Ext().Compare( KSvg ) == 0 ||
- fileParser.Ext().Compare( KSvgz ) == 0 )
- {
- // file name and ext present and
- // it is amy of the supported image types
- return ERemoteImageFile;
- }
- else
- {
- //file Extension present but not a supported image ext,
- //may be some html file
- return ENotAnImageFile;
- }
- }
- else
- {
- //Should be a domain name so return ENotAnImageFile
- return ENotAnImageFile;
- }
- }
- else
- {
- return ELocalImageFile;
- }
- }
-
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::GetFileNameFromUri
-// This function gets the filename from the uri,
-// Returns true if the file name is retrieved
-// Returns False if the file name could not be retrieved.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TBool CSVGTAppObserverUtil::GetFileNameFromUri( const TDesC& aUri,
- TDes& aFileName ) const
- {
-
- const TChar KBSlash = '/';
- TUriParser UriParser;
- if ( UriParser.Parse( aUri ) != KErrNone )
- {
- return EFalse;
- }
-
- if ( UriParser.IsPresent( EUriPath ) )
- {
- // Extract the Path, filename and extension from the uri
- TFileName filename = UriParser.Extract( EUriPath );
-
- TParse fileParser;
- fileParser.Set( filename, NULL, NULL );
-
- TInt slashPos = filename.LocateReverse( KBSlash );
- if ( slashPos != KErrNotFound )
- {
- aFileName = filename.Right( filename.Length() - (slashPos + 1));
- return ETrue;
- }
- else
- {
- return EFalse;
- }
-
- }
- else
- {
- return EFalse;
- }
-
- }
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::GetLocalFile
-// This function gets the filename with full path from the uri,
-// Returns true if the file name is retrieved
-// Returns False if the file name could not be retrieved.
-// ---------------------------------------------------------------------------
-//
-EXPORT_C TBool CSVGTAppObserverUtil::GetLocalFile(
- const TDesC& aUri,
- TDes& aFileName ,
- const TDesC& aSvgFileName )
- {
-
- TBuf<KMaxFileName> copyUri = aUri;
- // Before giving the uri to the file parser,
- // convert '/' to '\'.
- TInt pos;
- while( KErrNotFound != ( pos = copyUri.FindF( KBSlashStr ) ) )
- {
- copyUri.Replace(pos,1,KSlashStr );
- }
-
- // if the uri starts with ".\" remove ".\"
- if ( copyUri.Left( 2 ).Compare( KDotSlashStr ) == 0 )
- {
- copyUri = copyUri.Right( copyUri.Length() - KDotSlashStr().Length() );
- }
-
- // If the second letter is not ':'
- // and if it is not starting with '\',
- // and if the path has '/',
- // then prepend slash to it.
- if ( copyUri.Length() >= 2 &&
- copyUri.Mid( 1, 1 ).Compare( KColonStr ) != 0 &&
- copyUri.Mid( 0, 1 ).Compare( KSlashStr ) != 0 &&
- ( copyUri.Find( KSlashStr ) != KErrNotFound ) )
- {
- copyUri.Insert( 0, KSlashStr );
- }
-
- TParse fileParser;
- if( fileParser.Set( copyUri, NULL, NULL ) != KErrNone )
- {
- return EFalse;
- }
-
- if ( fileParser.DrivePresent() )
- {
- // The uri is an absolute path
- aFileName.Append( fileParser.Drive() );
- // Append path, file name and extension from the uri.
- if ( fileParser.PathPresent() )
- {
- aFileName.Append( fileParser.Path() );
- }
- if ( fileParser.NamePresent() )
- {
- aFileName.Append( fileParser.Name() );
- }
- if ( fileParser.ExtPresent() )
- {
- aFileName.Append( fileParser.Ext() );
- }
- RFs session;
- TInt connectError=session.Connect();
- if(connectError==KErrNone)
- {
- RFile fileHandle;
- TInt openError = fileHandle.Open( session, aFileName, EFileShareReadersOnly);
- fileHandle.Close();
- session.Close();
- if ( openError != KErrNone )
- {
- return EFalse;
- }
- return ETrue;
- }
- session.Close();
- return EFalse;
- }
- else
- {
-
- TParse svgFilenameParser;
- if ( svgFilenameParser.Set( aSvgFileName,NULL,NULL ) != KErrNone )
- {
- return EFalse;
- }
-
- if ( svgFilenameParser.DrivePresent() )
- {
- aFileName.Append( svgFilenameParser.Drive() );
- }
-
- TInt dotdotPos = copyUri.Find( KDotDot );
- TInt rightPos = 0;
-
- if ( dotdotPos != KErrNotFound )
- {
- // If ".." is present collapse it with the parent path
- if ( svgFilenameParser.PathPresent() )
- {
- do
- {
- if ( dotdotPos > 1 )
- {
- svgFilenameParser.AddDir( copyUri.Left(dotdotPos - 1) );
- }
-
- if ( svgFilenameParser.PopDir() != KErrNone )
- {
- return EFalse;
- }
-
- rightPos = (copyUri.Length()) - (dotdotPos + 3);
-
- if ( rightPos > 0 )
- {
- copyUri = copyUri.Right( rightPos );
- }
-
- }while ( (dotdotPos = copyUri.Find( KDotDot ) )
- != KErrNotFound );
-
- aFileName.Append( svgFilenameParser.Path() );
- aFileName.Append( copyUri );
- }
- else
- {
- return EFalse;
- }
- }
- else
- {
- if ( svgFilenameParser.PathPresent() )
- {
- aFileName.Append( svgFilenameParser.Path() );
- }
-
- // Append path, file name and extension from the uri.
- if ( fileParser.PathPresent() )
- {
- //deletes an extra slash in aFileName
- TInt strlen = aFileName.Length();
- if(aFileName.Mid(strlen-1).Compare(KSlashStr) == 0)
- {
- aFileName.Delete(strlen-1, 1);
- }
- aFileName.Append( fileParser.Path() );
- }
-
- if ( fileParser.NamePresent() )
- {
- aFileName.Append( fileParser.Name() );
- }
- if ( fileParser.ExtPresent() )
- {
- aFileName.Append( fileParser.Ext() );
- }
- }
- RFs session;
- // The error is caught to avoid any code scanner error
- TInt connectError=session.Connect();
- if(connectError==KErrNone)
- {
- RFile fileHandle;
- TInt openError = fileHandle.Open(session, aFileName, EFileShareReadersOnly );
- fileHandle.Close();
- session.Close();
- if ( openError != KErrNone )
- {
- return EFalse;
- }
- return ETrue;
- }
- session.Close();
- return EFalse;
- }
- }
-
-
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
-// ---------------------------------------------------------------------------
-// CSVGTAppObserverUtil::FindDownload
-// This iterates through the linked list and return the link
-// corresponding to the given http download handle
-// If a link is not found returns NULL.
-// ---------------------------------------------------------------------------
-//
-CSVGTViewerAppDownloads* CSVGTAppObserverUtil::FindDownload(
- const RHttpDownload* aHttpDownload )
- {
- CSVGTViewerAppDownloads* downloadItem;
- TDblQueIter<CSVGTViewerAppDownloads> Iter( iDownloads );
- if ( !iDownloads.IsEmpty() )
- {
- Iter.SetToFirst();
- while ( ( downloadItem = Iter ) != NULL )
- {
- if ( downloadItem->DownloadHandle() == aHttpDownload )
- {
- return downloadItem;
- }
- Iter++;
- }
- }
- return NULL;
- }
-#endif
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::CSVGTAppObserverUtil
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C CSVGTAppObserverUtil::CSVGTAppObserverUtil(
- CSVGTUIDialog* aAppDialog ) :
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
- iDownloads( CSVGTViewerAppDownloads::LinkOffset() ) ,
- iDownloadIter( iDownloads ),
- iDownloadMenuEnabled( EFalse ), // construct header & iterator
- iSynchronousDownloadStopped( EFalse ),
-#endif
- iAppDialog( aAppDialog ),
- iSavingDone( EFalse ),
- iCommandId( 0 ),
-// iIsFetchImageCall(EFalse),
- iTempFileUsed( EFalse ),
- iDownloadDone( EFalse ),
- iDownloadInProgress( EFalse )
-
- {
- }
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::ConstructL()
- {
-
- // Get the CEikonEnv pointer
- iEikEnv = CEikonEnv::Static();
-
- // Find which drive this DLL is installed.
- TFileName fileName;
-
- // Get the full resource file
- TParse fp;
-
- // Add the resource dir
- fp.Set( KResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL);
-
- // Get the filename with full path
- fileName = fp.FullName();
-
- BaflUtils::NearestLanguageFile( iEikEnv->FsSession(), fileName ); //for
- // localization
- iResourceOffset = iEikEnv->AddResourceFileL( fileName );
-
-
- // File manager utility needed for saving/moving files.
- iFileManager = CSVGTFileManager::NewL();
-
- iDocHandler = CDocumentHandler::NewL();
-
-#ifdef SVGTVIEWERAPP_DOWNLOADMGR_ENABLED
- TUid hostUid = iEikEnv->EikAppUi()->Application()->AppDllUid();
-
- //creates a download manager session
- //parameters - uid, mhttpdownloadmgrobserver
- //embedded mode on - master flag True has to be passed when the app is
- //in stand alone mode, false in case of embedded mode
- iDownloadMgr.ConnectL( hostUid ,*this , EFalse /* Embedded mode*/);
- // When SVGT Viewer exits, all the downloads are
- // cancelled by the download manager
- iDownloadMgr.SetIntAttribute( EDlMgrExitAction , EExitDelete );
-
- iDMgrUiReg = CDownloadMgrUiLibRegistry::NewL( iDownloadMgr );
- iDMgrDownloadsList = &iDMgrUiReg->RegisterDownloadsListL();
- iDMgrUserInteractions = &iDMgrUiReg->RegisterUserInteractionsL();
- iDMgrUserInteractions->SetBoolAttributeL( CDownloadMgrUiUserInteractions::EAttrSuppressDownloadConfirmation,
- ETrue );
-#endif
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::ConstructL(
- RFile* aFileHdlPtr,
- const TDesC& aFilename,
- TBool aIsFileFullPathAvailable,
- TBool aCanSaveContent,
- TBool aShouldMoveContent )
- {
- iIsFullFilePathValid = aIsFileFullPathAvailable;
- iCanSaveContent = aCanSaveContent;
- iShouldMoveContent = aShouldMoveContent;
- iSvgFileId = aFileHdlPtr;
- if ( aIsFileFullPathAvailable )
- {
- iSvgFileName = aFilename.AllocL();
- }
- else
- {
- TFileName fullPathName;
- iSvgFileId->FullName( fullPathName );
- iSvgFileName = fullPathName.AllocL();
- }
- ConstructL();
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::ConstructL(
- RFile* aFileHdlPtr
- )
- {
- TBuf<1> lDummyFileName; /* This is needed by ConstructL,
- but will be ignored */
-
- ConstructL( aFileHdlPtr,
- lDummyFileName,
- EFalse /* IsFileFullPathAvailable */,
- ETrue /* CanSaveContent */,
- EFalse /* aShouldMoveContent */
- );
- }
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::CanShowSave
-// Tells the SVG-T dialog if the save option should be displayed.
-// e.g. If the dialog is launched from SVG-T viewer and which is launched
-// embedded from Browser/Messaging then Save option would be displayed.
-// Also when MMS launches the dialog.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TBool CSVGTAppObserverUtil::CanShowSave()
-{
- return iCanSaveContent;
-}
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::CanShowSave
-// Tells the SVG-T dialog if saving of the content is done.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C TBool CSVGTAppObserverUtil::IsSavingDone()
-{
- return iSavingDone;
-}
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::DoSaveL
-// Performs the save operation on the content opened.
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::DoSaveL( TInt aCommandId )
- {
- iCommandId = aCommandId;
- // Get filename.
- // Run Dialog.
- // Need to pause content
- iAppDialog->ProcessCommandL( ESvgtDlgPauseCommand );
-
- // Get the currently playing svg file's name and extension.
- HBufC* lFileNameBuf = HBufC::NewLC( KMaxFileName );
- TPtr lFileNamePtr = lFileNameBuf->Des();
- GetFileNameAndExt( lFileNamePtr );
-
- #ifndef RD_MULTIPLE_DRIVE
- // Get User's choice of name and folder for target file.
- TBool retval = AknCommonDialogs::RunSaveDlgNoDirectorySelectionLD(
- lFileNamePtr,
- R_SVGT_SAVE_LOCATIONS );
-#else
-
- TBool retval = AknCommonDialogsDynMem::RunSaveDlgNoDirectorySelectionLD(
- AknCommonDialogsDynMem::EMemoryTypeRemote |
- AknCommonDialogsDynMem::EMemoryTypePhone |
- AknCommonDialogsDynMem::EMemoryTypeMMC,
- lFileNamePtr, R_SVGT_SAVE_LOCATIONS);
-#endif
-
- if ( retval )
- {
- // User chose a valid file name
- TBool lMoveFlag = EFalse;
- TBuf<1> lDummyFileName;
- RFile lDummyFile;
- TInt errSaveContent = KErrNone;
- TInt errSaveText = KErrNone;
-
- // Assume it is not the overwrite case by default
- iIsOverwriteCase = EFalse;
-
- // Get the currently playing svg file's full path
- HBufC* lFullFilePathBuf = HBufC::NewLC( KMaxFileName );
- TPtr lFullFilePathPtr = lFullFilePathBuf->Des();
-
- if ( iSvgFileId )
- {
- iSvgFileId->FullName( lFullFilePathPtr );
- }
- // Check if file name is same as orig file -> overwrite case
- if ( !( lFileNamePtr.CompareF( lFullFilePathPtr ) ) )
- {
- iIsOverwriteCase = ETrue;
- }
- CleanupStack::PopAndDestroy( lFullFilePathBuf );
- lFullFilePathBuf = NULL;
-
- // Check if text edit happened
- if ( iAppDialog->IsTextContentChanged() )
- {
- if ( iTempFileName )
- {
- delete iTempFileName;
- iTempFileName = NULL;
- }
- iTempFileName = HBufC::NewL( KMaxFileName );
- TPtr lTempFilePtr = iTempFileName->Des();
-
- // Indicate that cleanup is to be performed in SVGTSavingDoneL
- iTempFileUsed = ETrue;
-
- TRAP( errSaveText, SaveSvgTextContentL( *iSvgFileId, lTempFilePtr ) );
-
- if ( !errSaveText )
- {
- // Temp file should be moved instead of
- // original file
- lMoveFlag = ETrue;
-
- if ( IsAllowMove() || iIsOverwriteCase )
- {
- // Based on Move option/self overwrite case, need to close
- // the content being played.
- // Need to close the currently running file-handle,
- // need to inform dialog to stop using it.
- iAppDialog->StopUsingContentFileHandle();
- iSvgFileId->Close();
- }
-
- if ( IsAllowMove() )
- {
- // Remember that the original file should
- // be deleted if file save is successful.
- iDeleteOrigFile = ETrue;
- }
-
-
- TRAP( errSaveContent, SaveContentL(
- lDummyFile,
- lTempFilePtr,
- lFileNamePtr,
- lMoveFlag ));
- }
- }
- else // No text editing happened
- {
-
- if ( IsAllowMove() || iIsOverwriteCase )
- {
- // Based on Move option/self overwrite case, need to close
- // the content being played.
- // Need to close the currently running file-handle,
- // need to inform dialog to stop using it.
- iAppDialog->StopUsingContentFileHandle();
- iSvgFileId->Close();
- }
-
- if ( IsAllowMove() )
- {
- lMoveFlag = ETrue;
- TRAP( errSaveContent, SaveContentL(
- lDummyFile,
- *iSvgFileName,
- lFileNamePtr,
- lMoveFlag ));
- }
- else
- {
- TRAP( errSaveContent, SaveContentL(
- *iSvgFileId,
- lDummyFileName,
- lFileNamePtr,
- lMoveFlag ));
- }
- }
-
- CleanupStack::PopAndDestroy( lFileNameBuf );
-
-
- if ( errSaveText || errSaveContent )
- {
- // If disk full problem, display note.
- if ( errSaveContent == KErrDiskFull || errSaveText == KErrDiskFull )
- {
- // mmc full note
- HBufC* text = StringLoader::LoadLC( R_SVGT_MMC_FULL );
- CAknGlobalNote* note = CAknGlobalNote::NewLC();
- note->SetSoftkeys( R_AVKON_SOFTKEYS_OK_EMPTY__OK );
- note->ShowNoteL( EAknGlobalErrorNote, *text );
- CleanupStack::PopAndDestroy(2);// note, text
- }
-
- // If temporary file was used, perform cleanup
- if ( iTempFileUsed )
- {
- if ( iTempFileName )
- {
- // Try and delete the temp file, ignore the error.
- iEikEnv->FsSession().Delete( iTempFileName->Des() );
- delete iTempFileName;
- iTempFileName = NULL;
- }
- iTempFileUsed = EFalse;
- }
-
- // If the File Couldn't be Moved, then Open the original
- // file again and Set it back to dialog.
- if ( IsAllowMove() )
- {
- if( iSvgFileId->Open(iEikEnv->FsSession(),
- iSvgFileName->Des(), EFileShareAny) != KErrNone )
- {
- // This should not happen, Couldn't reopen back the
- // Original content!, No Point in showing save.
- iCanSaveContent = EFalse;
- return;
- }
- else
- {
- iAppDialog->StartUsingContentFileHandle();
- }
- }
- }
- else
- {
- LaunchWaitNoteL( R_SVGT_SAVING_WAIT_NOTE, ETrue, lDummyFileName );
- }
- }
- else
- {
- // User pressed cancel in save dialog - cleanup
- CleanupStack::PopAndDestroy( lFileNameBuf );
- }
- }
-
-EXPORT_C TInt CSVGTAppObserverUtil::NewFetchImageData( const TDesC& aUri )
- {
-// iIsFetchImageCall = ETrue
- TInt ret = KErrNone;
-
- TDownloadNeeded downloadNeeded = ELocalImageFile;
- TRAPD( error, downloadNeeded = IsDownloadNeededL( aUri ) );
-
- if ( error != KErrNone )
- {
- return KErrNotFound;
- }
-
- if ( downloadNeeded == ELocalImageFile )
- {
- TFileName fileName;
- if ( GetLocalFile( aUri, fileName, *iSvgFileName ) )
- {
- TRAPD(error, DoAssignLocalFileDataL( aUri, fileName ));
- return error;
- }
- else
- {
- iAppDialog->AssignImageData(aUri , NULL );
- return KErrNotFound;
- }
- }
- else if ( downloadNeeded == ERemoteImageFile )
- {
- //creatred for Dummy purpose
- RFs fs;
- RFile file;
-
- TRAPD( err,ret = StartDownloadingImageL( aUri, fs, file,
- EFalse,
- EFalse /* Asynchronous mode */) );
- if ( err != KErrNone )
- {
- return KErrNotFound;
- }
- else
- {
- return ret;
- }
-
- }
- else
- {
- return KErrNotFound;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::SaveContentL
-// Performs the save operation on the content opened given
-// source file handle, src/dst filename and whether to move/copy.
-// -----------------------------------------------------------------------------
-//
-void CSVGTAppObserverUtil::SaveContentL( RFile& aSrcFileHandle, // Used in copy
- const TDesC& aSrcFileName, // Used in move
- TDes& aDstFileName, // Dest File name
- TBool aMoveFlag ) // ETrue = Move
- {
- TInt ret = KErrNone;
- // Start Saving Operation.
- // Create directory
- TInt error = iEikEnv->FsSession().MkDirAll( aDstFileName );
- if ( error != KErrNone && error != KErrAlreadyExists )
- {
- User::Leave( error );
- }
-
- // Check if the content should be moved. e.g. In Browser case.
- iFileManager->SetAllowMove( aMoveFlag );
-
- // Ask FileManager to start saving. ObserverUtil acts as
- // observer for filemanager operations. Based on whether
- // the Move operation is required or not,
- // there are two versions of filecopy operations.
- // In Move Full filepath is required
- if ( aMoveFlag )
- {
- if ( IsFileFullPathAvailable() )
- {
- // Keep the Destination file reference.
- if ( iSvgDstFileName )
- {
- delete iSvgDstFileName;
- iSvgDstFileName = NULL;
- }
- iSvgDstFileName = aDstFileName.AllocL();
-
- // Start the Move Now.
- ret = iFileManager->StartCopyOperationL(
- this, aSrcFileName, aDstFileName );
- }
- else
- {
- // Shouldn't happen. If Move operation is required,
- // Full file path must be there.
- ret = KErrPathNotFound;
- }
- }
- else
- {
- ret = iFileManager->StartCopyOperationL(
- this, aSrcFileHandle, aDstFileName );
- }
- User::LeaveIfError( ret );
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::GetUniqueFileName
-// Generates a unique filename in the private directory
-// -----------------------------------------------------------------------------
-//
-void CSVGTAppObserverUtil::GetUniqueFileName( TDes& aName ) const
- {
- TFileName lPpath;
- iEikEnv->FsSession().PrivatePath( lPpath );
- RThread lThread;
- _LIT( KFNameFormatStr,"%u");
- TBuf<KSvgMaxThreadIdStr> lThreadIdStr;
- lThreadIdStr.Format( KFNameFormatStr, (TUint)(lThread.Id()) );
- aName.Append( lPpath );
- aName.Append( lThreadIdStr );
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::IsGzipContent
-// Checks whether the file is a GZipped content
-// -----------------------------------------------------------------------------
-//
-TBool CSVGTAppObserverUtil::IsGzipContent( const RFile& aFileHandle ) const
-{
- TUint8 ids[2];
- TPtr8 des( ids, 0, sizeof( TUint8 ) * 2 );
- TInt zero = 0;
-
- // Reset to the beginning
- aFileHandle.Seek( ESeekStart, zero );
-
- // Read the first two bytes
- if ( aFileHandle.Read( des ) != KErrNone )
- {
- return EFalse;
- }
-
- // reset to start of file
- aFileHandle.Seek( ESeekStart, zero );
- return ( ids[0] == 31 && ids[1] == 139 );
-// return ( ids[0] == EZGZipFile::ID1 && ids[1] == EZGZipFile::ID2 );
-}
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::SaveSvgContent
-// Saves the SVG content to a temporary file
-// -----------------------------------------------------------------------------
-//
-void CSVGTAppObserverUtil::SaveSvgTextContentL( const RFile& aSrcFileHandle,
- TDes& aTempFileName )
- {
- TFileName lTempFileName;
-
- // Save the content path
- HBufC* lOrigFileNameBuf = HBufC::NewLC( KMaxFileName );
- TPtr lOrigFileNamePtr = lOrigFileNameBuf->Des();
- aSrcFileHandle.FullName( lOrigFileNamePtr );
-
- // Create the temp file in the same drive as the content file
- TParsePtrC lOrigPath( lOrigFileNamePtr );
-
- // Put the drive into the path
- lTempFileName.Append( lOrigPath.Drive() );
-
- // lOrigFileNameBuf no longer needed. No more references to
- // lOrigFileNamePtr.
-// CleanupStack::PopAndDestroy( lOrigFileNameBuf );
-
- // Generate a unique file name
- GetUniqueFileName( lTempFileName );
-
- TInt lOrigFileSize = 0;
- TInt lFileSizeErr = aSrcFileHandle.Size( lOrigFileSize );
- if ( lFileSizeErr )
- {
- User::Leave( lFileSizeErr );
- }
-
- // Check whether freespace available
- // Assume that the new file occupies same amount of space as the original
- // file. Not so in the case of svgz file.
-#ifndef RD_MULTIPLE_DRIVE
- if( lOrigPath.Drive().CompareF( PathInfo::MemoryCardRootPath().Left(2) )
- == 0 )
- {
- if (SysUtil::MMCSpaceBelowCriticalLevelL(&(iEikEnv->FsSession()),
- lOrigFileSize ))
- {
- User::Leave( KErrDiskFull ); // MMC full, Avkon shows note
- }
- }
- else
- {
- if (SysUtil::FFSSpaceBelowCriticalLevelL(&(iEikEnv->FsSession()),
- lOrigFileSize ))
- {
- User::Leave( KErrDiskFull ); // Phone memory full, Avkon shows
- // note
- }
- }
-#else
-//******************* Added to support multiple drives *************************
- TInt intDrive;
- TChar ch = lOrigPath.Drive()[0];
-
- User::LeaveIfError( RFs::CharToDrive(ch,intDrive) );
-
- if( SysUtil::DiskSpaceBelowCriticalLevelL(&(iEikEnv->FsSession()),
- lOrigFileSize, intDrive ))
- {
- User::Leave( KErrDiskFull ); // MMC full, Avkon shows note
- }
-
-//*********************************************************************************
-#endif
- // lOrigFileNameBuf no longer needed. No more references to
- // lOrigFileNamePtr.
- CleanupStack::PopAndDestroy( lOrigFileNameBuf );
-
- // Create the directory to the temp filename
- TInt lDirCreateError = iEikEnv->FsSession().MkDirAll( lTempFileName );
-
- // Ignore error if the directory already exists
- if ( lDirCreateError != KErrNone && lDirCreateError != KErrAlreadyExists )
- {
- User::Leave( lDirCreateError );
- }
-
- // Save the changed SVG content to that file name
- iAppDialog->SaveSvgDom( lTempFileName );
-
- // Check if content is gzipped
- if ( IsGzipContent( aSrcFileHandle ) )
- {
- // Zip the content
- }
- aTempFileName = lTempFileName;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::GetFileNameAndExt
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::GetFileNameAndExt(TDes& filename) const
-{
-
- // If FileName is valid use that, else check filehandle
- // and give back file-name from that.
- if ( iIsFullFilePathValid )
- {
- if ( iSvgFileName )
- {
- TParsePtrC p(*iSvgFileName);
- TPtrC ptr(p.NameAndExt());
- filename = ptr;
- }
- }
- else
- {
- if ( iSvgFileId )
- {
- iSvgFileId->Name( filename );
- }
- }
-
-}
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::IsAllowMove
-// -----------------------------------------------------------------------------
-EXPORT_C TBool CSVGTAppObserverUtil::IsAllowMove() const
-{
- return iShouldMoveContent;
-}
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::IsFileFullPathAvailable
-// -----------------------------------------------------------------------------
-EXPORT_C TBool CSVGTAppObserverUtil::IsFileFullPathAvailable() const
- {
- return 1;
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::LauncWaitNoteL
-// -----------------------------------------------------------------------------
-//
-void CSVGTAppObserverUtil::LaunchWaitNoteL(TInt aResourceId,
- TBool aVisibilityDelayOff, const TDesC& aFileName )
- {
-
- delete iWaitNote;
- iWaitNote = NULL;
- iProgressInfo = NULL;
-
- if ( aResourceId == R_SVGT_DOWNLOAD_WAIT_NOTE )
- {
- iWaitNote = new (ELeave) CAknWaitDialog( (CEikDialog**)&iWaitNote,
- aVisibilityDelayOff );
- iWaitNote->PrepareLC(aResourceId);
-
- TInt resourceId = R_SVGT_DOWNLOADING_FILE;
- HBufC* downloadMsg = StringLoader::LoadLC( resourceId );
-
- TBuf<KMaxFileName> titleString;
- titleString.Append( downloadMsg->Des() );
-
- CleanupStack::PopAndDestroy( downloadMsg ); // downloadMsg
-
- // Add a force line feed to the note:
- // qtn_svgt_waiting_downloading [ Downloading file ],
- // and the note will read like this:
- // Downloading file
- // filename
- titleString.Append( KNewLineStr );
-
- // Append the filename
- titleString.Append( aFileName );
-
- iWaitNote->SetTextL( titleString );
-
- iWaitNoteState = EDownloadImageWait;
- }
- else if ( aResourceId == R_SVGT_SAVING_WAIT_NOTE )
- {
- iWaitNote = new (ELeave) CAknProgressDialog( (CEikDialog**)&iWaitNote,
- aVisibilityDelayOff );
- iWaitNote->PrepareLC(aResourceId);
- iProgressInfo = iWaitNote->GetProgressInfoL();
- iProgressInfo->SetFinalValue( KSVGTPercent );
- iWaitNoteState = ESaveFileWait;
- }
- else
- {
- return;
- }
-
- if ( iWaitNote )
- {
- iWaitNote->SetCallback(this);
- iWaitNote->RunLD();
- }
- else
- {
- return;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::DialogDismissedL
-// This is for CAknWaitDialog callback
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::DialogDismissedL( TInt aButtonId )
- {
-
- switch (aButtonId)
- {
- case EAknSoftkeyQuit:
- {
- if ( iWaitNoteState == ESaveFileWait )
- {
- // Handle Save Cancel
- iFileManager->CancelCopy();
- // Resume the presentation
- iAppDialog->ProcessCommandL( iCommandId );
- }
- else if ( iWaitNoteState == EDownloadImageWait )
- {
- if ( iWait.IsStarted() )
- {
- iSynchronousDownloadStopped = ETrue;
- iWait.AsyncStop();
- }
- }
- else
- {
- return;
- }
- break;
- }
- default:
- break;
- }
- }
-
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::SVGTSavingDoneL
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::SVGTSavingDoneL( TInt aError )
- {
-#ifdef SVGTVIEWERAPP_DBG_FLAG
- TBuf<40> msg;
- _LIT( errorMsg, "Save Done Err %d" );
- msg.Format(errorMsg, aError );
- PrintDebugMsg( msg );
-#endif
- // If temporary file was used then, perform cleanup
- if ( iTempFileUsed )
- {
- if ( iTempFileName )
- {
- iEikEnv->FsSession().Delete( iTempFileName->Des() );
- delete iTempFileName;
- iTempFileName = NULL;
- }
- iTempFileUsed = EFalse;
- }
-
- // Indicate to the dialog about the save completion
- iAppDialog->SaveComplete( aError );
-
- if ( !aError )
- {
- iSavingDone = ETrue;
- }
-
- if( iWaitNote )
- {
- if ( !aError && iProgressInfo )
- {
- iProgressInfo->SetAndDraw( KSVGTPercent );
- }
- iWaitNote->ProcessFinishedL();
- delete iWaitNote;
- iWaitNote = NULL;
-
-#ifdef SVGTVIEWERAPP_DBG_FLAG
- _LIT( errorMsg, "Proc Finished called" );
- PrintDebugMsg( errorMsg() );
-#endif
-
- }
-
- if ( !aError )
- {
-
- // "saved" note
- HBufC* text = StringLoader::LoadLC(R_SVGT_CLIP_SAVED);
- CAknInformationNote* dlg = new (ELeave) CAknInformationNote( ETrue );
- dlg->ExecuteLD(*text);
- CleanupStack::PopAndDestroy( text ); // text
-
-
- }
- else
- {
- iEikEnv->HandleError( aError );
- }
-
- // If move allowed or it is the overwriting self case then
- if ( IsAllowMove() || iIsOverwriteCase )
- {
- if ( !aError )
- {
- // No error occurred
-
- // File has been moved and source
- // deleted hence don't show save now.
- iCanSaveContent = EFalse;
- // If It was Move operation, then Open the new file
- // and give the handle to dialog.
- if ( iSvgFileId->Open(iEikEnv->FsSession(),
- iSvgDstFileName->Des(), EFileShareAny) != KErrNone )
- {
- // Shouldn't happen.
- return;
- }
- else
- {
- iAppDialog->StartUsingContentFileHandle();
- }
- }
- else // Error occurred while saving, try to recover
- {
- // If it was Move Operation, and failed, then Open
- // Original Source file again and give the handle to
- // dialog. Note this could fail potentially as the
- // original file could have been deleted.
- if ( iSvgFileId->Open(iEikEnv->FsSession(),
- iSvgFileName->Des(), EFileShareAny) != KErrNone )
- {
- //Inconsistent state, can't show save also.
- iCanSaveContent = EFalse;
- return;
- }
- else
- {
- // Can keep showing the save option still.
- iAppDialog->StartUsingContentFileHandle();
- }
- }
- }
-
- if ( !aError )
- {
- if ( iDeleteOrigFile )
- {
- iEikEnv->FsSession().Delete( iSvgFileName->Des() );
- iSvgFileName->Des().Zero();
- }
- // Pass the command id back to UiDialog
- iAppDialog->ProcessCommandL( iCommandId );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::SVGTPositionChanged
-// -----------------------------------------------------------------------------
-//
-EXPORT_C void CSVGTAppObserverUtil::SVGTPositionChanged(TInt aPosition)
- {
- if (iWaitNote && iProgressInfo)
- {
- iProgressInfo->SetAndDraw(aPosition);
- }
- /*
- else if (iFullScreen)
- {
- TRAPD(ignore, iContainer->UpdateBufferingL(aPosition) );
- } // (L961)
- */
- }
-
-#ifdef SVGTVIEWERAPP_DBG_FLAG
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::PrintDebugMsg
-// -----------------------------------------------------------------------------
-//
-void CSVGTAppObserverUtil::PrintDebugMsg( const TDesC& aMsg )
- {
-#ifdef _DEBUG
- RFileLogger::Write( KFileLoggingDir, KFileLog,
- EFileLoggingModeAppend, aMsg );
-#endif
- }
-#endif
-
-// -----------------------------------------------------------------------------
-// CSVGTAppObserverUtil::DoAssignImageDataL
-// Reads the downloaded file & gives data to the svg engine.
-// -----------------------------------------------------------------------------
-//
-void CSVGTAppObserverUtil::DoAssignImageDataL(const CSVGTViewerAppDownloads* aDownloadItem,
- RHttpDownload& aDownload)
- {
- if( aDownloadItem && !aDownloadItem->ImageLinkFlag() )
- {
- TFileName lFileName;
- // Get the file path of the downloaded file
- aDownload.GetStringAttribute( EDlAttrDestFilename, lFileName );
-
- TInt lFileSize = 0;
- RFile lSvgFile;
- // Attempt to open the file in read mode
- User::LeaveIfError( lSvgFile.Open(iEikEnv->FsSession(),lFileName,EFileRead ) );
-
- // Save on cleanup stack
- CleanupClosePushL( lSvgFile );
-
- // Get the size of the data to create read buffer
- User::LeaveIfError( lSvgFile.Size(lFileSize) );
-
- // Create buffer that will contain the file data
- HBufC8* lFileData = HBufC8::NewLC(lFileSize);
- TPtr8 lFileDataPtr(lFileData->Des());
-
- // Read from the file
- User::LeaveIfError( lSvgFile.Read(lFileDataPtr) );
-
- // Create buffer to store the URI of the file
- HBufC* lUriBuf = HBufC::NewLC( KMaxUrlLength );
- TPtr lUriPtr(lUriBuf->Des());
-
- // Get the URI from data structure
- aDownload.GetStringAttribute( EDlAttrReqUrl, lUriPtr );
-
- // Call the AssignImageData function
- // Mapping is maintained between URI <-> FileData
- iAppDialog->AssignImageData(lUriPtr , lFileData );
-
- CleanupStack::PopAndDestroy( lUriBuf );
- CleanupStack::Pop( lFileData );
- CleanupStack::PopAndDestroy(&lSvgFile); // lSvgFile.Close()
- }
- }
-
-void CSVGTAppObserverUtil::DoAssignLocalFileDataL( const TDesC& aOriginalUri,
- const TDesC& aNewUri ) const
- {
- TInt lFileSize = 0;
- TBuf<KMaxPath>lFileName;
- lFileName.Copy(aNewUri);
- RFile lSvgFile;
- // Attempt to open the file in read mode
- User::LeaveIfError( lSvgFile.Open(iEikEnv->FsSession(),lFileName,EFileRead ) );
-
- // Save on cleanup stack
- CleanupClosePushL( lSvgFile );
-
- // Get the size of the data to create read buffer
- User::LeaveIfError( lSvgFile.Size(lFileSize) );
- // Create buffer that will contain the file data
- HBufC8* lFileData = HBufC8::NewLC(lFileSize);
- TPtr8 lFileDataPtr(lFileData->Des());
- // Read from the file
- User::LeaveIfError( lSvgFile.Read(lFileDataPtr) );
-
- // Call the AssignImageData function
- // Mapping is maintained between URI <-> FileData
- iAppDialog->AssignImageData(aOriginalUri , lFileData );
-
- CleanupStack::Pop( lFileData );
- CleanupStack::PopAndDestroy(&lSvgFile); // lSvgFile.Close()
- }
-
-EXPORT_C void CSVGTAppObserverUtil::AssignEmbededDataL( const TDesC& aUri )
- {
- HBufC8* decoded = DoGetProcessedEmbededDataL( aUri );
- if ( decoded )
- {
- iAppDialog->AssignImageData( aUri, decoded );
- }
- }
-
-HBufC8* CSVGTAppObserverUtil::DoGetProcessedEmbededDataL( const TDesC& aXlinkHrefValue ) const
- {
- HBufC8* retPtr = NULL;
- // find positions for ';' and ',' to determine encoding, mimetype
- TInt startIndex = aXlinkHrefValue.Locate( ';' );
- TInt endIndex = aXlinkHrefValue.Locate( ',' );
-
- // mimetype is after 'data:' : xlink:href="data:image/png;base64,
- // ignore mimetype extraction, decode will detect mimetype from decoded data.
-
- if ( startIndex != KErrNotFound &&
- endIndex != KErrNotFound &&
- startIndex < endIndex )
- {
- // extract encoding type
- TPtrC encoding( aXlinkHrefValue.Left( endIndex ).Right( endIndex - startIndex - 1 ) );
- // handle Base64 encoding
- _LIT( KEncodingBase64, "base64" );
- if ( encoding == KEncodingBase64 )
- {
- // find index of first character after white-space
- TInt index = endIndex + 1;
- while ( index < aXlinkHrefValue.Length() && TChar( aXlinkHrefValue[index] ).IsSpace() )
- index++;
-
- // must be 8-bit
- TInt length = aXlinkHrefValue.Length() - index;
- HBufC8* encoded = HBufC8::NewLC( length );
- encoded->Des().Copy( aXlinkHrefValue.Right( length ) );
-
- HBufC8* decoded = HBufC8::NewLC( length );
- TPtr8 decodedDes = decoded->Des();
-
- // decode
- TImCodecB64 encodingBase64;
- TInt decodeError = encodingBase64.Decode( *encoded, decodedDes );
-
- // Cleanup
- CleanupStack::Pop( decoded ); // encoded, decoded
- CleanupStack::PopAndDestroy( encoded );
- //delete encoded;
-
- // Check for decoding error
- if ( decodeError != KErrNone )
- {
- delete decoded;
- }
- else
- {
- retPtr = decoded;
- }
- }
- }
- return retPtr;
- }
- TBool CSVGTAppObserverUtil::ExitWhenOrientationChange()
- {
- return EFalse;
- }
-
-// End of File
-