iaupdate/IAD/ui/src/iaupdateparametersfilemanager.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 12:04:39 +0000
branchRCL_3
changeset 84 e6c5e34cd9b9
parent 0 ba25891c3a9e
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2007-2007 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:   CIAUpdateParametersFileManager
*
*/




#include <bautils.h>
#include <s32file.h>
#include <sysutil.h>
#include <iaupdateparameters.h>

#include "iaupdateparametersfilemanager.h"
#include "iaupdatefileconsts.h"
#include "iaupdatetools.h"
#include "iaupdatedebug.h"







// This constant will be used to check if the IAD application
// is using the same version of the file. If the versions
// differ, then this may require additional checking in the future versions
// when data is internalized. For example, IAD may give old version data 
// when self update is started and after update new version is used.
const TInt KVersion( 1 );


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::NewL
//
// -----------------------------------------------------------------------------
//
CIAUpdateParametersFileManager* CIAUpdateParametersFileManager::NewL()
    {
    CIAUpdateParametersFileManager* self =
        CIAUpdateParametersFileManager::NewLC();
    CleanupStack::Pop( self );
    return self;
    }


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::NewLC
//
// -----------------------------------------------------------------------------
//
CIAUpdateParametersFileManager* CIAUpdateParametersFileManager::NewLC()
    {
    CIAUpdateParametersFileManager* self =
        new( ELeave) CIAUpdateParametersFileManager();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;    
    }


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::CIAUpdateParametersFileManager
//
// -----------------------------------------------------------------------------
//
CIAUpdateParametersFileManager::CIAUpdateParametersFileManager()
: CBase()
    {
    }


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::ConstructL
//
// -----------------------------------------------------------------------------
//
void CIAUpdateParametersFileManager::ConstructL()
    {
    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::ConstructL start");
    
    User::LeaveIfError( iFsSession.Connect() );
    User::LeaveIfError( 
        iFsSession.SetSessionToPrivate( 
            IAUpdateFileConsts::KDrive ) );    
    User::LeaveIfError( iFsSession.SessionPath( iPath ) );
    BaflUtils::EnsurePathExistsL( iFsSession, iPath );
    iPath.Append( IAUpdateFileConsts::KParamsFile() );
    
    IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateParametersFileManager::ConstructL end: %S", &iPath);
    }


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::~CIAUpdateParametersFileManager
//
// -----------------------------------------------------------------------------
//
CIAUpdateParametersFileManager::~CIAUpdateParametersFileManager()
    {
    iFsSession.Close();
    }


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::ReadL
//
// -----------------------------------------------------------------------------
//
CIAUpdateParameters* CIAUpdateParametersFileManager::ReadL()
	{
    IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateParametersFileManager::ReadDataL path: %S", &iPath);

    CIAUpdateParameters* params( NULL );
    
	RFile file;
    TInt err( file.Open( iFsSession, iPath, EFileRead ) );
    if ( err == KErrNotFound )
        {
        IAUPDATE_TRACE("[IAUPDATE] Parameter file did not exist.");
        // File was not found.
        // So, return NULL.
        return params;
        }

    // If error occurred then leave.
    User::LeaveIfError( err );
    	
    CleanupClosePushL( file );
    
    RFileReadStream stream( file, 0 );
    CleanupClosePushL( stream );

    params = InternalizeL( stream );
    
    CleanupStack::PopAndDestroy( &stream );
    CleanupStack::PopAndDestroy( &file );

    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::ReadDataL end");
    
    return params;
	}


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::WriteL
//
// -----------------------------------------------------------------------------
//
void CIAUpdateParametersFileManager::WriteL( const CIAUpdateParameters& aParams )
	{
    IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateParametersFileManager::WriteDataL path: %S", &iPath);
    TInt sizeOfFile = sizeof( TInt ) //length integer in stream
                    + sizeof( TInt ) //KVersion
                    + sizeof( TInt ) * 5  //integers in externalised params
                    + aParams.SearchCriteria().Size()
                    + aParams.CommandLineExecutable().Size()
                    + aParams.CommandLineArguments().Size(); 
        
	if ( SysUtil::DiskSpaceBelowCriticalLevelL( &iFsSession, 
	                                            sizeOfFile, 
	                                            IAUpdateFileConsts::KDrive ) )
	    {
		User::Leave( KErrDiskFull );
	    }
    
	RFile file;
    User::LeaveIfError( file.Replace( iFsSession, iPath, EFileWrite ) );
    CleanupClosePushL( file );
    
    RFileWriteStream stream( file, 0 );
    CleanupClosePushL( stream );

    ExternalizeL( stream, aParams );
    stream.CommitL();
    
    CleanupStack::PopAndDestroy( &stream );
    CleanupStack::PopAndDestroy( &file );

    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::WriteDataL end");
	}


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::RemoveFile
//
// -----------------------------------------------------------------------------
//
TInt CIAUpdateParametersFileManager::RemoveFile()
    {
    IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateParametersFileManager::RemoveFile path: %S", &iPath);
    
    // May either be a full path, or relative to the session path.
    // Even if session path has already been set in the ConstructL,
    // we do not use the relative path and only the hard coded filename here. 
    // A new path may have been given by calling SetFilePathL. So, use that
    // value here.
    TInt errorCode( BaflUtils::DeleteFile( iFsSession, iPath ) );

    IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateParametersFileManager::RemoveFile end: %d", errorCode);
    
    return errorCode;
    }


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::InternalizeL
//
// -----------------------------------------------------------------------------
//
CIAUpdateParameters* CIAUpdateParametersFileManager::InternalizeL( RReadStream& aStream )
	{
    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::InternalizeL start");
    
	// If you make changes here, 
	// remember to update ExternalizeL accordingly!!!

    TInt version( aStream.ReadInt32L() );

    // Notice! In the future, some checking maybe required here
    // to be sure that file version is correct and the data can be
    // internalized correctly between different versions.
    if ( version != KVersion )
        {
        // For now, just leave with the corrupt error.
        User::Leave( KErrCorrupt );
        }

    CIAUpdateParameters* params( NULL );

    HBufC8* data( NULL );
    IAUpdateTools::InternalizeDes8L( data, aStream );
    if ( data )
        {
        IAUPDATE_TRACE("[IAUPDATE] Create parameters object");
        params = CIAUpdateParameters::NewLC();
        IAUpdateTools::InternalizeParametersL( *params, *data );
        delete data;
        data = NULL;
        CleanupStack::Pop( params );        
        }

    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::InternalizeL end");

    return params;
	}


// -----------------------------------------------------------------------------
// CIAUpdateParametersFileManager::ExternalizeL
//
// -----------------------------------------------------------------------------
//
void CIAUpdateParametersFileManager::ExternalizeL( RWriteStream& aStream,
                                                   const CIAUpdateParameters& aParams )
	{
    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::ExternalizeL start");
    
	// If you make changes here, 
	// remember to update InternalizeL accordingly!!!

    aStream.WriteInt32L( KVersion );

    // Write parameter data into the stream.
    HBufC8* data( NULL );
    IAUpdateTools::ExternalizeParametersL( data, aParams );
    if ( data )
        {
        IAUPDATE_TRACE("[IAUPDATE] Externalize parameter data into the stream.");
        IAUpdateTools::ExternalizeDes8L( *data, aStream );
        delete data;
        data = NULL;
        }

    IAUPDATE_TRACE("[IAUPDATE] CIAUpdateParametersFileManager::ExternalizeL start");
	}