diff -r 000000000000 -r ba25891c3a9e ncdengine/provider/server/src/ncdengineconfigurationimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/server/src/ncdengineconfigurationimpl.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,435 @@ +/* +* 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: CNcdEngineConfiguration implementation + * +*/ + + +#include + +#include "ncdengineconfigurationimpl.h" +#include "ncdproviderutils.h" +#include "catalogsutils.h" +#include "catalogsuids.h" +#include "ncdprotocolutils.h" +#include "catalogsconstants.h" +#include "ncdproviderdefines.h" +#include "ncdutils.h" +#include "ncddeviceservice.h" + +namespace NcdEngineConfiguration + { + _LIT8( KVersion, "version" ); + _LIT8( KType, "type" ); + _LIT8( KProvisioning, "provisioning" ); + _LIT8( KNetwork, "network" ); + _LIT8( KMcc, "mcc" ); + _LIT8( KMnc, "mnc" ); + _LIT8( KFixedAp, "fixed-access-point" ); + _LIT8( KAccessPointSettings, "access-point-settings" ); + _LIT8( KApId, "id" ); + _LIT8( KApDetail, "detail" ); + _LIT8( KApDetailId, "id" ); + _LIT8( KApDetailValue, "value" ); + } + +_LIT( KEngineDefaultType, "vanilla" ); +_LIT( KEngineDefaultVersion, "1.0" ); + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CNcdEngineConfiguration* CNcdEngineConfiguration::NewL( MNcdDeviceService& aDeviceService ) + { + CNcdEngineConfiguration* self = new( ELeave ) CNcdEngineConfiguration( aDeviceService ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CNcdEngineConfiguration::~CNcdEngineConfiguration() + { + DLTRACEIN(("")); + delete iType; + delete iVersion; + delete iProvisioning; + delete iUid; + delete iMcc; + delete iMnc; + delete iApId; + delete iApDetailId; + delete iApDetailValue; + delete iCorrectApId; + + iHomeMcc.Close(); + iHomeMnc.Close(); + + iApDetails.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// Configuration reader +// --------------------------------------------------------------------------- +// +void CNcdEngineConfiguration::ReadConfigurationL( const TDesC& aFilename ) + { + DLTRACEIN(( _L("Config file: %S"), &aFilename )); + CNcdConfigurationParser* parser = CNcdConfigurationParser::NewLC( *this ); + DLTRACE(("Reading file")); + + // find the file from engine's private paths + HBufC* filename = FindEngineFileL( CNcdProviderUtils::FileSession(), + aFilename ); + CleanupStack::PushL( filename ); + + // Read the file + HBufC8* data = ReadFileL( CNcdProviderUtils::FileSession(), *filename ); + + CleanupStack::PopAndDestroy( filename ); + CleanupStack::PushL( data ); + DLTRACE(("Start parsing")); + + // Parse the file + parser->ParseL( *data ); + CleanupStack::PopAndDestroy( 2, parser ); // data, parser + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const TDesC& CNcdEngineConfiguration::EngineType() const + { + return *iType; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const TDesC& CNcdEngineConfiguration::EngineVersion() const + { + return *iVersion; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +const TDesC& CNcdEngineConfiguration::EngineUid() const + { + return *iUid; + } + +// --------------------------------------------------------------------------- +// Provisioning getter +// --------------------------------------------------------------------------- +// +const TDesC& CNcdEngineConfiguration::EngineProvisioning() const + { + return *iProvisioning; + } + + +// --------------------------------------------------------------------------- +// Installation drive getter +// --------------------------------------------------------------------------- +// +const TDesC& CNcdEngineConfiguration::EngineInstallDrive() const + { + return iInstallationDrive; + } + + +// --------------------------------------------------------------------------- +// Engine temp drive +// --------------------------------------------------------------------------- +// +TInt CNcdEngineConfiguration::EngineTempDrive() const + { + return static_cast( iDataDrive ); + } + + +// --------------------------------------------------------------------------- +// Client data path getter +// --------------------------------------------------------------------------- +// +HBufC* CNcdEngineConfiguration::ClientDataPathLC( + const TDesC& aClientId, + TBool aTemp ) + { + DLTRACEIN(("")); + TPath path; + CreatePrivatePathL( + CNcdProviderUtils::FileSession(), + iDataDrive.Name(), + path ); + + path.Append( aClientId ); + path.Append( KDirectorySeparator ); + if ( aTemp ) + { + path.Append( NcdProviderDefines::KTempNamespace() ); + } + else + { + path.Append( NcdProviderDefines::KDataNamespace() ); + } + path.Append( KDirectorySeparator ); + BaflUtils::EnsurePathExistsL( CNcdProviderUtils::FileSession(), path ); + + DLTRACEOUT( ( _L("Path: %S"), &path ) ); + return path.AllocLC(); + } + + +TBool CNcdEngineConfiguration::UseFixedAp() const + { + DLTRACEIN(("")); + TBool retValue = iApDetails.Count() > 0; + DLINFO(("retValue: %d", retValue )) + return retValue; + } + + +const RPointerArray& CNcdEngineConfiguration::FixedApDetails() const + { + DLTRACEIN(("")); + return iApDetails; + } + + +// --------------------------------------------------------------------------- +// Client data path cleaner +// --------------------------------------------------------------------------- +// +void CNcdEngineConfiguration::ClearClientDataL( + const TDesC& aClientId, + TBool aTemp ) + { + DLTRACEIN(( _L("aClient: %S"), &aClientId )); + // Get the path and delete the directory + HBufC* path = ClientDataPathLC( aClientId, aTemp ); + CFileMan* fileman = CFileMan::NewL( CNcdProviderUtils::FileSession() ); + CleanupStack::PushL( fileman ); + User::LeaveIfError( fileman->RmDir( *path ) ); + CleanupStack::PopAndDestroy( 2, path ); // fileman, path + + DLTRACEOUT(("Client data path cleaned successfully")); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdEngineConfiguration::ConfigurationElementEndL( + const TDesC8& aElement, + const TDesC8& aData ) + { + DLTRACEIN(( "Element: %S, data: %S", &aElement, &aData )); + + if ( aElement == NcdEngineConfiguration::KAccessPointSettings() ) + { + iParseApDetails = EFalse; + } + else if ( iParseApDetails && aElement == NcdEngineConfiguration::KApDetail() ) + { + DASSERT( iApDetailId && iApDetailValue ); + CNcdKeyValuePair* detail = CNcdKeyValuePair::NewLC( *iApDetailId, *iApDetailValue ); + iApDetails.AppendL( detail ); + CleanupStack::Pop( detail ); + delete iApDetailId; + iApDetailId = NULL; + delete iApDetailValue; + iApDetailValue = NULL; + } + else if ( !aData.Length() ) + { + DLTRACEOUT(("No data.")); + return; + } + else if ( aElement == NcdEngineConfiguration::KType() ) + { + NcdProtocolUtils::AssignDesL( iType, aData ); + } + else if ( aElement == NcdEngineConfiguration::KVersion() ) + { + NcdProtocolUtils::AssignDesL( iVersion, aData ); + } + else if ( aElement == NcdEngineConfiguration::KProvisioning() ) + { + NcdProtocolUtils::AssignDesL( iProvisioning, aData ); + } + else + { + DLINFO(("Unknown element in the engine configuration file")); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdEngineConfiguration::ConfigurationAttributeL( + const TDesC8& aElement, + const TDesC8& aAttribute, + const TDesC8& aValue ) + { + DLTRACEIN(( "Element: %S, attribute: %S, value: %S", &aElement, &aAttribute, &aValue )); + + if ( aElement == NcdEngineConfiguration::KNetwork() && !iApIdFound ) + { + if ( aAttribute == NcdEngineConfiguration::KMcc() ) + { + NcdProtocolUtils::AssignDesL( iMcc, aValue ); + } + else if ( aAttribute == NcdEngineConfiguration::KMnc() ) + { + NcdProtocolUtils::AssignDesL( iMnc, aValue ); + } + else if ( aAttribute == NcdEngineConfiguration::KFixedAp() ) + { + NcdProtocolUtils::AssignDesL( iApId, aValue ); + } + if ( iMcc && iMnc && iApId ) + { + // All the attributes read, check whether the MCC/MNC match the current ones. + iDeviceService.HomeNetworkInfoL( iHomeMcc, iHomeMnc ); + if ( iHomeMcc == *iMcc && iHomeMnc == *iMnc ) + { + // Now we know the AP id we must use. + iApIdFound = ETrue; + NcdProtocolUtils::AssignDesL( iCorrectApId, *iApId ); + DLINFO((("correct ap id found: %S"), iCorrectApId )); + } + delete iMcc; + iMcc = NULL; + delete iMnc; + iMnc = NULL; + delete iApId; + iApId = NULL; + } + } + + if ( aElement == NcdEngineConfiguration::KAccessPointSettings() ) + { + if ( aAttribute == NcdEngineConfiguration::KApId() ) + { + if ( iApIdFound && *iCorrectApId == aValue ) + { + // This is the correct AP. + iParseApDetails = ETrue; + } + } + else + { + DLINFO(("Unknown attribute in the engine configuration file")); + } + } + + if ( iParseApDetails && aElement == NcdEngineConfiguration::KApDetail() ) + { + if ( aAttribute == NcdEngineConfiguration::KApDetailId() ) + { + NcdProtocolUtils::AssignDesL( iApDetailId, aValue ); + } + else if ( aAttribute == NcdEngineConfiguration::KApDetailValue() ) + { + NcdProtocolUtils::AssignDesL( iApDetailValue, aValue ); + } + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdEngineConfiguration::ConfigurationError( TInt /*aError*/ ) + { + DLERROR(("Some error occurred during parsing")); + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CNcdEngineConfiguration::CNcdEngineConfiguration( MNcdDeviceService& aDeviceService ) + : iParseApDetails( EFalse ), iApIdFound( EFalse ), iDeviceService( aDeviceService ) + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CNcdEngineConfiguration::ConstructL() + { + DLTRACEIN(("")); + iType = KEngineDefaultType().AllocL(); + iVersion = KEngineDefaultVersion().AllocL(); + iProvisioning = KNullDesC().AllocL(); + iUid = CleanUidName( TUid::Uid( KCatalogsServerUid ) ).AllocL(); + iHomeMcc.CreateL( MNcdDeviceService::KMccLength ); + iHomeMnc.CreateL( MNcdDeviceService::KMncLength ); + + TFileName engineExe( RProcess().FileName() ); + TParsePtrC parseDrive( engineExe ); + iInstallationDrive = parseDrive.Drive(); + + // Determine the drive used for temp and data + iDataDrive = TDriveUnit( DetermineDataDriveL() ); + + DLTRACEOUT(( _L("Install drive: %S"), &iInstallationDrive )); + } + + +// --------------------------------------------------------------------------- +// Determines the drive where data files are stored (temporarily) +// --------------------------------------------------------------------------- +// +TDriveNumber CNcdEngineConfiguration::DetermineDataDriveL() const + { + DLTRACEIN(("")); + TInt64 freeOnE = 0; + TInt64 freeOnC = 0; + + TDriveNumber drive = EDriveC; + TRAPD( err, freeOnE = FreeDiskSpaceL( CNcdProviderUtils::FileSession(), + EDriveE ) ); + + // Drive E exists and has free space + if ( freeOnE && err == KErrNone ) + { + // No trap because if this fails then we're in trouble already + freeOnC = FreeDiskSpaceL( CNcdProviderUtils::FileSession(), + EDriveC ); + if ( freeOnE > freeOnC ) + { + DLINFO(("Using E: as temp drive")); + drive = EDriveE; + } + } + return drive; + } +