ximpfw/presence/srcpresencedatamodel/presenceinfo/presenceinfoimp.cpp
author hgs
Wed, 03 Nov 2010 09:32:20 +0530
changeset 51 61fad867f68e
permissions -rw-r--r--
201041

/*
* 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:  MPresenceDocument API object implementation.
*
*/

#include "presenceinfoimp.h"
#include "personpresenceinfoimp.h"
#include "servicepresenceinfoimp.h"
#include "devicepresenceinfoimp.h"
#include "presenceapidataobjfactory.h"
#include "presencetypehelpers.h"
#include "ximpobjecthelpers.h"
#include "presenceinfofilterimp.h"

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

// ---------------------------------------------------------------------------
// CPresenceInfoImp::NewLC()
// ---------------------------------------------------------------------------
//
EXPORT_C CPresenceInfoImp* CPresenceInfoImp::NewLC()
    {
    CPresenceInfoImp* self = new( ELeave ) CPresenceInfoImp;
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }


// ---------------------------------------------------------------------------
// CPresenceInfoImp::NewL()
// ---------------------------------------------------------------------------
//
EXPORT_C CPresenceInfoImp* CPresenceInfoImp::NewL()
    {
    CPresenceInfoImp* self = NewLC();
    CleanupStack::Pop( self );
    return self;
    }


// ---------------------------------------------------------------------------
// CPresenceInfoImp::~CPresenceInfoImp()
// ---------------------------------------------------------------------------
//
CPresenceInfoImp::~CPresenceInfoImp()
    {
    delete iPersonPresence;
    iServicePresences.ResetAndDestroy();
    iDevicePresences.ResetAndDestroy();
    }

// ---------------------------------------------------------------------------
// CPresenceInfoImp::CPresenceInfoImp()
// ---------------------------------------------------------------------------
//
CPresenceInfoImp::CPresenceInfoImp()
    {
    }


// ---------------------------------------------------------------------------
// CPresenceInfoImp::ConstructL()
// ---------------------------------------------------------------------------
//
void CPresenceInfoImp::ConstructL()
    {
    iPersonPresence = CPersonPresenceInfoImp::NewLC();
    CleanupStack::Pop( iPersonPresence );
    }

// ---------------------------------------------------------------------------
// CPresenceInfoImp::NewFromStreamLC()
// ---------------------------------------------------------------------------
//
XIMPIMP_IMPLEMENT_DATAOBJ_NEWFROMSTREAM( CPresenceInfoImp )


// ---------------------------------------------------------------------------
// Implement supported interface access.
// ---------------------------------------------------------------------------
//
XIMPIMP_IF_BASE_GET_INTERFACE_BEGIN( CPresenceInfoImp, 
                                     MPresenceInfo )
XIMPIMP_IF_BASE_GET_INTERFACE_END()


XIMPIMP_IF_BASE_GET_CONST_INTERFACE_BEGIN( CPresenceInfoImp, 
                                           MPresenceInfo )
XIMPIMP_IF_BASE_GET_INTERFACE_END()

// ---------------------------------------------------------------------------
// CPresenceInfoImp::EqualsContent()
// ---------------------------------------------------------------------------
//
TBool CPresenceInfoImp::EqualsContent( 
    const CXIMPApiDataObjBase& aOtherInstance ) const
    {
    const CPresenceInfoImp* tmp =
        TXIMPGetImpClassOrPanic< const CPresenceInfoImp >::From( aOtherInstance.Base() );

    TBool same = ETrue;
    TBool x = iPersonPresence->EqualsContent( *tmp->iPersonPresence );
    same &= x;
    
    x = TXIMPEqualsContent< CServicePresenceInfoImp >::Array( iServicePresences, tmp->iServicePresences );
    same &= x;

    x = TXIMPEqualsContent< CDevicePresenceInfoImp >::Array( iDevicePresences, tmp->iDevicePresences );
    same &= x;
    
    return same;
    }

// ---------------------------------------------------------------------------
// CPresenceInfoImp::ExternalizeL()
// ---------------------------------------------------------------------------
//
EXPORT_C void CPresenceInfoImp::ExternalizeL( RWriteStream& aStream ) const
    {
    iPersonPresence->ExternalizeL( aStream );

    CPresenceApiDataObjFactory::ExternalizeL< CServicePresenceInfoImp >
        ( aStream, iServicePresences );

    CPresenceApiDataObjFactory::ExternalizeL< CDevicePresenceInfoImp >
        ( aStream, iDevicePresences );
    }


// ---------------------------------------------------------------------------
// CPresenceInfoImp::InternalizeL()
// ---------------------------------------------------------------------------
//
EXPORT_C void CPresenceInfoImp::InternalizeL( RReadStream& aStream )
    {
    CPersonPresenceInfoImp* tmp = CPersonPresenceInfoImp::NewLC();
    tmp->InternalizeL( aStream );
    delete iPersonPresence;
    iPersonPresence = tmp;
    CleanupStack::Pop( tmp );

    iServicePresences.ResetAndDestroy();
    CPresenceApiDataObjFactory::InternalizeL< CServicePresenceInfoImp >
        ( aStream, iServicePresences );
    
    iDevicePresences.ResetAndDestroy();
    CPresenceApiDataObjFactory::InternalizeL< CDevicePresenceInfoImp >
        ( aStream, iDevicePresences );
    }
    

// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::PersonPresence()
// ---------------------------------------------------------------------------
//
const MPersonPresenceInfo* CPresenceInfoImp::PersonPresence() const
    {
    return iPersonPresence;
    }
    
// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::PersonPresence()
// ---------------------------------------------------------------------------
//
MPersonPresenceInfo* CPresenceInfoImp::PersonPresence()
    {
    return iPersonPresence;
    }    


// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::SetPersonPresenceL()
// ---------------------------------------------------------------------------
//
void CPresenceInfoImp::SetPersonPresenceL( 
    MPersonPresenceInfo* aPersonPresence )
    {
    User::LeaveIfError( aPersonPresence == NULL ? KErrArgument : KErrNone );

    CPersonPresenceInfoImp* personPresenceImp =
    TXIMPGetImpClassOrPanic< CPersonPresenceInfoImp >::From( *aPersonPresence );
    
    delete iPersonPresence;
    iPersonPresence = personPresenceImp;
    }


// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::ServicePresenceCount()
// ---------------------------------------------------------------------------
//
TInt CPresenceInfoImp::ServicePresenceCount() const
    {
    return iServicePresences.Count();
    }
    

// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::ServicePresenceAt()
// ---------------------------------------------------------------------------
//
const MServicePresenceInfo& CPresenceInfoImp::ServicePresenceAt(
    TInt aIndex ) const
    {
    return *iServicePresences[ aIndex ];    
    }


// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::LookupServicePresenceByServiceType()
// ---------------------------------------------------------------------------
//
void CPresenceInfoImp::LookupServicePresenceByServiceType( 
    MServicePresenceInfo*& aServicePresence,
    const TDesC8& aMatch ) const
    {
    TInt start = KErrNotFound;

    // search from start
    if ( aServicePresence )
        {
        TBool found = EFalse;
        for ( TInt i = 0; ( i < iServicePresences.Count() ) && ( ! found ); i++ )
            {
            CXIMPApiDataObjBase* gotObj = TXIMPGetImpClassOrPanic< CXIMPApiDataObjBase >::From( *aServicePresence );
            CXIMPApiDataObjBase* obj = iServicePresences[ i ];
            if ( &(gotObj->Base()) == &(obj->Base()) )
                {
                found = ETrue;
                start = i;
                }
            }
        }

    start = start == KErrNotFound ? 0 : start;
    aServicePresence = NULL;

    for ( TInt i = start; i < iServicePresences.Count(); i++ )
        {
        CServicePresenceInfoImp* srvInfo = iServicePresences[ i ];

        if ( KErrNotFound != srvInfo->ServiceType().MatchF( aMatch ) )
            {
            // found match, return it
            aServicePresence = srvInfo;
            return;
            }
        }
    }


// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::AddServicePresenceL()
// ---------------------------------------------------------------------------
//
void CPresenceInfoImp::AddServicePresenceL( 
    MServicePresenceInfo* aServicePresence )
    {
    User::LeaveIfError( aServicePresence == NULL ? KErrArgument : KErrNone );
    
    CServicePresenceInfoImp* servicePresenceImp =
    TXIMPGetImpClassOrPanic< CServicePresenceInfoImp >::From( *aServicePresence );

    iServicePresences.AppendL( servicePresenceImp );
    }


// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::DevicePresenceCount()
// ---------------------------------------------------------------------------
//
TInt CPresenceInfoImp::DevicePresenceCount() const
    {
    return iDevicePresences.Count();
    }


// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::DevicePresenceAt()
// ---------------------------------------------------------------------------
//
const MDevicePresenceInfo& CPresenceInfoImp::DevicePresenceAt(
    TInt aIndex ) const
    {
    return *iDevicePresences[ aIndex ];
    }
        

// ---------------------------------------------------------------------------
// From MPresenceInfo class.
// CPresenceInfoImp::AddDevicePresenceL()
// ---------------------------------------------------------------------------
//
void CPresenceInfoImp::AddDevicePresenceL( 
    MDevicePresenceInfo* aDevicePresence )
    {
    User::LeaveIfError( aDevicePresence == NULL ? KErrArgument : KErrNone );

    CDevicePresenceInfoImp* devicePresenceImp =
    TXIMPGetImpClassOrPanic< CDevicePresenceInfoImp >::From( *aDevicePresence );

    iDevicePresences.AppendL( devicePresenceImp );
    }

// ---------------------------------------------------------------------------
// CPresenceInfoImp::FilteredInfoLC()
// ---------------------------------------------------------------------------
//
EXPORT_C CPresenceInfoImp* CPresenceInfoImp::FilteredInfoLC(
        const CPresenceInfoFilterImp& aFilter ) const
    {
    CPresenceInfoImp* info = TXIMPObjectCloner< CPresenceInfoImp >::CloneLC( *this );

    // the info imps know how to filter themselves
    info->iPersonPresence->FilterWithL( aFilter );

    for ( TInt i = 0; i < iServicePresences.Count(); i++ )
        {
        info->iServicePresences[ i ]->FilterWithL( aFilter );
        }
    
    for ( TInt i = 0; i < iDevicePresences.Count(); i++ )
        {
        info->iDevicePresences[ i ]->FilterWithL( aFilter );
        }

    return info;
    }


// End of file