diff -r fc7b30ed2058 -r 05bc53fe583b cmmanager/cmmgr/cmmserver/src/cmmconnmethodinstance.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmmanager/cmmgr/cmmserver/src/cmmconnmethodinstance.cpp Tue Aug 31 15:35:44 2010 +0300 @@ -0,0 +1,631 @@ +/* +* Copyright (c) 2009-2010 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: +* Session side object representing a connection method. +* +*/ + + +#include +#include +#include + +#include "cmmconnmethodinstance.h" +#include "cmmsession.h" +#include "cmmcache.h" +#include "cmmconnmethodstruct.h" + +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "cmmconnmethodinstanceTraces.h" +#endif + + +// --------------------------------------------------------------------------- +// Two phased construction. +// --------------------------------------------------------------------------- +// +CCmmConnMethodInstance* CCmmConnMethodInstance::NewL( + CCmmSession* aCmmSession, + CCmmCache* aCache ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_NEWL_ENTRY ); + + CCmmConnMethodInstance* self = CCmmConnMethodInstance::NewLC( aCmmSession, aCache ); + CleanupStack::Pop( self ); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_NEWL_EXIT ); + return self; + } + +// --------------------------------------------------------------------------- +// Two phased construction. +// --------------------------------------------------------------------------- +// +CCmmConnMethodInstance* CCmmConnMethodInstance::NewLC( + CCmmSession* aCmmSession, + CCmmCache* aCache ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_NEWLC_ENTRY ); + + CCmmConnMethodInstance* self = new( ELeave ) CCmmConnMethodInstance( aCmmSession, aCache ); + CleanupClosePushL( *self ); + self->ConstructL(); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_NEWLC_EXIT ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CCmmConnMethodInstance::~CCmmConnMethodInstance() + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_CCMMCONNMETHODINSTANCE_ENTRY ); + + // Tell cache this handle is beeing closed. Cache will update own bookkeeping. + if ( iCache ) + { + iCache->CloseConnMethod( *this ); + } + + delete iPluginDataInstance; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_CCMMCONNMETHODINSTANCE_EXIT ); + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CCmmConnMethodInstance::CCmmConnMethodInstance( + CCmmSession* aCmmSession, + CCmmCache* aCache ) + : + iCmmSession( aCmmSession ), + iCache( aCache ) + { + OstTraceFunctionEntry0( DUP1_CCMMCONNMETHODINSTANCE_CCMMCONNMETHODINSTANCE_ENTRY ); + + iPlugin = NULL; + iPluginDataInstance = NULL; + iConnMethodId = 0; + iBearerType = 0; + iStatus = ECmmConnMethodStatusChanged; + iRecordStatus = ECmmRecordStatusBlank; + iHandle = 0; + + OstTraceFunctionExit0( DUP1_CCMMCONNMETHODINSTANCE_CCMMCONNMETHODINSTANCE_EXIT ); + } + +// --------------------------------------------------------------------------- +// Second phase constructor. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::ConstructL() + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_CONSTRUCTL_ENTRY ); + + iPluginDataInstance = CCmClientPluginInstance::NewL(); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_CONSTRUCTL_EXIT ); + } + +// --------------------------------------------------------------------------- +// Get pointer to the plugin data container. +// --------------------------------------------------------------------------- +// +CCmClientPluginInstance* CCmmConnMethodInstance::GetPluginDataInstance() const + { + return iPluginDataInstance; + } + +// --------------------------------------------------------------------------- +// Get connection method ID. +// --------------------------------------------------------------------------- +// +TUint32 CCmmConnMethodInstance::GetId() const + { + return iConnMethodId; + } + +// --------------------------------------------------------------------------- +// Set connection method ID. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetId( const TUint32 aConnMethodId ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_SETID_ENTRY ); + + iConnMethodId = aConnMethodId; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_SETID_EXIT ); + } + +// --------------------------------------------------------------------------- +// Return bearer type. +// --------------------------------------------------------------------------- +// +TUint32 CCmmConnMethodInstance::GetBearerType() const + { + return iBearerType; + } + +// --------------------------------------------------------------------------- +// Get handle ID. +// --------------------------------------------------------------------------- +// +TInt CCmmConnMethodInstance::GetHandle() const + { + return iHandle; + } + +// --------------------------------------------------------------------------- +// Set handle ID. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetHandle( const TInt aHandle ) + { + iHandle = aHandle; + } + +// --------------------------------------------------------------------------- +// Return ETrue, if this connection method represents an embedded destination. +// --------------------------------------------------------------------------- +// +TBool CCmmConnMethodInstance::IsEmbeddedDestination() const + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_ISEMBEDDEDDESTINATION_ENTRY ); + + TBool result( EFalse ); + if ( iBearerType == KUidEmbeddedDestination ) + { + result = ETrue; + } + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_ISEMBEDDEDDESTINATION_EXIT ); + return result; + } + +// --------------------------------------------------------------------------- +// Save the contents of this connection method into database. The attribute +// aTemporaryHandle must be true if this connection instance was temporarily +// created for the duration of this update operation only. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::UpdateL( TBool aTemporaryHandle ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_UPDATEL_ENTRY ); + + if ( iCache ) + { + iCache->UpdateConnMethodL( *this, aTemporaryHandle ); + } + else + { + User::Leave( KErrBadHandle ); + } + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_UPDATEL_EXIT ); + } + +// --------------------------------------------------------------------------- +// Copy the relevant connection method information from cache side object. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::CopyDataL( CCmmConnMethodStruct* aConnMethodStruct ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_COPYDATAL_ENTRY ); + + if ( !aConnMethodStruct ) + { + User::Leave( KErrCorrupt ); + } + + iConnMethodId = aConnMethodStruct->GetId(); + iBearerType = aConnMethodStruct->GetBearerType(); + + iPlugin = aConnMethodStruct->GetPlugin(); + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + // Embedded destination does not have any data. + if ( !IsEmbeddedDestination() ) + { + iPlugin->GetPluginDataL( iPluginDataInstance ); + } + + aConnMethodStruct->IncrementReferenceCounter(); + + switch ( aConnMethodStruct->GetStatus() ) + { + case ECmmConnMethodStatusNotSaved: + case ECmmConnMethodStatusToBeDeleted: + { + iStatus = ECmmConnMethodStatusChanged; + iRecordStatus = ECmmRecordStatusUnsaved; + } + break; + case ECmmConnMethodStatusValid: + { + iStatus = ECmmConnMethodStatusValid; + iRecordStatus = ECmmRecordStatusLoaded; + } + break; + case ECmmConnMethodStatusChanged: + default: + User::Leave( KErrCorrupt ); // Error, invalid status. + break; + } + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_COPYDATAL_EXIT ); + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::GetIntAttributeL +// --------------------------------------------------------------------------- +// +TUint32 CCmmConnMethodInstance::GetIntAttributeL( const TUint32 aAttribute ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_GETINTATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + // Embedded destination has only limited set of attributes. + if ( IsEmbeddedDestination() ) + { + switch ( aAttribute ) + { + case CMManager::ECmId: + case CMManager::ECmBearerType: + case CMManager::ECmDefaultPriority: + case CMManager::ECmDefaultUiPriority: + case ECmExtensionLevel: + { + break; + } + default: + { + User::Leave( KErrNotSupported ); + } + } + } + + TUint32 result = iPlugin->GetIntAttributeL( aAttribute, iPluginDataInstance ); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_GETINTATTRIBUTEL_EXIT ); + return result; + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::GetBoolAttributeL +// --------------------------------------------------------------------------- +// +TBool CCmmConnMethodInstance::GetBoolAttributeL( const TUint32 aAttribute ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_GETBOOLATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + // Embedded destination has only limited set of attributes. + if ( IsEmbeddedDestination() ) + { + switch ( aAttribute ) + { + case CMManager::ECmCoverage: + case CMManager::ECmDestination: + case CMManager::ECmProtected: + case CMManager::ECmHidden: + case CMManager::ECmBearerHasUi: + case CMManager::ECmVirtual: + { + break; + } + default: + { + User::Leave( KErrNotSupported ); + } + } + } + + TBool retVal( EFalse ); + switch ( aAttribute ) + { + case CMManager::ECmConnected: + { + if ( GetId() > 0 ) + { + // Check first if this is embedded destination. + retVal = iPlugin->GetBoolAttributeL( CMManager::ECmDestination, + iPluginDataInstance ); + if ( retVal ) + { + retVal = iCache->DestinationConnectedL( GetId() ); + } + else + { + if ( iCache ) + { + retVal = iCache->CheckIfCmConnected( GetId() ); + } + } + } + } + break; + case CMManager::ECmIsLinked: + { + // Does any virtual iap point to this connection method. + // Check first if this connection method is an embedded destination. + if ( GetId() > 0 ) + { + retVal = iPlugin->GetBoolAttributeL( CMManager::ECmDestination, + iPluginDataInstance ); + if ( retVal ) + { + retVal = iCache->DestinationPointedToByVirtualIap( GetId() ); + } + else + { + retVal = iCache->ConnMethodPointedToByVirtualIap( GetId() ); + } + } + } + break; + default: + { + retVal = iPlugin->GetBoolAttributeL( aAttribute, iPluginDataInstance ); + } + break; + } + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_GETBOOLATTRIBUTEL_EXIT ); + return retVal; + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::GetStringAttributeL +// --------------------------------------------------------------------------- +// +HBufC* CCmmConnMethodInstance::GetStringAttributeL( const TUint32 aAttribute ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_GETSTRINGATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + // Embedded destination has only limited set of attributes. + if ( IsEmbeddedDestination() ) + { + User::Leave( KErrNotSupported ); + } + + HBufC* result = iPlugin->GetStringAttributeL( aAttribute, iPluginDataInstance ); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_GETSTRINGATTRIBUTEL_EXIT ); + return result; + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::GetString8AttributeL +// --------------------------------------------------------------------------- +// +HBufC8* CCmmConnMethodInstance::GetString8AttributeL( const TUint32 aAttribute ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_GETSTRING8ATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + // Embedded destination has only limited set of attributes. + if ( IsEmbeddedDestination() ) + { + User::Leave( KErrNotSupported ); + } + + HBufC8* result = iPlugin->GetString8AttributeL( aAttribute, iPluginDataInstance ); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_GETSTRING8ATTRIBUTEL_EXIT ); + return result; + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::SetIntAttributeL +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetIntAttributeL( + const TUint32 aAttribute, + const TUint32 aValue ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_SETINTATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + iPlugin->SetIntAttributeL( aAttribute, aValue, iPluginDataInstance ); + + iRecordStatus = ECmmRecordStatusModified; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_SETINTATTRIBUTEL_EXIT ); + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::SetBoolAttributeL +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetBoolAttributeL( + const TUint32 aAttribute, + const TBool aValue ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_SETBOOLATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + iPlugin->SetBoolAttributeL( aAttribute, aValue, iPluginDataInstance ); + + iRecordStatus = ECmmRecordStatusModified; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_SETBOOLATTRIBUTEL_EXIT ); + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::SetStringAttributeL +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetStringAttributeL( + const TUint32 aAttribute, + const TDesC16& aValue ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_SETSTRINGATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + iPlugin->SetStringAttributeL( aAttribute, aValue, iPluginDataInstance ); + + iRecordStatus = ECmmRecordStatusModified; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_SETSTRINGATTRIBUTEL_EXIT ); + } + +// --------------------------------------------------------------------------- +// CCmmConnMethodInstance::SetString8AttributeL +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetString8AttributeL( + const TUint32 aAttribute, + const TDesC8& aValue ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_SETSTRING8ATTRIBUTEL_ENTRY ); + + if ( !iPlugin ) + { + User::Leave( KErrCorrupt ); + } + + iPlugin->SetString8AttributeL( aAttribute, aValue, iPluginDataInstance ); + + iRecordStatus = ECmmRecordStatusModified; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_SETSTRING8ATTRIBUTEL_EXIT ); + } + +// --------------------------------------------------------------------------- +// Sets a new status value. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::SetStatus( const TCmmConnMethodStatus aStatus ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_SETSTATUS_ENTRY ); + + iStatus = aStatus; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_SETSTATUS_EXIT ); + } + +// --------------------------------------------------------------------------- +// Called after this connection method has been updated and database +// transaction has completed successfully. Sets the internal state of this +// connection method instance to reflect the new valid state. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::UpdateSuccessful() + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_UPDATESUCCESSFUL_ENTRY ); + + SetStatus( ECmmConnMethodStatusValid ); + iRecordStatus = ECmmRecordStatusLoaded; + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_UPDATESUCCESSFUL_EXIT ); + } + +// --------------------------------------------------------------------------- +// Called after this connection method has been deleted and database +// transaction has completed successfully. Sets the internal state of this +// connection method structure to reflect the new deleted state. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::DeleteSuccessful( const TUint32 aNewSecondaryId ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_DELETESUCCESSFUL_ENTRY ); + + SetStatus( ECmmConnMethodStatusChanged ); + iRecordStatus = ECmmRecordStatusModified; + SetId( aNewSecondaryId ); + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_DELETESUCCESSFUL_EXIT ); + } + +// --------------------------------------------------------------------------- +// After update/delete to database, refresh temporary ID to real ID if +// necessary and refresh status information for any related handles for +// all client sessions. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::RefreshHandlesForAllSessions( + const TCmmIdStruct& aIdStruct ) + { + OstTraceFunctionEntry0( CCMMCONNMETHODINSTANCE_REFRESHHANDLESFORALLSESSIONS_ENTRY ); + + if ( iCmmSession ) + { + iCmmSession->RefreshHandlesForAllSessions( aIdStruct ); + } + + OstTraceFunctionExit0( CCMMCONNMETHODINSTANCE_REFRESHHANDLESFORALLSESSIONS_EXIT ); + } + +// --------------------------------------------------------------------------- +// Removes a connection method from any open destination handle in the same +// session. +// --------------------------------------------------------------------------- +// +void CCmmConnMethodInstance::RemoveConnMethodFromSessionDestinationHandles( + const TUint32 aConnMethodId ) + { + if ( iCmmSession ) + { + iCmmSession->RemoveConnMethodFromDestinationHandles( aConnMethodId ); + } + } + +// --------------------------------------------------------------------------- +// Gets the current status value. +// --------------------------------------------------------------------------- +// +TCmmConnMethodStatus CCmmConnMethodInstance::GetStatus() const + { + return iStatus; + } + +// End of file