imstutils/xmppadapter/src/xmppadapter.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:18 +0200
changeset 0 5e5d6b214f4f
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 XMPPAdapter settings in OMA provisioning.
*
*/


// INCLUDE FILES
#include    <f32file.h>
#include    <CWPCharacteristic.h>
#include    <CWPParameter.h>
#include    <pdpcontextmanagerinternalcrkeys.h>
#include    <centralrepository.h>

#include    "imconnectionprovideruids.hrh"

#include    "WPAdapterUtil.h"
#include    "xmppadapter.h"

#include "xmppservicesettingsapi.h"
#include "xmppparams.h"

#include <spentry.h>
#include <spsettings.h>
#include <spproperty.h>
#include <spdefinitions.h>
#include <cvimpstsettingsstore.h> // application specific settings writer

#include "xmppadapterlogger.h"
#include <e32base.h>
#include <StringLoader.h>
#include <wpgeneralxmppsettingsadapter.rsg>
#include <bautils.h>
#include <f32file.h>
#include <WPAdapterUtil.h> // Adapter utils
#include <barsc.h>
// CONSTANTS
_LIT( KMecoImAppID,       "wXMPP" );  
//_LIT( KXMPPProtocol,       "APROTOCOL" );   
//_LIT( KXMPPServerAddr,       "AADDR" );  
_LIT(KSsl,"SSL");
_LIT(KPortNbr, "APORTNBR"); 
_LIT(KBrandId, "BRANDID");
const TInt KGranularity = 4;

_LIT( KResorcePathFolder, "\\resource\\");
_LIT( KResorcePathFile, "WPGeneralXMPPSettingsAdapter.rsc");


// ======== LOCAL FUNCTIONS ========

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

// -----------------------------------------------------------------------------
// CXMPPAdapter::CXMPPAdapter
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CXMPPAdapter::CXMPPAdapter() : iIsAppIdOk(EFalse)
    {
    LOGGER ( TXT ( "CXMPPAdapter::CXMPPAdapter() Start" ) );
    LOGGER ( TXT ( "CXMPPAdapter::CXMPPAdapter() Start" ) );

    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::ConstructL()
    {
    LOGGER ( TXT ( "CXMPPAdapter::ConstructL() Start" ) );
    iSnapId = 11;
    iAppref = NULL;
    iAppName = NULL;
    RFs fs;
    
    TFileName resFilePath;
    resFilePath.Zero();
    resFilePath.Append( KResorcePathFolder() );
    resFilePath.Append( KResorcePathFile() );

    LOGGER ( TXT ( "CXMPPAdapter::ConstructL() End1" ) );
    TFileName path;
    Dll::FileName( path );
    
    User::LeaveIfError( fs.Connect() );
   
    TDriveName drive( TParsePtrC( path ).Drive() );
    
    HBufC* resourceFilePath = HBufC::NewLC( KMaxFileName );
    TPtr ptr( resourceFilePath->Des() );
    
    
    ptr.Append( resFilePath );
    ptr.Insert( 0, drive );
    
    path.Zero();
    path.Append( *resourceFilePath );

    
    BaflUtils::NearestLanguageFile( fs, path );
    iResFile.OpenL( fs, path );
    //To decide on whether default name is needed or not
    iDefaultName = ReadResourceL( R_QTN_IPCOMM_MSG_TEXT );
    iTitle = ReadResourceL( R_QTN_IPCOMM_MSG_TITLE );
    
    CleanupStack::PopAndDestroy(); //resourceFilePath
    iResFile.Close();
    
    LOGGER ( TXT ( "CXMPPAdapter::ConstructL() End" ) );

    
    fs.Close();
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CXMPPAdapter* CXMPPAdapter::NewL()
    {
    LOGGER ( TXT ( "CXMPPAdapter::NewL() Start" ) );
    CXMPPAdapter* self = new( ELeave ) CXMPPAdapter;
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    LOGGER ( TXT ( "CXMPPAdapter::NewL() End" ) );
    return self;
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::~CXMPPAdapter
// Destructor
// -----------------------------------------------------------------------------
//
CXMPPAdapter::~CXMPPAdapter()
    { 
    LOGGER ( TXT ( "CXMPPAdapter::~CXMPPAdapter Start" ) );   
    delete iUserName;
    delete iPassword;
    delete iProviderId;
    delete iXmppServerAddress;
    delete iProtocol;
    delete iAppId;
    delete iDomainName;
    delete iBrandId;
    delete iAppref;
    
    if ( iAppName )
    delete iAppName;
    
    delete iDefaultName;
    delete iTitle;
    LOGGER ( TXT ( "CXMPPAdapter::~CXMPPAdapter End" ) );      
    }
// -----------------------------------------------------------------------------
// CXMPPAdapter::ReadResourceLC Reads the resource without having to use a CCoeEnv
// -----------------------------------------------------------------------------
//
HBufC* CXMPPAdapter::ReadResourceL( TInt aId )
    {
    LOGGER ( TXT ( "CXMPPAdapter::ReadResourceL() " ) );
    iResFile.ConfirmSignatureL( aId );
    HBufC8* readBuffer = iResFile.AllocReadLC( aId );
    TResourceReader theReader;
    theReader.SetBuffer( readBuffer );
    TPtrC textData = theReader.ReadTPtrC();
    
    HBufC* textBuffer = HBufC::NewL( textData.Length() );
    *textBuffer = textData;
    
    CleanupStack::PopAndDestroy( readBuffer );
    LOGGER ( TXT ( "CXMPPAdapter::ReadResourceL() " ) );
    return textBuffer;

    }
// -----------------------------------------------------------------------------
// CXMPPAdapter::ItemCount
// -----------------------------------------------------------------------------
//
TInt CXMPPAdapter::ItemCount() const
    {
    LOGGER ( TXT ( "CXMPPAdapter::ItemCount() " ) );
    // SummaryTitle(), SummaryText(), SaveL(), SetAsDefaultL() and
    // CanSetAsDefault() are called ItemCount() times
    return (iUserName && iPassword && iProviderId && iXmppServerAddress && iDomainName && iProtocol) ? 1 : 0;
    }


// -----------------------------------------------------------------------------
// CXMPPAdapter::DetailsL
// -----------------------------------------------------------------------------
//
TInt CXMPPAdapter::DetailsL( TInt /*aItem*/, MWPPairVisitor& /*aVisitor*/ )
    {
    LOGGER ( TXT ( "CXMPPAdapter::DetailsL() " ) );
    // Detail view is a feature for later release.
    return KErrNotSupported;
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::SaveL
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::SaveL( TInt /*aItem*/ )
    {
    LOGGER ( TXT ( "CXMPPAdapter::CanSetAsDefault() Start" ) );
    
    __ASSERT_DEBUG( (iUserName && iPassword && iProviderId  && iXmppServerAddress && iDomainName && iProtocol), User::Leave( KErrCorrupt ) );

	CreateSettingsRecordL();   
    LOGGER ( TXT ( "CXMPPAdapter::CanSetAsDefault() End" ) );
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::CanSetAsDefault
// -----------------------------------------------------------------------------
//
TBool CXMPPAdapter::CanSetAsDefault( TInt /*aItem*/ ) const
    {
    LOGGER ( TXT ( "CXMPPAdapter::CanSetAsDefault() t" ) );
    return EFalse;
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::SetAsDefault
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::SetAsDefaultL( TInt /*aItem*/ )
    {
    LOGGER ( TXT ( "CXMPPAdapter::SetAsDefaultL () Start" ) );
    // This shouldn't be called because CanSetAsDefault
    // always returns EFalse.
    LOGGER ( TXT ( "CXMPPAdapter::SetAsDefaultL() End" ) );
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::VisitL
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::VisitL( CWPCharacteristic& aCharacteristic )
    {
    LOGGER ( TXT ( "CXMPPAdapter::VisitL( CWPCharacteristic& aCharacteristic ) Start" ) );
    switch( aCharacteristic.Type() )
        {
        case KWPApplication:
            {
            
            aCharacteristic.AcceptL( *this );
            iIsAppIdOk = ETrue;
            break;            
            }
        case KWPResource:
        	{
        	if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{	       
	        	aCharacteristic.AcceptL( *this );
	        	}            
	        break;            	
        	}
        case KWPAppAddr:
            {
            
            if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{
	        	aCharacteristic.AcceptL( *this );
	        	}
            break;            
            }
        default:
        	{
            break;
        	}
        }
    LOGGER ( TXT ( "CXMPPAdapter::VisitL( CWPCharacteristic& aCharacteristic ) End" ) );
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::VisitL
//
//   Used to parse, the following always-on related provisioning settings
//
//   <characteristic type="VENDORCONFIG">
//          <parm name="NAME" value="MRBLOBBY"/>
//          <parm name="AWON-PDPC" value="11"/>
//          <parm name="T-RETRY" value="100"/>
//      </characteristic>
//   </characteristic>
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::VisitL( CWPParameter& aParameter )
    {
    LOGGER ( TXT ( "CXMPPAdapter::VisitL( CWPParameter& aParameter ) Start" ) );
    switch( aParameter.ID() )
        {
        case EWPNamedParameter:
        	{
        	if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{
	        	if(aParameter.Name().Compare(KSsl) == 0)
	        		{
	        	    ParseIntegerL(aParameter.Value(),iSSL);
	        		}
	        	if(aParameter.Name().Compare(KPortNbr) == 0)
	        		{
	        		ParseIntegerL(aParameter.Value(),iPortNbr);
	        		}
	        	if(aParameter.Name().Compare(KBrandId) == 0)
	        	    {
	        	    if (iBrandId)
	                    {
	                    delete iBrandId;
	                    iBrandId = NULL;  
	                    }
	        	    iBrandId = aParameter.Value().AllocL();
	        	    }
	        	}
            break;
        	}
        case EWPParameterName:  
        	{
        	if ( iAppName )
        	    {
        	    delete iAppName;
        	    iAppName = NULL;
        	    }
        	iAppName = aParameter.Value().AllocL();
	         break; 
        	}          
           
        case EWPParameterAppID:
            {
        	if (iAppId)
	        	{
	        	delete iAppId;
	        	iAppId = NULL;	
	        	}
	        iAppId = aParameter.Value().AllocL();
            iAppIdPtr.Set(iAppId->Des());
            break;
            }    
        
        case EWPParameterAProtocol:
        	{
        	if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{
         		if (iProtocol)
		        	{
		        	delete iProtocol;
		        	iProtocol = NULL;	
		        	}
        		iProtocol = aParameter.Value().AllocL();
	        	}
        	break;	
        	}
        case EWPParameterAddr:
        	{
        	if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{
        		if (iXmppServerAddress)
		        	{
		        	delete iXmppServerAddress;
		        	iXmppServerAddress = NULL;	
		        	}
        		iXmppServerAddress = aParameter.Value().AllocL();
	        	}
        	break;	
        	}
        case EWPParameterAAuthName:
        	{
        	if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{     		
	        	
	        	if (iUserName)
		        	{
		        	delete iUserName;
		        	iUserName = NULL;	
		        	}
	        	iUserName = aParameter.Value().AllocL();
	        	}
        	break;	
        	}
        case EWPParameterAAuthSecret:
        	{
        	if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
	        	{       	
				if (iPassword)
					{
					delete iPassword;
					iPassword = NULL;	
					}

	        	iPassword = aParameter.Value().AllocL();
	        	}
        	break;	
        	}
        
        case EWPParameterProviderID:
        	{
			if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
				{
	        	if (iProviderId)
					{
					delete iProviderId;
					iProviderId = NULL;	
					}

	        	iProviderId = aParameter.Value().AllocL();
				}
        	break;	
        	}
        case EWPParameterDomain :
            {
            if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
            {           
            if (iDomainName)
                {
                delete iDomainName;
                iDomainName = NULL;   
                }
        
            iDomainName = aParameter.Value().AllocL();
            }
            break;  
            }
        case EWPParameterAppRef:
        		{
				if ( 0 == iAppIdPtr.Compare( KMecoImAppID() ) )
					{
		        	if (iAppref)
						{
						delete iAppref;
						iAppref = NULL;	
						}
		        	iAppref= aParameter.Value().AllocL();
					}
				break;	
			      }
        default:
            break;
        }
    LOGGER ( TXT ( "CXMPPAdapter::VisitL( CWPParameter& aParameter ) End" ) );
    }


// ---------------------------------------------------------------------------
// From class CWPAdapter.
// CWPGeneralVoIPSettingsAdapter::SummaryTitle
// Returns the summary title of general XMPP settings item.
// ---------------------------------------------------------------------------
//
const TDesC16& CXMPPAdapter::SummaryTitle( 
    TInt /*aIndex*/ ) const
    {
    LOGGER ( TXT ( "CXMPPAdapter::SummaryText() " ) );
    if ( iIsAppIdOk )
        {
        LOGGER ( TXT ( "returning CXMPPAdapter::SummaryText() " ) );
        //LOGGER ( TXT ( "CXMPPAdapter::ConstructL() Title in SummaryText is %s" ), *iTitle );
        return *iTitle;
        }
    return KNullDesC16;
    }

// ---------------------------------------------------------------------------
// CWPGeneralVoIPSettingsAdapter::SummaryText
// From class CWPAdapter.
// Returns the summary text of general XMPP settings.
// ---------------------------------------------------------------------------
//
const TDesC16& CXMPPAdapter::SummaryText( 
    TInt /*aIndex*/ ) const
    {
    LOGGER ( TXT ( "CXMPPAdapter::SummaryText() " ) );
    if ( iIsAppIdOk )
        {
        LOGGER ( TXT ( " returnign CXMPPAdapter::SummaryText() " ) );
        if ( NULL == iAppName )
            {
            return *iDefaultName;
            }
        return *iAppName;
        }
    LOGGER ( TXT ( "CXMPPAdapter::SummaryText() " ) );
    return KNullDesC16;
    }


// -----------------------------------------------------------------------------
// CXMPPAdapter::VisitLinkL
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::VisitLinkL( CWPCharacteristic& /*aCharacteristic*/ )
    {
    LOGGER ( TXT ( "CXMPPAdapter::VisitLinkL() " ) );
    }

// -----------------------------------------------------------------------------
// CXMPPAdapter::ParseIntegerL
// -----------------------------------------------------------------------------
//
void CXMPPAdapter::ParseIntegerL( const TDesC& aPtr, TInt& aInt )
    {
    LOGGER ( TXT ( "CXMPPAdapter::ParseIntegerL " ) );
    TLex lex( aPtr );
    User::LeaveIfError( lex.Val( aInt ) );
    }
// -----------------------------------------------------------------------------
// CXMPPAdapter::CheckforXmppserviceL
// This function will check for the IM Subservice in sp settings table
// if it exists in any of the service it will return ETrue else it will return EFalse
// -----------------------------------------------------------------------------
//
TBool CXMPPAdapter::CheckforXmppserviceL()
    {
    // get the existing services from sp settings table
    CSPSettings* serviceSettings = CSPSettings::NewLC(); 
    RIdArray serviceIds;
    User::LeaveIfError( serviceSettings->FindServiceIdsL( serviceIds ) );
    TBool xmppexists = EFalse;
    TInt servicecount = serviceIds.Count();
    for ( TInt i( 0 ); i < servicecount; i++ )
        {
        CSPProperty* property = CSPProperty::NewLC();
        TInt err = serviceSettings->FindPropertyL( serviceIds[ i ],EPropertyIMSubServicePluginId,
                *property );
        CleanupStack::PopAndDestroy( property ); 
        if(!err)
            {
            xmppexists = ETrue;
            break; // just to break the loop
            }
        } 
    CleanupStack::PopAndDestroy( serviceSettings ); 
    return xmppexists;

    }
//------------------------------------------------------------------------
//CXMPPAdapter::::CreateSettingsRecordL()
//------------------------------------------------------------------------
void CXMPPAdapter::CreateSettingsRecordL()
    {
    LOGGER ( TXT ( "CXMPPAdapter::CreateSettingsRecordL() Start" ) );
    CXmppSettingsApi* sapi = CXmppSettingsApi::NewLC();
    iSettingsRecordId=0;
    TRAPD(err,sapi->DefaultSettingsRecordL(iSettingsRecordId));
    if( err == KErrNone && iSettingsRecordId > 0)
        {
        if(CheckforXmppserviceL())
            {
            CleanupStack::PopAndDestroy( sapi );
            User::Leave(KErrNotSupported);
            }
        } 
    sapi->CreateSettingsRecordL( iSettingsRecordId );
    
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamServerPort(),/*5223 443*/ iPortNbr); 
    
    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamHttpsProxyServerPort(),8080 );

    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamSnapId(),5 );
    
    sapi->SetParamL( iSettingsRecordId, XmppParams:: KXmppParamXmppServerAddress(),
                                              *iXmppServerAddress );
                                                                                        
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamUsername(),*iUserName );
    
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamPassword(),*iPassword );
    
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamResource(),
                                              _L("gtalk_resource") );

    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamHttpsProxyServerAddress(),
                                              _L("172.16.42.135") );

    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamAlais(), _L("") );

    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamOldSSLRequired(),/*ETrue  EFalse */ iSSL );
    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamRegisterRequired(),EFalse );
                                              
    sapi->SetParamL( iSettingsRecordId,
                                  XmppParams::KXmppParamConnMgrBus(),
                    _L("org.freedesktop.Telepathy.ConnectionManager.gabble" ) );
                          		  
    sapi->SetParamL( iSettingsRecordId,
								  XmppParams::KXmppParamConnMgrPath(),
					_L("/org/freedesktop/Telepathy/ConnectionManager/gabble" ) );
								  
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamProtocol(),*iProtocol );
    
    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamPresenceStatusFreeTextOnline(),
                                              _L("") );

    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamPresenceStatusFreeTextAway(),
                                              _L(""));

    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamPresenceStatusFreeTextBusy(),
                                              _L(""));                                              

    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamPresenceStatusFreeTextOffline(),
                                              _L(""));  
    
    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamPresenceStatusFreeTextInvisible(),
                                              _L(""));  
    
    sapi->SetParamL( iSettingsRecordId, XmppParams::KXmppParamLastLoggedInUserName(),
                                                  _L(""));    

    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamPresenceStatus(),0 );
                                              
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamAutoAcceptBuddyReq(),EFalse );
    
    sapi->SetParamL( iSettingsRecordId,XmppParams::KXmppParamDomain(),*iDomainName );
    UpdateServiceSettingsL();                                          

    WriteAppSettingsL();
    CleanupStack::PopAndDestroy( sapi );
    LOGGER ( TXT ( "CXMPPAdapter::CreateSettingsRecordL() End" ) );
    }
    
// ---------------------------------------------------------------------------
//CXMPPAdapter::UpdateServiceSettingsL
// ---------------------------------------------------------------------------
//
void CXMPPAdapter::UpdateServiceSettingsL()
    {
    LOGGER ( TXT ( "CXMPPAdapter::UpdateServiceSettingsL() Start" ) );
    CSPSettings* serviceSettings = CSPSettings::NewLC();   
    RIdArray serviceIds;

    User::LeaveIfError( serviceSettings->FindServiceIdsL( serviceIds ) );
    
    

    if( serviceIds.Count() )
        {
        CDesCArrayFlat* serviceNames = new( ELeave ) CDesCArrayFlat( KGranularity );
        CleanupStack::PushL( serviceNames );

        User::LeaveIfError( serviceSettings->FindServiceNamesL( serviceIds,
                                                                *serviceNames) );

        for ( TInt i=0; i < serviceNames->MdcaCount(); i++ )
            {
            if ( ( serviceNames->MdcaPoint(i)).Compare( *iProviderId )  == 0 )
                {
                
                iServiceProviderId = serviceIds[i];
                break;
                }
            }
        CleanupStack::PopAndDestroy( serviceNames );
        }
    
    if ( 0 >= iServiceProviderId )
        {
        
        CSPEntry* entry = CSPEntry::NewLC();
        entry->SetServiceName( *iProviderId );
        TInt entryRetvalue = serviceSettings->AddEntryL( *entry );
        User::LeaveIfError( entryRetvalue );
        iServiceProviderId = entry->GetServiceId();
        CleanupStack::PopAndDestroy( entry );
        }
	      

    // Add/Update properties
    CSPProperty* property = CSPProperty::NewLC(); 
    
    
    property->SetName( ESubPropertyIMLaunchUid );
    property->SetValue( 0x200255D0 );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
	
		
    property->SetName( EPropertyContactViewPluginId );
    property->SetValue( 0x20012423 ); // plugin view id  

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
	
    
    property->SetName( ESubPropertyIMSettingsId );
    property->SetValue( iSettingsRecordId );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    
    
    
    property->SetName( EPropertyIMSubServicePluginId );
    property->SetValue( KIMConnectivityPluginImplUid );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    
    
    property->SetName( ESubPropertyIMPreferredIAPId );
    property->SetValue( iSnapId );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    
    
    
    property->SetName( ESubPropertyIMPreferredSNAPId );
    property->SetValue( iSnapId );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    
    
    property->SetName( ESubPropertyIMEnabled );
    property->SetValue( EOff );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    
    RBuf brandId;
    if( iBrandId )
        {
        brandId.CreateL(*iBrandId );
        }
    else
        {
        brandId.CreateL(KNullDesC);
        }
    CleanupClosePushL( brandId );
    property->SetName( EPropertyBrandId );
    property->SetValue( brandId );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    CleanupStack::PopAndDestroy( &brandId );
    
    
    property->SetName( EPropertyBrandLanguage );
    
    // ELangInternationalEnglish is selected as Default Brand Language Id. 
    property->SetValue( ELangInternationalEnglish );       

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    
    
	RBuf contactDB;
	TBuf <50> string;
	// The store name should be service specific, and not hardcoded, hence we use iServiceProviderId to form uniqueness.
	string.Format(_L("cntdb://c:vimpststore%d.cdb"), iServiceProviderId);
	contactDB.CreateL (string); 
    CleanupClosePushL( contactDB );
    property->SetName( EPropertyContactStoreId );
    property->SetValue( contactDB );

    User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
                                                               *property ) );
    CleanupStack::PopAndDestroy( &contactDB );
    
	/*PresenceSubservice*/
	property->SetName( ESubPropertyPresenceSettingsId );
	property->SetValue( iSettingsRecordId );

	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                               *property ) );



	property->SetName( EPropertyPresenceSubServicePluginId );
	property->SetValue( KIMConnectivityPluginImplUid );

	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                               *property ) );


	property->SetName( ESubPropertyPresencePreferredIAPId );
	property->SetValue( iSnapId );

	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                               *property ) );



	property->SetName( ESubPropertyPresencePreferredSNAPId );
	property->SetValue( iSnapId );

	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                               *property ) );


	property->SetName( ESubPropertyPresenceEnabled );
	property->SetValue( EOff );

	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                               *property ) );



	property->SetName( EPropertyPCSPluginId );
	property->SetValue( 0x101FB3E7 ); 

	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                                               *property ) ); 

	property->SetName( ESubPropertyPresenceAddrScheme );
	property->SetValue( *iDomainName ); 
	   
	User::LeaveIfError( serviceSettings->AddOrUpdatePropertyL( iServiceProviderId,
	                                                                   *property ) ); 

	//End of Presence Subservice

	CleanupStack::PopAndDestroy( property );
    CleanupStack::PopAndDestroy( serviceSettings );
    LOGGER ( TXT ( "CXMPPAdapter::UpdateServiceSettingsL() End" ) );
    }

// ---------------------------------------------------------------------------
//CXMPPAdapter::WriteAppSettingsL
// ---------------------------------------------------------------------------
//
void CXMPPAdapter::WriteAppSettingsL()
    {
    MVIMPSTSettingsStore*  settingsStore = CVIMPSTSettingsStore::NewLC();
    // write cancel login not supported : since xmpp doesnot have the support
    settingsStore->SetL( iServiceProviderId , EServiceCancelLoginNotSupported , 1 );
    // write change connection not supported : since xmpp doesnot have the support
    settingsStore->SetL( iServiceProviderId , EServiceChangeConnectionNotSupported , 1 );
    CleanupStack::PopAndDestroy();//settingStore
    }
//  End of File