simpleengine/presenceprovisioning/src/presenceprovitem.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:35:50 +0300
branchRCL_3
changeset 17 2669f8761a99
parent 14 e53c01f160bc
child 18 fbd2e7cec7ef
permissions -rw-r--r--
Revision: 201027 Kit: 201035

/*
* Copyright (c) 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:    : Implementation for for presenceprovitem
*
*/




// INCLUDE FILES
#include <CWPParameter.h>
#include <CWPCharacteristic.h>
#include <StringLoader.h>
#include <badesca.h>

#include "presenceprovitem.h"
#include "pressettingsapi.h"
#include "presenceprovlogger.h"

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

// -----------------------------------------------------------------------------
// CPresProvItem::CPresProvItem
// -----------------------------------------------------------------------------
//
CPresProvItem::CPresProvItem() :
    iPresSetId(KErrNotFound),
    iSettingsSaved( EFalse )
    {
    iSetName.Set(KNullDesC);
    iSipProfile = KErrNotFound;
    iXDMSetting = KErrNotFound;
    iObjectSize = KErrNotFound;
    iContSrvrAdd.Set(KNullDesC);
    iPublicationInt = KErrNotFound;
    iMaxSubscriptions = KErrNotFound;
    iMaxContactsInList = KErrNotFound;
    iDomainSyntax.Set(KNullDesC);
    iProviderID.Set(KNullDesC);
    }

// -----------------------------------------------------------------------------
// CPresProvItem::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CPresProvItem* CPresProvItem::NewL()
    {
    CPresProvItem* self = new (ELeave) CPresProvItem();
    return self;
    }

// -----------------------------------------------------------------------------
// CPresProvItem::~CPresProvItem
// -----------------------------------------------------------------------------
//
CPresProvItem::~CPresProvItem()
    {
    iToAppReferences.Close();
    }    

// -----------------------------------------------------------------------------
// CPresProvItem::Validate
// -----------------------------------------------------------------------------
//
TBool CPresProvItem::Validate() const
    {
    // Validate that compulsory settings are received
    PRES_PROV_LOG(LOG_LIT8( "CPresProvItem::Validate()"));
    
    if ( !iAppId.Length() )
        {
        PRES_PROV_LOG(LOG_LIT8( "   iAppId missing" ) );
        return EFalse;
        }
    else if ( iAppId.Compare( KPresProvisioningAppId) )
        {
        PRES_PROV_LOG(LOG_LIT8( "   Wrong iAppId" ) );
        return EFalse;
        }
    else if (iSetName == KNullDesC)
        {
        PRES_PROV_LOG(LOG_LIT8( "   iSetName is missing" ));
        return EFalse;
        }
    else if (iToAppReferences.Count() < 2 ) // if SIP and XDM references are not present
        {
        PRES_PROV_LOG(LOG_LIT8( "   XDM or SIP reference is missing" ));
        return EFalse;
        }
    else if (iObjectSize < NULL)
        {
        PRES_PROV_LOG(LOG_LIT8( "   iObjectSize is missing" ));
        return EFalse;
        }
    else if (iDomainSyntax == KNullDesC)
        {
        PRES_PROV_LOG(LOG_LIT8( "   iDomainSyntax is missing" ));
        return EFalse;
        }
    else if (iProviderID == KNullDesC)
        {
        PRES_PROV_LOG(LOG_LIT8( "   iProviderID is missing" ));
        return EFalse;
        }
    PRES_PROV_LOG(LOG_LIT8( "   return True" ) );
    return ETrue;   
    }
    
// -----------------------------------------------------------------------------
// CPresProvItem::Name
// -----------------------------------------------------------------------------
//  
const TDesC& CPresProvItem::Name() const
    {
    return iSetName;
    }

// -----------------------------------------------------------------------------
// CPresProvItem::ApplicationId
// -----------------------------------------------------------------------------
//  
const TDesC& CPresProvItem::ApplicationId() const
    {
    return KPresProvisioningAppId;
    }
    
// -----------------------------------------------------------------------------
// CPresProvItem::PresSetId
// -----------------------------------------------------------------------------
//  
TInt CPresProvItem::PresSetId() const
    {
    return iPresSetId;
    }
    
// -----------------------------------------------------------------------------
// CPresProvItem::AppReference
// -----------------------------------------------------------------------------
//  
const TDesC& CPresProvItem::AppReference() const
    {
    return iAppRef;
    }
    
// -----------------------------------------------------------------------------
// CPresProvItem::SaveL
// -----------------------------------------------------------------------------
//  
TInt CPresProvItem::SaveL()
    {
    PRES_PROV_LOG(LOG_LIT8( "CPresProvItem::SaveL" ) );
    
    TInt id(KErrNone);
 
    if( !iSettingsSaved )
        {
        TPresSettingsSet mySet;
        (mySet.iSetName).Copy(iSetName);
        mySet.iSipProfile = iSipProfile;
        mySet.iXDMSetting = iXDMSetting;
        mySet.iObjectSize = iObjectSize;
        (mySet.iContSrvrAdd).Copy(iContSrvrAdd);
        mySet.iPublicationInt = iPublicationInt;
        mySet.iMaxSubscriptions = iMaxSubscriptions;
        mySet.iMaxContactsInList = iMaxContactsInList;
        (mySet.iDomainSyntax).Copy(iDomainSyntax);
        (mySet.iProviderID).Copy(iProviderID);
        
        CheckDuplicateNameL(mySet.iSetName, iPresSetId);
        
        id = PresSettingsApi::CreateSetL(mySet);
        
        if(id>KErrNotFound)
            {
            iSettingsSaved = ETrue;
            iPresSetId = id;           
            }
            
        PRES_PROV_LOG(LOG_LIT8( "CPresProvItem::SaveL with Id:%d" ),id);
        }
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CPresProvItem::ToAppReferences
// -----------------------------------------------------------------------------
//
const RArray<TPtrC>& CPresProvItem::ToAppReferences() const
    {
    return iToAppReferences;
    }

// -----------------------------------------------------------------------------
// CPresProvItem::VisitL
// -----------------------------------------------------------------------------
//
void CPresProvItem::VisitL( CWPCharacteristic& aCharacteristic )
    {
    TInt type = aCharacteristic.Type();
    PRES_PROV_LOG(LOG_LIT8( "CPresProvItem::VisitL CWPCharacteristic %d" ), type );
    if (type == KWPResource)
        {
        aCharacteristic.AcceptL( *this );
        }    
    }
        
// -----------------------------------------------------------------------------
// CPresProvItem::VisitL
// -----------------------------------------------------------------------------
//
void CPresProvItem::VisitL( CWPParameter& aParameter )
    {
    PRES_PROV_LOG(LOG_LIT8( "CPresProvItem::VisitL" ) );
    PRES_PROV_LOG(LOG_LIT(" aParameter.Value(): %S"), &(aParameter.Value()));
    
    switch( aParameter.ID() )
        {
        case EWPParameterAppID:
            {
            iAppId.Set( aParameter.Value() );
            PRES_PROV_LOG(LOG_LIT8( "    EWPParameterAppID" ) );
            }
            break;
    
        case EWPParameterProviderID:
            {
            iProviderID.Set( aParameter.Value() );
            PRES_PROV_LOG(LOG_LIT8( "    EWPParameterProviderID" ) );
            }
            break;

        case EWPParameterName:
            {
            iSetName.Set( aParameter.Value() );
            PRES_PROV_LOG(LOG_LIT8( "    EWPParameterName" ) );
            }
            break;  
            
        case EWPParameterToAppRef:
            {
            PRES_PROV_LOG(LOG_LIT8( " EWPParameterToAppRef"));
            iToAppReferences.Append( aParameter.Value() );  
            }
            break;
    
        case EWPParameterAppRef:
            {
            iAppRef.Set( aParameter.Value() );
            PRES_PROV_LOG(LOG_LIT8( " EWPParameterAppRef"));
            }
            break;
        
        case EWPParameterService: // some setting tools put SERVICE-URI-TEMPLATE
            {                     // with this id
            iDomainSyntax.Set(aParameter.Value());
            PRES_PROV_LOG(LOG_LIT8( " EWPParameterService"));
            }
            break;
                                 
        default:
            {
            DetermineNamedParameter( aParameter.Name(), aParameter.Value() );
            }
            break;
        }
    PRES_PROV_LOG(LOG_LIT8( "   CPresProvItem::VisitL ends" ) );    
    }

// -----------------------------------------------------------------------------
// CPresProvItem::DetermineNamedParameter
// -----------------------------------------------------------------------------
//
void CPresProvItem::DetermineNamedParameter( const TDesC& aName, const TDesC& aValue )
    {
    PRES_PROV_LOG(LOG_LIT( "DetermineNamedParameter(%S, %S)"), &aName, &aValue);
    if ( !aName.Compare( KPresProvClientObjDataLim ) )
        {
        iObjectSize = DesToInt(aValue);
        }
    else if ( !aName.Compare( KPresProvContentSrvUri ) )
        {
        iContSrvrAdd.Set( aValue );
        }
    else if ( !aName.Compare( KPresProvSrcThPublish ) )
        {
        iPublicationInt = DesToInt( aValue );
        }
    else if ( !aName.Compare( KPresProvMaxPresSubs ) )
        {
        iMaxSubscriptions = DesToInt( aValue );
        }
    else if ( !aName.Compare( KPresProvMaxPresSubsInLists ) )
        {
        iMaxContactsInList = DesToInt( aValue );
        }
    else if ( !aName.Compare( KPresProvServiceUriTemp ) )
        {
        iDomainSyntax.Set(aValue);
        }
    else if (!aName.Compare(KPresIAppRef))
        {
        iAppRef.Set(aValue);
        }
    else if (!aName.Compare(KPresIToAppRef))
        {
        if(iToAppReferences.Count() < 2) // if any of SIP or XDM id is missing
            iToAppReferences.Append(aValue);        
        }
    PRES_PROV_LOG(LOG_LIT8( "   CPresProvItem::DetermineNamedParameter ends" ) );      
    }
// -----------------------------------------------------------------------------
// CPresProvItem::VisitLinkL
// -----------------------------------------------------------------------------
//
void CPresProvItem::VisitLinkL( CWPCharacteristic& /*aLink*/ )
    {
    PRES_PROV_LOG(LOG_LIT8( "CPresProvItem::VisitLinkL" ) );
    }
    
// -----------------------------------------------------------------------------
// CPresProvItem::SetSipSetIdL
// -----------------------------------------------------------------------------
//  
void CPresProvItem::SetSipSetIdL(TInt aSipId)
    {
    PRES_PROV_LOG(LOG_LIT8( "SetSipSetIdL(%d)" ), aSipId);
    if (iSipProfile == KErrNotFound)
        iSipProfile = aSipId;
    if(iPresSetId>KErrNotFound)
        PresSettingsApi::UpdatePropertyL( iPresSetId, EPresPropSIPProfile, iSipProfile);
    }
    
// -----------------------------------------------------------------------------
// CPresProvItem::SetXDMSetIdL
// -----------------------------------------------------------------------------
//  
void CPresProvItem::SetXDMSetIdL(TInt aXdmId)
    {
    PRES_PROV_LOG(LOG_LIT8( "SetXDMSetIdL(%d)" ), aXdmId);
    if (iXDMSetting == KErrNotFound)
        iXDMSetting = aXdmId;
    if(iPresSetId>KErrNotFound)
        PresSettingsApi::UpdatePropertyL( iPresSetId, EPresPropXDMSet, iXDMSetting);    
    }
    
// ---------------------------------------------------------------------------
// CPresProvItem::GetPrefixL()
// ---------------------------------------------------------------------------
// 
HBufC* CPresProvItem::GetPrefixL( HBufC* aName )
    {
    TPtrC prefix = aName->Des();
    TInt lastBrace = aName->LocateReverse('(');
    if ( lastBrace != KErrNotFound )
        {
        // aName looks like "<prefix><brace><something>".
        // See if <something> is an integer number and
        // <something> ends to a brace.
        TPtrC num = aName->Right( aName->Length() - lastBrace - 1 );
        TInt val;
        TLex lex( num );
        if ( lex.Val( val ) == KErrNone && num.Locate(')') == num.Length() - 1 )
            {
            // Yes, the trailer is an integer.
            prefix.Set( aName->Left( lastBrace ) );
            }
        }
    return prefix.AllocL();
    }    

// -----------------------------------------------------------------------------
// CPresProvAdapter::CheckDuplicateNameL
// Checks if duplicate named Presence profiles. Renames if same.
// -----------------------------------------------------------------------------
void CPresProvItem::CheckDuplicateNameL( TDes& aSetName, const TInt& aSetId)
    {
    PRES_PROV_LOG(LOG_LIT(" CheckDuplicateNameL(%S, %d)"),&aSetName, aSetId);
    
    _LIT( KPresProvNumbering, "(%N)" );
    const TInt KPresProvFormatExtraLen = 6;
    
    HBufC* newName = HBufC::NewLC(KPresSetNameMaxLength);
    newName->Des().Copy(aSetName);

    RArray<TInt> setIds;
    CleanupClosePushL( setIds );
    CDesCArray* names = PresSettingsApi::GetAllSetsNamesLC(setIds);
    TInt count(setIds.Count());
    
    newName = newName->ReAlloc( 
        newName->Length() + KPresProvFormatExtraLen );// enough for formatting

    HBufC* tempSetName = NULL;
    TInt pos = 0;// used as dummy
    TInt found = 0;
    TInt index = 1;
    TPtr ptr = newName->Des();
    
    // do the actual checking of name
    found = names->Find( *newName, pos );
    while ( found == 0 )
        {
        if ( !tempSetName )
            {
            tempSetName = GetPrefixL( newName );
            tempSetName = tempSetName->ReAlloc( 
                tempSetName->Length() + KPresProvFormatExtraLen );// enough for formatting
            CleanupStack::PushL( tempSetName );
            tempSetName->Des().Append( KPresProvNumbering );
            }
        StringLoader::Format( ptr, *tempSetName, -1, index );
        found = names->Find( *newName, pos );
        index++;
        }

    // cleanup
    if ( tempSetName )
        {
        CleanupStack::PopAndDestroy( tempSetName ); //tempSetName
        }
    
    CleanupStack::PopAndDestroy(names); // names
    CleanupStack::PopAndDestroy(1); // setIds 

    aSetName.Copy(newName->Des());
    CleanupStack::PopAndDestroy( newName );
    
    PRES_PROV_LOG(LOG_LIT(" CheckDuplicateNameL(%S): end"),&aSetName);
    }    
    
// ----------------------------------------------------------------------------
// CPresProvItem::DesToInt
// ----------------------------------------------------------------------------
TInt CPresProvItem::DesToInt( const TDesC& aSrcDes ) const
    {
    TLex16 lex( aSrcDes );
    TInt value ( KErrNotFound );
    lex.Val( value );
    return value;
    }

//  End of File