locationmapnavfw/library/src/mnproviderimpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:06:48 +0200
changeset 0 667063e416a2
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* 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 <e32base.h>
#include <ecom/ecom.h>
#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <apaid.h>
#else
#include <apaid.h>
#include <apaidpartner.h>
#endif
#include <apgcli.h>
#include <swi/sisregistryentry.h>
#include <swi/sistruststatus.h>
#include <swi/sisregistrypackage.h>

#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<RImplInfoPtrArray*>( 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<KNumUidHexDigits> 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;
        }
    }