diff -r 798ee5f1972c -r 826cea16efd9 videoconnutility/connutility/src/vcxconnutilpubsub.cpp --- a/videoconnutility/connutility/src/vcxconnutilpubsub.cpp Thu Aug 19 10:54:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,391 +0,0 @@ -/* -* 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 the License "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: -* -*/ - - - - -#include - -#include "vcxconnutilcommon.h" -#include "vcxconnectionutility.hrh" -#include "vcxconnutilpubsub.h" -#include "vcxconnutilsubscriber.h" -#include "vcxconnutilpubsubobserver.h" - -// CONSTANTS -_LIT( KConnUtilCounterSema, "__VcxConnUtillCounterSema__ "); -const TInt KSemaStartupValue = 1; - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::NewL() -// ----------------------------------------------------------------------------- -// -CVcxConnUtilPubSub* CVcxConnUtilPubSub::NewL( MConnUtilPubsubObserver *aObserver ) - { - CVcxConnUtilPubSub* self = CVcxConnUtilPubSub::NewLC( aObserver ); - CleanupStack::Pop( self ); - return self; - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::NewLC() -// ----------------------------------------------------------------------------- -// -CVcxConnUtilPubSub* CVcxConnUtilPubSub::NewLC( MConnUtilPubsubObserver *aObserver ) - { - CVcxConnUtilPubSub* self = new (ELeave) CVcxConnUtilPubSub( ); - CleanupStack::PushL( self ); - self->ConstructL( aObserver ); - return self; - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::CVcxNsConnUtilEngine() -// ----------------------------------------------------------------------------- -// -CVcxConnUtilPubSub::CVcxConnUtilPubSub( ) - { - // NOP - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::ConstructL() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::ConstructL( MConnUtilPubsubObserver *aObserver ) - { - MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::ConstructL() in"); - - TInt status( KErrNone ); - // semafore for protecting P&S -counter value writing - status = iSemaCounter.CreateGlobal( KConnUtilCounterSema, KSemaStartupValue ); - if( status == KErrAlreadyExists ) - { - // if semafore exists already, just open handle to existing - status = iSemaCounter.OpenGlobal( KConnUtilCounterSema ); - } - User::LeaveIfError( status ); - - User::LeaveIfError( - iPropertyCurrentIAPId.Attach( KVcxConnUtilPScategory, - EVCxPSIapId ) ); - - User::LeaveIfError( - iPropertyCurrentSNAPId.Attach( KVcxConnUtilPScategory, - EVCxPSSnapId ) ); - - User::LeaveIfError( - iPropertyNbrOfInst.Attach( KVcxConnUtilPScategory, - EVCxPSNbrConnInstances ) ); - - User::LeaveIfError( - iPropertyAccepted.Attach( KVcxConnUtilPScategory, - EVCxPSNbRoamAccepted ) ); - - iConnectionStatePS = - CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory, - EVCxPSConnectionStatus, - RProperty::EInt, aObserver ); - - iMasterExistPS = - CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory, - EVCxPSMasterExists, - RProperty::EInt, aObserver ); - - iRoamingReqStatusPS = - CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory, - EVCxPSRoamingRequestStatus, - RProperty::EInt, aObserver ); - - iNbrInstanceResp = - CVcxConnUtilSubscriber::NewL( KVcxConnUtilPScategory, - EVCxPSNbrRoamResp, - RProperty::EInt, aObserver ); - - if( GetValue( EVCxPSIapId, status ) == KErrNotFound ) - { - MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::ConstructL() no properties"); - - // define properties - DefinePropertiesL(); - } - - MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::ConstructL() out"); - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::~CVcxConnUtilPubSub() -// ----------------------------------------------------------------------------- -// -CVcxConnUtilPubSub::~CVcxConnUtilPubSub() - { - iSemaCounter.Close(); - - iPropertyCurrentIAPId.Close(); - iPropertyCurrentSNAPId.Close(); - iPropertyNbrOfInst.Close(); - iPropertyAccepted.Close(); - - delete iConnectionStatePS; - delete iMasterExistPS; - delete iRoamingReqStatusPS; - delete iNbrInstanceResp; - - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::DefinePropertiesL() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::DefinePropertiesL() - { - MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::DefinePropertiesL() in"); - TInt result( KErrNone ); - RSemaphore semaphore; - result = semaphore.CreateGlobal( KVcxConnUtilPSSema, 0 ); - if( result != KErrNone && result != KErrAlreadyExists ) - { - // kernel cannot create semaphore, or there is no existing - User::LeaveIfError( result ); - } - if( result == KErrAlreadyExists ) - { - // semaphore exist. Some other process is already defining PS - // open semaphore and wait for it to finish - User::LeaveIfError( semaphore.OpenGlobal( KVcxConnUtilPSSema ) ); - semaphore.Wait(); - // check if PS keys do exists - TInt value( 0 ); - if( GetValue( EVCxPSIapId, value ) == KErrNotFound ) - { - // other proces has failed to define PS, - // this process will try it - result = KErrNone; - } - } - if( result == KErrNone ) - { - const TUidType createPSUid( KNullUid, KNullUid, KVcxConnUtilPScategory ); - - RProcess createPS; - result = createPS.Create( KVcxConnUtilPSWorkerName(), KNullDesC(), createPSUid ); - if( result == KErrNone ) - { - createPS.Resume(); - createPS.Close(); - semaphore.Wait(); - // init default values for keys, whose default differs from 0 - SetValue( EVCxPSRoamingRequestStatus, EVCxRoamingNotInit ); - SetValue( EVCxPSConnectionStatus, EVCxNotConnected ); - } - } - // need to signal here for other possible - // processes to proceed - semaphore.Signal(); - semaphore.Close(); - if( result != KErrNone && result != KErrAlreadyExists ) - { - // all other erros cause leave: worker process creation fails, or - // kernel refuses to open existing semphore (== platform problem) - User::LeaveIfError( result ); - } - MPX_DEBUG1("vcxconnutil ## CVcxConnUtilPubSub::DefinePropertiesL() out"); - } - - -RProperty* CVcxConnUtilPubSub::GetProperty( TUint32 aKey ) - { - switch( aKey ) - { - case EVCxPSConnectionStatus: - return &( iConnectionStatePS->Property() ); - - case EVCxPSIapId: - return &iPropertyCurrentIAPId; - - case EVCxPSSnapId: - return &iPropertyCurrentSNAPId; - - case EVCxPSMasterExists: - return &( iMasterExistPS->Property() ); - - case EVCxPSNbrConnInstances: - return &iPropertyNbrOfInst; - - case EVCxPSRoamingRequestStatus: - return &( iRoamingReqStatusPS->Property() ); - - case EVCxPSNbrRoamResp: - return &( iNbrInstanceResp->Property() ); - - case EVCxPSNbRoamAccepted: - return &iPropertyAccepted; - - default: - break; - } - return 0; - } - -CVcxConnUtilSubscriber* CVcxConnUtilPubSub::GetSubscriber( TUint32 aKey ) - { - switch( aKey ) - { - case EVCxPSConnectionStatus: - return iConnectionStatePS; - - case EVCxPSMasterExists: - return iMasterExistPS; - - case EVCxPSRoamingRequestStatus: - return iRoamingReqStatusPS; - - case EVCxPSNbrRoamResp: - return iNbrInstanceResp; - - default: - break; - } - return 0; - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::IncCounterPubSubL() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::IncCounterPubSubL( TUint32 aKey ) - { - const TInt KIncValue( 1 ); - DoPSCounterIncrementL( aKey, KIncValue ); - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::DecNbrOfConnUsersPubSub() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::DecCounterPubSubL( TUint32 aKey ) - { - const TInt KDecValue( -1 ); - DoPSCounterIncrementL( aKey, KDecValue ); - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::DoPSCounterIncrementL() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::DoPSCounterIncrementL( TUint32 aKey, TInt aCalcFactor ) - { - if( aKey == EVCxPSNbrConnInstances || - aKey == EVCxPSNbrRoamResp || - aKey == EVCxPSNbRoamAccepted ) - { - RProperty* property = GetProperty( aKey ); - if( property ) - { - TInt value( 0 ); - TInt err( KErrNone ); - // entering critical section - iSemaCounter.Wait(); - err = property->Get( value ); - if( err == KErrNone ) - { - value += aCalcFactor; - err = property->Set( value ); - } - // leaving critical section - iSemaCounter.Signal(); - User::LeaveIfError( err ); - } - } - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::SetValue() -// ----------------------------------------------------------------------------- -// -TInt CVcxConnUtilPubSub::SetValue( TUint32 aKey, TInt aValue ) - { - TInt err( KErrNone ); - RProperty* property = GetProperty( aKey ); - if( property ) - { - err = property->Set( aValue ); - } - return err; - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::GetValue() -// ----------------------------------------------------------------------------- -// -TInt CVcxConnUtilPubSub::GetValue( TUint32 aKey, TInt& aValue ) - { - TInt err( KErrNone ); - RProperty* property = GetProperty( aKey ); - if( property ) - { - err = property->Get( aValue ); - } - return err; - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::CancelValueSubscribers() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::StartSubscibers( TUint32 aKey ) - { - if( !aKey ) - { - iConnectionStatePS->Start(); - iMasterExistPS->Start(); - iRoamingReqStatusPS->Start(); - iNbrInstanceResp->Start(); - } - else - { - CVcxConnUtilSubscriber* subscriber = GetSubscriber( aKey ); - if( subscriber ) - { - subscriber->Start(); - } - } - } - -// ----------------------------------------------------------------------------- -// CVcxConnUtilPubSub::CancelValueSubscribers() -// ----------------------------------------------------------------------------- -// -void CVcxConnUtilPubSub::CancelValueSubscribers( TUint32 aKey ) - { - if( !aKey ) - { - iConnectionStatePS->Cancel(); - iMasterExistPS->Cancel(); - iRoamingReqStatusPS->Cancel(); - iNbrInstanceResp->Cancel(); - } - else - { - CVcxConnUtilSubscriber* subscriber = GetSubscriber( aKey ); - if( subscriber ) - { - subscriber->Cancel(); - } - } - } -// end of file