diff -r 000000000000 -r 667063e416a2 locationmapnavfw/library/src/mnproviderimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationmapnavfw/library/src/mnproviderimpl.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,402 @@ +/* +* Copyright (c) 2005-2006 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: CMnProviderImpl class implementation +* +*/ + + +#include +#include +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#else +#include +#include +#endif +#include +#include +#include +#include + +#include "mnserviceclientbase.h" +#include "mnappserviceuids.hrh" + +#include "mnpluginuids.hrh" +#include "mnproviderimpl.h" + +#include "mndebug.h" + +// ======== LOCAL FUNCTIONS ======== + +extern TUid ServiceUid( CMnProvider::TService aService ); + +// --------------------------------------------------------------------------- +// Cleanup item for RImplInfoPtrArray +// --------------------------------------------------------------------------- +// +void CleanupImplementationsArray( TAny* aArray ) + { + ( static_cast( aArray ) )->ResetAndDestroy(); + } + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CMnProviderImpl::CMnProviderImpl() + { + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CMnProviderImpl::~CMnProviderImpl() + { + delete iName; + delete iShortName; + delete iVendorName; + REComSession::FinalClose(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CMnProviderImpl* CMnProviderImpl::NewL( TUid aProvider ) + { + CMnProviderImpl* self = new(ELeave) CMnProviderImpl; + CleanupStack::PushL( self ); + self->ConstructL( aProvider ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +CMnProviderImpl* CMnProviderImpl::NewL( + TUid aAppUid, + RApaLsSession& aApaSession, + Swi::RSisRegistrySession& aSisSession ) + { + CMnProviderImpl* self = new(ELeave) CMnProviderImpl; + CleanupStack::PushL( self ); + self->ConstructL( aAppUid, aApaSession, aSisSession ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::ConstructL( TUid aProvider ) + { + RApaLsSession apa; + User::LeaveIfError( apa.Connect() ); + CleanupClosePushL( apa ); + + Swi::RSisRegistrySession sis; + User::LeaveIfError( sis.Connect() ); + CleanupClosePushL( sis ); + + ConstructL( aProvider, apa, sis ); + + CleanupStack::PopAndDestroy( &sis ); + CleanupStack::PopAndDestroy( &apa ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::ConstructL( + TUid aAppUid, + RApaLsSession& aApaSession, + Swi::RSisRegistrySession& aSisSession ) + { + iUid = aAppUid; + ReadAppArcInfoL( aApaSession ); + ReadServiceFeaturesL( aApaSession ); + ReadPackageInfoL( aSisSession ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::ReadAppArcInfoL( RApaLsSession& aApa ) + { + LOG("CMnProviderImpl::ReadAppArcInfoL"); + + TApaAppInfo appInfo; + User::LeaveIfError( aApa.GetAppInfo( appInfo, iUid ) ); + + SetNameL( appInfo.iCaption ); + SetShortNameL( appInfo.iShortCaption ); + + // get additional data from SERVICE_INFO structs + + const TInt KGranularity = 8; + CArrayFixFlat< TUid >* serviceUids = + new (ELeave) CArrayFixFlat< TUid > ( KGranularity ); + CleanupStack::PushL( serviceUids ); + + aApa.GetAppServicesL( iUid, *serviceUids ); + + for ( TInt s = 0; s < serviceUids->Count(); s++ ) + { + switch ( (*serviceUids)[s].iUid ) + { + case KMnAppMapViewService: + iServices |= EServiceMapView; + break; + case KMnAppNavigationService: + iServices |= EServiceNavigation; + break; + case KMnAppGeocodingService: + iServices |= EServiceGeocoding; + break; + case KMnAppMapImageService: + iServices |= EServiceMapImage; + break; + } + } + + CleanupStack::PopAndDestroy( serviceUids ); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TBool CMnProviderImpl::ReadMnServiceInfoL( + RApaLsSession& aApaSession, + TUid aServiceUid, + TMnAppServiceInfo& aServiceInfo) + { + LOG1("CMnProviderImpl::ReadMnServiceInfoL appSvcUid 0x%X", aServiceUid.iUid); + + TBool found = EFalse; + + CApaAppServiceInfoArray* infoArray = aApaSession.GetAppServiceOpaqueDataLC( iUid, aServiceUid ); + if ( infoArray ) + { + TArray< TApaAppServiceInfo > array = infoArray->Array(); + for ( TInt i = 0; i < array.Count(); i++ ) + { + TPtrC8 ptr = array[i].OpaqueData(); + + if ( ptr.Size() == sizeof ( TMnAppServiceInfo ) ) + { + memcpy(&aServiceInfo, ptr.Ptr(), sizeof ( TMnAppServiceInfo ) ); + found = ETrue; + break; + } + } + } + + CleanupStack::PopAndDestroy( infoArray ); + return found; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::CheckServiceFeaturesL( + RApaLsSession& aApaSession, + CMnProvider::TService aService, + TUint32& aServiceFeatures ) + { + TMnAppServiceInfo info; + TBool found = ReadMnServiceInfoL( aApaSession, ServiceUid( aService ), info ); + if ( found && info.iServiceFeatures ) + { + aServiceFeatures = info.iServiceFeatures; + } + else + { + iServices &= ~aService; + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::ReadServiceFeaturesL( RApaLsSession& aApaSession ) + { + if ( iServices & EServiceMapView ) + { + CheckServiceFeaturesL( aApaSession, EServiceMapView, iMapViewFeatures ); + } + + if ( iServices & EServiceNavigation ) + { + CheckServiceFeaturesL( aApaSession, EServiceNavigation, iNavigationFeatures ); + } + + if ( iServices & EServiceGeocoding ) + { + CheckServiceFeaturesL( aApaSession, EServiceGeocoding, iGeocodingFeatures ); + } + + if ( iServices & EServiceMapImage ) + { + CheckServiceFeaturesL( aApaSession, EServiceMapImage, iMapImageFeatures ); + if ( !IsConverterPluginFoundL() ) + { + iServices &= ~EServiceMapImage; + iMapImageFeatures = 0; + } + } + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +#ifndef __WINS__ + +void CMnProviderImpl::ReadPackageInfoL( Swi::RSisRegistrySession& aSisSession ) + { + LOG("CMnProviderImpl::ReadPackageInfoL"); + + Swi::CSisRegistryPackage* package = aSisSession.SidToPackageL(iUid); + CleanupStack::PushL( package ); + + Swi::RSisRegistryEntry entry; + User::LeaveIfError( entry.OpenL( aSisSession, *package ) ); + CleanupClosePushL( entry ); + + // FW wants to know trust level of Provider Applications + Swi::TSisTrustStatus trust = entry.TrustStatusL(); + iIsTrusted = ( trust.ValidationStatus() >= Swi::EValidatedToAnchor ); + + // other needed info + SetVersion( entry.VersionL() ); + + HBufC* vendorName = entry.LocalizedVendorNameL(); + CleanupStack::PushL( vendorName ); + SetVendorNameL( vendorName->Des() ); + CleanupStack::PopAndDestroy( vendorName ); + + CleanupStack::PopAndDestroy( &entry ); + CleanupStack::PopAndDestroy( package ); + } + +#else + +void CMnProviderImpl::ReadPackageInfoL( Swi::RSisRegistrySession& /*aSisSession */ ) + { + LOG("CMnProviderImpl::ReadPackageInfoL"); + iIsTrusted = ETrue; + } + +#endif + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TBool CMnProviderImpl::IsTrusted() + { + return iIsTrusted; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +TBool CMnProviderImpl::IsConverterPluginFoundL() + { + TUid converterIf = { KMnMapImageConverterIf }; + + const TInt KNumUidHexDigits = 8; + TBuf8 uidText8; + + _LIT8( KUidHexText, "%08X" ); + uidText8.Format( KUidHexText, iUid ); + + TEComResolverParams resolverParams; + resolverParams.SetDataType( uidText8 ); + + RImplInfoPtrArray implementations; + CleanupStack::PushL( TCleanupItem( CleanupImplementationsArray, &implementations ) ); + + REComSession::ListImplementationsL( converterIf, resolverParams, implementations ); + TBool found = ( implementations.Count() > 0 ); + CleanupStack::PopAndDestroy(); // cleanup item + return found; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::SetNameL( const TDesC& aName ) + { + __ASSERT_DEBUG( !iName, Panic( KErrGeneral ) ); + iName = aName.AllocL(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::SetShortNameL( const TDesC& aShortName ) + { + __ASSERT_DEBUG( !iShortName, Panic( KErrGeneral ) ); + iShortName = aShortName.AllocL(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::SetVendorNameL( const TDesC& aVendorName ) + { + __ASSERT_DEBUG( !iVendorName, Panic( KErrGeneral ) ); + iVendorName = aVendorName.AllocL(); + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::SetVersion( TVersion aVersion ) + { + iVersion = aVersion; + } + +// --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// +void CMnProviderImpl::SetSupportedServices( TServices aServices ) + { + iServices = aServices; + } + +// --------------------------------------------------------------------------- +// From class CMnProvider. +// --------------------------------------------------------------------------- +// +TUint32 CMnProviderImpl::SupportedFeatures( TService aService ) const + { + switch ( aService ) + { + case EServiceMapView: + return iMapViewFeatures; + + case EServiceNavigation: + return iNavigationFeatures; + + case EServiceGeocoding: + return iGeocodingFeatures; + + case EServiceMapImage: + return iMapImageFeatures; + + default: + return 0; + } + }