uiservicetab/vimpstengine/src/cvimpstengineservicetablefetcher.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:18 +0200
changeset 0 5e5d6b214f4f
child 14 9fdee5e1da30
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2008 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:  Handles the use of Service Provider Settings API
*
*/


// INCLUDE FILES
#include <spsettings.h>
#include <spentry.h>
#include <spproperty.h>


// Phonebook shutter
#include <apgtask.h>
#include <w32std.h>
#include <Pbk2UID.h>
#include <apgcli.h>
#include <apaid.h>

#include "cvimpstengineservicetablefetcher.h"
#include "cvimpstenginecchhandler.h"

#include "vimpstextentionuiuid.h"
#include "tvimpstconsts.h"
#include "mvimpstenginefactory.h"
#include "cvimpstenginefactory.h"
#include "mvimpststorageserviceview.h"
#include "cvimpststoragemanagerfactory.h"
#include "vimpstdebugtrace.h"



// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::CVIMPSTEngineServiceTableFetcher()
// ---------------------------------------------------------------------------
//
CVIMPSTEngineServiceTableFetcher::CVIMPSTEngineServiceTableFetcher()
    {
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::ConstructL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::ConstructL()
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::ConstructL start"));
    iSettings = CSPSettings::NewL();
    CompressViewIdsL();
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::ConstructL end"));
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::NewL()
// ---------------------------------------------------------------------------
//
CVIMPSTEngineServiceTableFetcher* 
    CVIMPSTEngineServiceTableFetcher::NewL( )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::NewL start"));
    
    CVIMPSTEngineServiceTableFetcher* self = NewLC();
    CleanupStack::Pop(self);
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::NewL end"));
    return self;
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::NewLC()
// ---------------------------------------------------------------------------
//
CVIMPSTEngineServiceTableFetcher* 
    CVIMPSTEngineServiceTableFetcher::NewLC()
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::NewLC start"));
    
    CVIMPSTEngineServiceTableFetcher* self =
        new (ELeave) CVIMPSTEngineServiceTableFetcher( );
    CleanupStack::PushL(self);
    self->ConstructL();
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::NewLC end"));
    return self;
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::
//      ~CVIMPSTEngineServiceTableFetcher()
// ---------------------------------------------------------------------------
//
CVIMPSTEngineServiceTableFetcher::~CVIMPSTEngineServiceTableFetcher()
    {
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::~CVIMPSTEngineServiceTableFetcher start"));   
    
    delete iSettings;	
    iSettings = NULL;
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::~CVIMPSTEngineServiceTableFetcher end"));    
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::GetMasterServiceIdsL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::GetMasterServiceIdsL( 
    RArray<TUint32>& aServiceIds )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::GetMasterServiceIdsL start"));
    
    RArray<TServiceId> services;
    CleanupClosePushL( services );
    iSettings->FindServiceIdsL( services );
	
	const TInt serviceCount = services.Count();
    for ( TInt i( 0 ); i < serviceCount; i++ )
        {
        TUint32 refContactUid = ContactViewUidL( services[i] );
        
        if ( TUid::Uid( refContactUid ) == 
             TUid::Uid( KIMCONTACTSEXTNIMPLEMENTATIONUID ) 
             || TUid::Uid( refContactUid ) == 
             TUid::Uid( 0x20007B6D ) )
            {
            TRACE( T_LIT("GetMasterServiceIdsL() found serviceid: (%d)"), services[ i ] );

            aServiceIds.Append( services[ i ] );                

            TRACE( T_LIT("GetMasterServiceIdsL() - service append ok") );                

            }
        }
    CleanupStack::PopAndDestroy( &services );
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::GetMasterServiceIdsL end"));  
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::GetContactStoreIdL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::GetContactStoreIdL( 
    TUint32 aServiceId, TDes& aContactStoreId )
    {
    TRACE( T_LIT( 
       "CVIMPSTEngineServiceTableFetcher::GetContactStoreIdL start")); 
    
    TRACE( T_LIT("GetContactStoreIdL() ServiceId: %d"), aServiceId );
        
    CSPProperty* property = CSPProperty::NewLC();
    TInt err = iSettings->FindPropertyL( aServiceId,
                                EPropertyContactStoreId,      
                                *property );    
	if (KErrNone == err)
		{	
	    err = property->GetValue( aContactStoreId );
	    
		}

    CleanupStack::PopAndDestroy( property );
    
    TRACE( T_LIT("GetContactStoreIdL() - StoreId: %S"), &aContactStoreId );                
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::GetContactStoreIdL end"));  
 	
    }   

    

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::GetBrandIdL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::GetBrandIdL( 
    TUint32 aServiceId, TDes8& aBrandId )
    {
    TRACE( T_LIT( "CVIMPSTEngineServiceTableFetcher::GetBrandIdL start"));
    
    TRACE( T_LIT("GetBrandIdL() ServiceId: %d"), aServiceId );
       
    HBufC* ret = HBufC::NewLC( KVIMPSTUISPSMaxPropertyLength );    
    TPtr retPtr( ret->Des() );
    
    CSPProperty* property = CSPProperty::NewLC();
    TInt err = iSettings->FindPropertyL( aServiceId,
                                EPropertyBrandId,
                                *property );    
    if ( KErrNone == err )
        {
        err = property->GetValue( retPtr );
        if ( KErrNone == err )
	        {
	        aBrandId.Copy( retPtr );
	        }
        }
    CleanupStack::PopAndDestroy( property );        
    CleanupStack::PopAndDestroy( ret );        
    
    TRACE( T_LIT("GetBrandIdL() - BrandId: %S"), &aBrandId ); 
    
    TRACE( T_LIT( "CVIMPSTEngineServiceTableFetcher::GetBrandIdL end"));
    }    


// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::FindPropertyL()
// ---------------------------------------------------------------------------
//
TInt CVIMPSTEngineServiceTableFetcher::FindPropertyL( TUint32 aServiceId,
	                                TServicePropertyName aPropertyName )
	{
	TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::FindPropertyL start"));
    
    TRACE( T_LIT("FindPropertyL- ServiceId: %d Property: %d"), 
    								aServiceId, aPropertyName ); 
       
	CSPProperty* property = CSPProperty::NewLC();
    TInt result = iSettings->FindPropertyL( aServiceId,
                                aPropertyName,
                                *property );		
	CleanupStack::PopAndDestroy( property );
	
	TRACE( T_LIT("FindPropertyL- Result: %d"), result );
    								
	TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::FindPropertyL end"));
       
	return result;
	}




// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::PropertyBrandVersionL()
// ---------------------------------------------------------------------------
//
TInt CVIMPSTEngineServiceTableFetcher::PropertyBrandVersionL( 
    TUint32 aServiceId ) 
    {
    TRACE( T_LIT( "CVIMPSTEngineServiceTableFetcher::PropertyBrandVersionL start"));
    
    TRACE( T_LIT("PropertyBrandVersionL() ServiceId: %d"), aServiceId );
       
    TInt brandVersion = KErrNotFound; // default value
    CSPProperty* property = CSPProperty::NewLC();
    TInt err = iSettings->FindPropertyL( aServiceId,
                                EPropertyBrandVersion,
                                *property );    
    if ( KErrNone == err )
        {
        err = property->GetValue( brandVersion );
        }
        
    CleanupStack::PopAndDestroy( property );
    
    TRACE( T_LIT("PropertyBrandVersionL - version: %d"), brandVersion );  
    
    TRACE( T_LIT( "CVIMPSTEngineServiceTableFetcher::PropertyBrandVersionL end"));
    return brandVersion;
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::PropertyBrandLanguageL()
// ---------------------------------------------------------------------------
//
TLanguage CVIMPSTEngineServiceTableFetcher::PropertyBrandLanguageL( 
    TUint32 aServiceId ) 
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::PropertyBrandLanguageL start"));
    
    TRACE( T_LIT("PropertyBrandLanguageL() ServiceId: %d"), aServiceId );
    
    // ELangInternationalEnglish is selected as Default Brand Language Id.
    TInt brandLanguage = ELangInternationalEnglish;    
    CSPProperty* property = CSPProperty::NewLC();
    TInt err = iSettings->FindPropertyL( aServiceId,
                                EPropertyBrandLanguage,
                                *property );    
    if ( KErrNone == err )
        {
        err = property->GetValue( brandLanguage );
        }
    CleanupStack::PopAndDestroy( property );

    TRACE( T_LIT("PropertyBrandVersionL - brandLanguage: (%d) "), brandLanguage );  
	
	TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::PropertyBrandLanguageL end"));
       
    return ((TLanguage) (brandLanguage) );
    }


// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::ContactViewUidL()
// ---------------------------------------------------------------------------
//
TUint32 CVIMPSTEngineServiceTableFetcher::ContactViewUidL( 
    TUint32 aServiceId )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::ContactViewUidL start"));
    
    TRACE( T_LIT("ContactViewUidL() ServiceId: %d"), aServiceId );
        
    TInt contactViewUid = KErrNotFound;
    CSPProperty* property = CSPProperty::NewLC();
    TInt err = iSettings->FindPropertyL( aServiceId,
                                EPropertyContactViewPluginId,
                                *property );    
    if ( KErrNone == err )
        {
        property->GetValue( contactViewUid );
        }
    CleanupStack::PopAndDestroy( property );      
          
    TRACE( T_LIT("ContactViewUid: %d"), contactViewUid );    
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::GetContactStoreIdL end"));
       
    return contactViewUid;
    }    

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::GetServiceNameL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::GetServiceNameL( 
    TUint32 aServiceId, TDes& aServiceName )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::GetServiceNameL start"));    
    
    TRACE( T_LIT("GetServiceNameL() ServiceId: %d"), aServiceId );
    
    CSPEntry* entry = CSPEntry::NewLC();
    TInt err = iSettings->FindEntryL( aServiceId, *entry ) ;
    if ( !err )
        {
        aServiceName = entry->GetServiceName();
        }
    
    CleanupStack::PopAndDestroy( entry );    
    
    TRACE( T_LIT("GetServiceNameL() ServiceName: %S"), &aServiceName );
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::GetServiceNameL end"));
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::DoHandleNotifyChangeL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::DoHandleNotifyChangeL(
    		TServiceId aServiceId, TBool aNewService, MVIMPSTEngine* aEngine )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::DoHandleNotifyChangeL start"));  
    TRACE( T_LIT("DoHandleNotifyChange() ServiceId:%d"), aServiceId );
    TBool serviceFound( EFalse ); 
    if(!aNewService)
        {
        RArray<TUint32> serviceIdArray;
        CleanupClosePushL( serviceIdArray ); 
        RArray<TServiceId> services;
        CleanupClosePushL( services );    
        GetMasterServiceIdsL(serviceIdArray);
        iSettings->FindServiceIdsL(services );
        const TInt serviceCount = services.Count();
        for ( TInt index = 0 ; index < serviceCount ; index++ )
            {
            if ( services[index] == aServiceId )
                {
                TRACE( T_LIT("DoHandleNotifyChange() - Service (%d) found"), aServiceId );
                serviceFound = ETrue;
                }
            }
        CleanupStack::PopAndDestroy( &services );
        CleanupStack::PopAndDestroy( &serviceIdArray ); 
        }
    if ( aNewService || !serviceFound )  // new service or MECO service not found
        {
        // check if any other services other then MECO exists before
        // shutting down the phonebook. there can be services which does't use
        // MECO UI ( example OVI - does't use MECO UI it uses own UI )
        // check with the property EPropertyContactViewPluginId in the service 
        // this will the meco UID in case of MECO Service.
        //this is a temperory hack as phonebook doesnot refresh once we delete or add any service
        //once phonebook gives a permanant fix ,remove the below code
        if(( TUid::Uid(ContactViewUidL( aServiceId )) == TUid::Uid( KIMCONTACTSEXTNIMPLEMENTATIONUID )) || aEngine ) 
            {                                                               // only MecoServicetabs shutdown phonebook.
            TRACE( T_LIT("DoHandleNotifyChange() - removing service") );    //or while deleting service from settings
            CompressViewIdsL();                                             //check whether engine exists,which is true for only MecoServicetabs.
            if(aEngine)
                {
                aEngine->DeleteDataBaseL();
                }
            ShutDownPhonebookL();
            }
        TRACE( T_LIT("DoHandleNotifyChange() - service removed") );
        }
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::DoHandleNotifyChangeL end"));    

    }
// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::CompressViewIdsL()
// ---------------------------------------------------------------------------
//
TBool CVIMPSTEngineServiceTableFetcher::CompressViewIdsL( 
    TServiceId aServiceId )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::CompressViewIdsL start"));       
    TRACE( T_LIT("CompressViewIdsL() ServiceId: %d"), aServiceId );
    
    TBool ret = EFalse;
    // Compress view id's in service table
    RArray<TServiceId> services;
    CleanupClosePushL( services );
    iSettings->FindServiceIdsL( services );
    TUint32 serviceId = 0;
    const TInt serviceCount = services.Count();
    for ( TInt i( 0 ); i < serviceCount; i++ )
        {
        serviceId = services[i];
        TUint32 refContactUid = ContactViewUidL( serviceId );
        if ( TUid::Uid( refContactUid ) == 
        TUid::Uid( KIMCONTACTSEXTNIMPLEMENTATIONUID ) )
            {

            TRACE( T_LIT("  -> compressing view ids, service: %d"), serviceId );
            TRACE( T_LIT("  -> compressing view ids, view id: (%d)"), ( KVIMPSTTabbedViewIdBase+ serviceId ) );

            WriteTabViewIdToServiceTableL( services[ i ], ( KVIMPSTTabbedViewIdBase + serviceId ) );
        
            ret = ETrue;
            }
        }
    CleanupStack::PopAndDestroy( &services );
    
    TRACE( T_LIT("CompressViewIdsL returns: (%d)"), ret );     
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::CompressViewIdsL end"));    
    
    return ret;
    }


// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::WriteTabViewIdToServiceTableL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::WriteTabViewIdToServiceTableL( 
    TUint32 aServiceId, TUint aViewId ) 
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::WriteTabViewIdToServiceTableL start"));   
    TRACE( T_LIT("WriteTabViewIdToServiceTableL() aServiceId: %d, aViewId: %d "), 
    										aServiceId, aViewId );
    
    // Write specific view id to service table
    // No need to check for error beacuse 
    // we need to add/update the property

    
    CSPProperty* property = CSPProperty::NewLC();
    iSettings->FindPropertyL( aServiceId,
                                EPropertyContactViewId,
                                *property );    
    
    TRACE( T_LIT( 
       "WriteTabViewIdToServiceTableL() - OK"));
    
    TInt err = property->SetName( EPropertyContactViewId );
    
     TRACE( T_LIT( 
       "WriteTabViewIdToServiceTableL ERR1=%d"), err );
    
    TInt err2 = property->SetValue( aViewId );
    
    if ( !err && !err2 )
        {
        iSettings->AddOrUpdatePropertyL( aServiceId, *property );
        }
    
    TRACE( T_LIT( 
       "WriteTabViewIdToServiceTableL ERR2=%d"), err2 );
        
    
    CleanupStack::PopAndDestroy( property );  
                   
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::WriteTabViewIdToServiceTableL end") );
    }

// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::ShutDownPhonebookL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::ShutDownPhonebookL()
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::ShutDownPhonebookL start"));   
    
    // Kills phonebook if running
    RWsSession ws;
    User::LeaveIfError( ws.Connect() );
    CleanupClosePushL( ws );
    TApaTaskList list( ws );
    TUid uid = { KPbk2UID3 };
    TApaTask task( list.FindApp( uid ) );
    if ( task.Exists() )
        {
        task.EndTask();
        }
    CleanupStack::PopAndDestroy( &ws ); // ws
    
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::ShutDownPhonebookL end"));
    }
    
// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::XimpAdapterUidL()
// ---------------------------------------------------------------------------
//
TInt CVIMPSTEngineServiceTableFetcher::XimpAdapterUidL( 
    TUint32 aServiceId )
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::XimpAdapterUidL start"));   
    
    TRACE( T_LIT("XimpAdapterUidL() ServiceId: %d"), aServiceId );
    										
    TInt ret = KErrNotFound;
    CSPProperty* property = CSPProperty::NewLC();
    
    TInt err = iSettings->FindPropertyL( aServiceId,
                                EPropertyPCSPluginId,
                                *property );    
    if (KErrNone == err)
	    {
	    property->GetValue( ret );
	    }
    
    CleanupStack::PopAndDestroy( property );
    
    TRACE( T_LIT("XimpAdapterUidL() XimpAdapterUid: %d "), 
    										ret );
    										
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::XimpAdapterUidL end"));   
    return ret;
    }        
    
// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::PresenceRequestStatusL()
// ---------------------------------------------------------------------------
//
TVIMPSTEnums::TVIMPSTPresenceRequestStatus 
CVIMPSTEngineServiceTableFetcher::PresenceRequestStatusL( 
        TUint32 aServiceId )    
    {
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::PresenceRequestStatusL  start")); 
    
    TRACE( T_LIT("PresenceRequestStatusL() ServiceId: %d"), aServiceId );
    
    TVIMPSTEnums::TVIMPSTPresenceRequestStatus ret = 
    			TVIMPSTEnums::ESVCEPresenceRequestStatusUnKnown;
            
    CSPProperty* property = CSPProperty::NewLC();
    
    TInt err = iSettings->FindPropertyL( aServiceId,
           ESubPropertyPresenceRequestPreference,
                                *property );    
    if ( KErrNone == err )
        {
        TOnOff value = EOff;        
        err = property->GetValue( value );
        if ( !err )
            {
            if ( EOn == value )
                {
                ret = TVIMPSTEnums::ESVCEPresenceRequestStatusAutoAccept;
                }
			else
				{
				ret = TVIMPSTEnums::ESVCEPresenceRequestStatusAlwaysAsk;
				}                
            }
        }
    
    CleanupStack::PopAndDestroy( property );
    
    TRACE( T_LIT("PresenceRequestStatusL() PresenceRequestStatus: %d "), 
    										ret );
    										
    TRACE( T_LIT("CVIMPSTEngineServiceTableFetcher::PresenceRequestStatusL end"));   
    return ret;        
    }
  
// ---------------------------------------------------------------------------
// CVIMPSTEngineServiceTableFetcher::GetDefaultDomainNameL()
// ---------------------------------------------------------------------------
//
void CVIMPSTEngineServiceTableFetcher::GetDefaultDomainNameL( 
    TUint32 aServiceId, TDes& aDefaultDomainName )
    {
    TRACE( T_LIT( 
       "CVIMPSTEngineServiceTableFetcher::GetDefaultDomainNameL start")); 
    
    TRACE( T_LIT("GetContactStoreIdL() ServiceId: %d"), aServiceId );
        
    CSPProperty* property = CSPProperty::NewLC();
    TInt err = iSettings->FindPropertyL( aServiceId,
                                ESubPropertyPresenceAddrScheme,      
                                *property );    
	if (KErrNone == err)
		{	
	    property->GetValue( aDefaultDomainName );	    
		}

    CleanupStack::PopAndDestroy( property );
    
    TRACE( T_LIT("GetContactStoreIdL() - StoreId: %S"), &aDefaultDomainName );                
    
    TRACE( T_LIT( 
       "CVIMPSTEngineServiceTableFetcher::GetDefaultDomainNameL end"));  
 	
    } 

   
// End of file