--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/AttributeLibrary2/Src/CPEngAttrLibObjectHolder.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,321 @@
+/*
+* Copyright (c) 2004 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: Attribute library object holder.
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngAttrLibObjectHolder.h"
+#include "CPEngSessionSlotObject.h"
+#include "CPEngSessionSlotObjectCon.h"
+
+#include "CPEngPresenceAttrManager.h"
+#include "CPEngPresenceAttrTransactionEnv.h"
+#include "CPEngAttributeTransactionFactory.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::InstanceLC()
+// Singleton retrieve method.
+// -----------------------------------------------------------------------------
+//
+CPEngAttrLibObjectHolder* CPEngAttrLibObjectHolder::InstanceLC()
+ {
+ CPEngAttrLibObjectHolder* holder = NULL;
+
+ holder = ( CPEngAttrLibObjectHolder* ) Dll::Tls();
+ if ( !holder )
+ {
+ holder = CPEngAttrLibObjectHolder::NewLC();
+ User::LeaveIfError( Dll::SetTls( holder ) );
+ }
+ else
+ {
+ TInt val = holder->Open(); // CSI: 65 #
+ CleanupClosePushL( *holder );
+ }
+
+ return holder;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::HandleThreadDetach()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttrLibObjectHolder::HandleThreadDetach()
+ {
+ CPEngAttrLibObjectHolder* holder;
+ holder = ( CPEngAttrLibObjectHolder* ) Dll::Tls();
+ delete holder;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPEngAttrLibObjectHolder* CPEngAttrLibObjectHolder::NewLC()
+ {
+ CPEngAttrLibObjectHolder* self = new( ELeave ) CPEngAttrLibObjectHolder;
+ CleanupClosePushL( *self );
+ self->ConstructL();
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::CPEngAttrLibObjectHolder
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEngAttrLibObjectHolder::CPEngAttrLibObjectHolder()
+ {
+ }
+
+
+// Destructor
+CPEngAttrLibObjectHolder::~CPEngAttrLibObjectHolder()
+ {
+ delete iAttributeManagers;
+ delete iAttributeTransEnvs;
+ delete iAttributeTransFacts;
+ Dll::SetTls( NULL );
+
+#if _BullseyeCoverage
+ cov_write();
+#endif
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttrLibObjectHolder::ConstructL()
+ {
+ iAttributeManagers = CPEngSessionSlotObjectCon::NewL();
+ iAttributeTransEnvs = CPEngSessionSlotObjectCon::NewL();
+ iAttributeTransFacts = CPEngSessionSlotObjectCon::NewL();
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::AttributeManagerInstanceL()
+//
+// NOTE!! Method increases returned object reference count by one before
+// returning it.
+// -----------------------------------------------------------------------------
+//
+MPEngPresenceAttrManager* CPEngAttrLibObjectHolder::AttributeManagerInstanceL(
+ const CPEngSessionSlotId& aSlotId )
+ {
+ CPEngPresenceAttrManager* attrManager =
+ ( CPEngPresenceAttrManager* ) iAttributeManagers->FindById( aSlotId );
+ if ( !attrManager )
+ {
+ attrManager = CPEngPresenceAttrManager::NewLC( aSlotId );
+ attrManager->SetOwner( *this );
+ iAttributeManagers->AddL( attrManager );
+ CleanupStack::Pop(); //Leave reference open to MPEngPresenceAttrManager
+ }
+ else {
+ attrManager->Open(); // CSI: 65 #
+ }
+
+ return attrManager;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::AttributeTransEnvInstanceL()
+//
+// NOTE!! Method increases returned object reference count by one before
+// returning it.
+// -----------------------------------------------------------------------------
+//
+MPEngPresenceAttrTransactionEnv* CPEngAttrLibObjectHolder::AttributeTransEnvInstanceL(
+ const CPEngSessionSlotId& aSlotId )
+ {
+ CPEngPresenceAttrTransactionEnv* transEnv =
+ ( CPEngPresenceAttrTransactionEnv* ) iAttributeTransEnvs->FindById( aSlotId );
+ if ( !transEnv )
+ {
+ MPEngPresenceAttrManager* attrMan = AttributeManagerInstanceL( aSlotId );
+ CleanupClosePushL( *attrMan );
+ transEnv = CPEngPresenceAttrTransactionEnv::NewL( aSlotId, *attrMan );
+ CleanupStack::Pop(); //Leave reference open to MPEngPresenceAttrManager
+ //transEnv took its ownership
+
+
+ CleanupStack::PushL( transEnv );
+ transEnv->SetOwner( *this );
+ iAttributeTransEnvs->AddL( transEnv );
+ CleanupStack::Pop(); //Leave initial reference open to CPEngPresenceAttrTransactionEnv
+ }
+ else {
+ transEnv->Open(); // CSI: 65 #
+ }
+
+ return transEnv;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::AttributeTransFactInstanceL()
+//
+// NOTE!! Method increases returned object reference count by one before
+// returning it.
+// -----------------------------------------------------------------------------
+//
+MPEngTransactionFactory* CPEngAttrLibObjectHolder::AttributeTransFactInstanceL(
+ const CPEngSessionSlotId& aSlotId )
+ {
+ CPEngAttributeTransactionFactory* transFact =
+ ( CPEngAttributeTransactionFactory* ) iAttributeTransFacts->FindById( aSlotId );
+ if ( !transFact )
+ {
+ MPEngPresenceAttrManager* attrMan = AttributeManagerInstanceL( aSlotId );
+ CleanupClosePushL( *attrMan );
+
+ MPEngPresenceAttrTransactionEnv* attrEnv = AttributeTransEnvInstanceL( aSlotId );
+ CleanupClosePushL( *attrEnv );
+
+ transFact = CPEngAttributeTransactionFactory::NewL( aSlotId, *attrEnv, *attrMan );
+ CleanupStack::Pop( 2 ); //CPEngAttributeTransactionFactory took ownership of
+ //attrMan and attrEnv
+
+ CleanupClosePushL( *transFact );
+ transFact->SetOwner( *this );
+ iAttributeTransFacts->AddL( transFact );
+ CleanupStack::Pop(); //Leave initial CPEngAttributeTransactionFactory reference open
+ }
+
+ else {
+ transFact->Open(); // CSI: 65 #
+ }
+
+ return transFact;
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::__DbgInstanceOrNull()
+// Debug helper.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+CPEngAttrLibObjectHolder* CPEngAttrLibObjectHolder::__DbgInstanceOrNull()
+ {
+ return ( CPEngAttrLibObjectHolder* ) Dll::Tls();
+ }
+#endif // _DEBUG
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::__DbgObjectCounts()
+// Debug helper.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CPEngAttrLibObjectHolder::__DbgObjectCounts( TInt& aHolder,
+ TInt& aAttrMan,
+ TInt& aTransEnv,
+ TInt& aTransFact ) const
+ {
+ aHolder = 1;
+ aAttrMan = iAttributeManagers->Count();
+ aTransEnv = iAttributeTransEnvs->Count();
+ aTransFact = iAttributeTransFacts->Count();
+ }
+#endif // _DEBUG
+
+
+
+// -----------------------------------------------------------------------------
+// __DoGetRefCount()
+// Debug helper.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void __DoGetRefCount( const CPEngSessionSlotObjectCon& aCon,
+ const CPEngSessionSlotId& aSlotId,
+ TInt& aRefCount )
+ {
+
+ const CPEngSessionSlotObject* obj = aCon.FindById( aSlotId );
+ if ( obj )
+ {
+ aRefCount = obj->RefCount();
+ }
+ else
+ {
+ aRefCount = KErrNotFound;
+ }
+ }
+#endif // _DEBUG
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::__DbgAttrManRefCount()
+// Debug helper.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CPEngAttrLibObjectHolder::__DbgAttrManRefCount( const CPEngSessionSlotId& aSlotId,
+ TInt& aRefCount ) const
+ {
+ __DoGetRefCount( *iAttributeManagers, aSlotId, aRefCount );
+ }
+#endif // _DEBUG
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::__DbgTransEnvRefCount()
+// Debug helper.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CPEngAttrLibObjectHolder::__DbgTransEnvRefCount( const CPEngSessionSlotId& aSlotId,
+ TInt& aRefCount ) const
+ {
+ __DoGetRefCount( *iAttributeTransEnvs, aSlotId, aRefCount );
+ }
+#endif // _DEBUG
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttrLibObjectHolder::__DbgTransFactRefCount()
+// Debug helper.
+// -----------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void CPEngAttrLibObjectHolder::__DbgTransFactRefCount( const CPEngSessionSlotId& aSlotId,
+ TInt& aRefCount ) const
+ {
+ __DoGetRefCount( *iAttributeTransFacts, aSlotId, aRefCount );
+ }
+#endif // _DEBUG
+
+
+// End of File