dbcreator/commsdatstartup/Src/cdccommsdatstartup.cpp
author Simon Howkins <simonh@symbian.org>
Thu, 18 Nov 2010 15:05:52 +0000
branchRCL_3
changeset 76 40780c2f3a6b
parent 58 83ca720e2b9a
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2006,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:   Implementation of CCommsDatStartup class.
*
*/




// INCLUDE FILES

#include <e32def.h>
#include <e32base.h>
#include <s32strm.h>
#include <s32file.h>
#include <etelpckt.h>

#include <centralrepository.h>
#include "cdccommsdatcreatorcrkeys.h"

#include "cdccommsdatstartup.h"
#include "cdccommsdatcreator.h"
#include "cdcerrors.h"
#include "cdclogger.h"


// CONSTANTS
const TUid KCRUidCommsDb = { 0xcccccc00 };

//------------------------------------------------
// CCdcCommsDatStartup::DoStartL
//------------------------------------------------
//
void CCdcCommsDatStartup::DoStartL()
    {
    CLOG_WRITE( "-----------------------------" );
    CLOG_WRITE( "CCdcCommsDatStartup::DoStartL" );
    CLOG_WRITE( "-----------------------------" );
    
    CheckCreatorUIdL();

    CreateRepositoryL();
    
    // Set status to not initialised
    SetStartupStatusL( ECommsDatInitialisationFailed );

	CLOG_WRITE( "CCdcCommsDatStartup::ResetCommsDatToDefaultL()" );
	// In all RFS cases CommsDat must be reset 
	ResetCommsDatToDefaultL();
	
	// Reset EAP settings databases
	ResetEAPSettingsL();

	CLOG_WRITE( "CCdcCommsDatStartup::CCdcCommsDatCreator::NewLC()" );
	    
	CCdcCommsDatCreator* cdc = CCdcCommsDatCreator::NewLC();
	
	CLOG_WRITE( "CCdcCommsDatStartup::CreateTablesL" );
	
	// In all RFS cases CommsDat tables must be checked/created
	cdc->CreateTablesL();
	
    TFileName fileName;
    GetInputFileNameL( fileName );
        
    // CommsDatCreator feature is supported if input file name
    // lenght is not 0. However file name lenght at least 5. (x.xml)     
    if( fileName.Length() > 0 )
        {
        CLOG_WRITE( "CCdcCommsDatStartup::CommsDat generation enabled" );
        
        TFileName path( _L("Z:\\private\\10281BC3\\" )  );
        path.Append( fileName );

		CLOG_WRITE( "CCdcCommsDatStartup::CreateCommsDatL begin" );
	
        TRAPD(err, cdc->CreateCommsDatL( path ) );
        if(err != KErrNone )
        	{
        	// CommsDat creation leaved so something must be wrong.
        	// Reset CommsDat and EAP settings.
        	ResetCommsDatToDefaultL();
        	ResetEAPSettingsL();
        	cdc->CreateTablesL();
        	User::Leave( err );
        	}

        CLOG_WRITE( "CCdcCommsDatStartup::CreateCommsDatL end" );               
        }
       else
       	{
       	CLOG_WRITE( "CCdcCommsDatStartup::CommsDat generation disabled" );
       	}
        
    // If nothing has leaved then everything is okay (both in disabled and
    // enabled cases.
    SetStartupStatusL( ECommsDatInitialised );
        
    CleanupStack::PopAndDestroy( cdc );
    CLOG_WRITE( "CCdcCommsDatStartup::DoStartL end" );
    }

// ----------------------------------------------------------------------------
// CCdcCommsDatStartup::CreateRepositoryL()
// ----------------------------------------------------------------------------
//    
void CCdcCommsDatStartup::CreateRepositoryL()
    {
    CLOG_WRITE( "CCdcCommsDatStartup::CreateRepositoryL()" );

    TRAPD( err, iRepository = CRepository::NewL( KCRUidCommsDatCreator ) );
    
    // Log is important now, because repository cannot contain the 
    // error value if it cannot be used 
    if( err != KErrNone )
        {
        CLOG_WRITE_FORMAT( "Repository could not created err : %d", err );
        User::Leave( err );
        }
    }

// ----------------------------------------------------------------------------
// CCdcCommsDatStartup::SetStartupStatusL()
// ----------------------------------------------------------------------------
//    
void CCdcCommsDatStartup::SetStartupStatusL( TInt aResult )
    {
    CLOG_WRITE_FORMAT( "CCdcCommsDatStartup::SetStartupStatusL() %d", aResult );

    TInt err = iRepository->Set( KCommsDatCreatorStartupStatus, aResult );
    if( err != KErrNone )
        {
        CLOG_WRITE_FORMAT( 
                "Value could not write to repository err : %d", err );
        User::Leave( err );
        }

    CLOG_WRITE_FORMAT( "CCdcCommsDatStartup::SetStartupStatusL() %d", aResult );
    }

// ----------------------------------------------------------------------------
// CCdcCommsDatStartup::GetInputFileNameL()
// ----------------------------------------------------------------------------
//    
void CCdcCommsDatStartup::GetInputFileNameL( TFileName &aFileName )
    {
    CLOG_WRITE( "CCdcCommsDatStartup::GetInputFileNameL()" );

    TInt err = iRepository->Get( KCommsDatCreatorInputFileName, aFileName );
    if( err != KErrNone )
        {
        CLOG_WRITE_FORMAT(
                 "Value could not red from repository err : %d", err );
        User::Leave( err );
        }

    CLOG_WRITE( "Input filename red" );

    HBufC *fileName = aFileName.AllocLC();

    CLOG_WRITE_FORMAT( "Input filename value : %S", fileName );
    
    CleanupStack::PopAndDestroy( fileName );
    
    // Check if file exists. If it doesn't reset filename.
    RFs fs;
    err = fs.Connect();//check
    
    if( err == KErrNone )
    	{
    	RFile file;
    
    	TFileName path( _L("Z:\\private\\10281BC3\\" )  );
    	path.Append( aFileName );

    	err = file.Open(fs, path, EFileRead);
    	if( err != KErrNone )
    	{
	    	CLOG_WRITE( "CCdcCommsDatStartup::GetInputFileNameL() File does not exist");
  	  	aFileName.Zero();
    	}
    	else
    	{
    		file.Close();
    	}
    	fs.Close();
    	}
    
    CLOG_WRITE( "CCdcCommsDatStartup::GetInputFileNameL()" );
    }

// ----------------------------------------------------------------------------
// CCdcCommsDatStartup::CheckCreatorUIdL()
// ----------------------------------------------------------------------------
//   	
void CCdcCommsDatStartup::CheckCreatorUIdL()
    {
    // UID of MainRfs
    const TUid KCreatorUid = { 0x102073EA };   
    
    CLOG_WRITE( "CCdcCommsDatStartup::CheckCreatorUIdL" );
    
    TUid creatorId = User::CreatorIdentity();

    CLOG_WRITE_FORMAT( "CreatorId : %x", creatorId );
   
    if( KCreatorUid != creatorId )
        {
        User::Leave( KErrPermissionDenied );
        }

    CLOG_WRITE( "CCdcCommsDatStartup::CheckCreatorUIdL" );
    }
    
// ----------------------------------------------------------------------------
// CCdcCommsDatStartup::~CCdcCommsDatStartup()
// ----------------------------------------------------------------------------
//   	
CCdcCommsDatStartup::~CCdcCommsDatStartup()
    {
    if( iRepository )
        {
        delete iRepository;
        }
    }

// ----------------------------------------------------------------------------
// CCdcCommsDatCreatorRfsPlugin::ResetCommsDatToDefaultL()
// ----------------------------------------------------------------------------
//   	
void CCdcCommsDatStartup::ResetCommsDatToDefaultL()
	{		
	CLOG_WRITE( "CCdcCommsDatStartup::ResetCommsDatToDefaultL" );
	
	CRepository* repository( NULL );
    
    repository = CRepository::NewL( KCRUidCommsDb );    
    CleanupStack::PushL( repository );

    CLOG_WRITE("Reset CommsDat CenRep");

    User::LeaveIfError( repository->Reset() );

    CleanupStack::PopAndDestroy( repository );

    CLOG_WRITE( "CCdcCommsDatStartup::ResetCommsDatToDefaultL end" );    
	}

// ----------------------------------------------------------------------------
// CCdcCommsDatCreatorRfsPlugin::ResetEAPSettingsL()
// ----------------------------------------------------------------------------
//   	
void CCdcCommsDatStartup::ResetEAPSettingsL()
{
	CLOG_WRITE( "CCdcCommsDatStartup::ResetEAPSettingsL" );
	RFs fs;
	User::LeaveIfError( fs.Connect() );
	CleanupClosePushL( fs );
	
	CFileMan *fileMan = CFileMan::NewL( fs );
	CleanupStack::PushL( fileMan );
	
	_LIT( KEapWildcard, "c:\\private\\100012a5\\DBS_102072E9_eap*" );
	
	TInt err = fileMan->Delete( KEapWildcard );
	
	if ( err != KErrNone 
		 && err != KErrNotFound 
		 && err != KErrPathNotFound )
		{
		User::Leave( err );
		}
			
	CleanupStack::PopAndDestroy( fileMan );
	CleanupStack::PopAndDestroy(); // fs		
	CLOG_WRITE( "CCdcCommsDatStartup::ResetEAPSettingsL end" );
}

// End of File.