diff -r 000000000000 -r 094583676ce7 PECengine/PresenceManager2/SrcNWSessionSlot/CPEngNWSessionSlotManager2Imp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceManager2/SrcNWSessionSlot/CPEngNWSessionSlotManager2Imp.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: API implementation to manage NWSessionSlots. +* +*/ + +// INCLUDE FILES +#include + +#include "CPEngNWSessionSlotManager2Imp.h" +#include "CPEngNWSessionSlotID2.h" +#include "CPEngNWSessionSlotID2Imp.h" + + +#include "PEngStorageManager.h" +#include "CPEngSessionSlotState.h" +#include "CPEngSessionSlotId.h" + + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngNWSessionSlotManager2Imp* CPEngNWSessionSlotManager2Imp::NewL( + CPEngNWSessionSlotManager2& aInterface, + TInt aPriority ) + { + CPEngNWSessionSlotManager2Imp* self = + new ( ELeave ) CPEngNWSessionSlotManager2Imp( aInterface, aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + + +// Destructor +CPEngNWSessionSlotManager2Imp::~CPEngNWSessionSlotManager2Imp() + { +#if _BullseyeCoverage + cov_write(); +#endif + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::CPEngNWSessionSlotManager2Imp +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngNWSessionSlotManager2Imp::CPEngNWSessionSlotManager2Imp( CPEngNWSessionSlotManager2& aInterface, + TInt aPriority ) + : iInterface( aInterface ), + iCActivePriority( aPriority ) + { + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotManager2Imp::ConstructL() + { + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::CreateNWSessionSlot() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotManager2Imp::CreateNWSessionSlot( + const CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + const CPEngNWSessionSlotID2Imp* slotIDImp = aNWSessionSlotID.Implementation(); + if ( !slotIDImp->IsFullyDefined() ) + { + return KErrArgument; + } + + TRAPD( err, PEngStorageManager::CreateSessionFolderL( slotIDImp->BasePart(), + slotIDImp->AppId() ) ); + + return err; + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::RemoveNWSessionSlot() +// ----------------------------------------------------------------------------- +// +TInt CPEngNWSessionSlotManager2Imp::RemoveNWSessionSlot( + const CPEngNWSessionSlotID2& aNWSessionSlotID ) + { + const CPEngNWSessionSlotID2Imp* slotIDImp = aNWSessionSlotID.Implementation(); + if ( !slotIDImp->IsFullyDefined() ) + { + return KErrArgument; + } + + TRAPD( err, PEngStorageManager::RemoveSessionFolderL( slotIDImp->BasePart(), + slotIDImp->AppId() ) ); + + return err; + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::GetNWSessionSlotsL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotManager2Imp::GetNWSessionSlotsL( + RPointerArray& aNWSessionSlotIDs, + const CPEngNWSessionSlotID2* aMatchPattern, + TPEngNWSessionSlotState* aMatchState ) const + { + //Get list of existing slot states + RObjectArray< CPEngSessionSlotState > allSlots; + CleanupClosePushL( allSlots ); + PEngStorageManager::AllSessionSlotsStatesL( allSlots ); + + + //Generate client side slotId's from existing and matching + //NWSessionSlots + TInt allSlotsCount = allSlots.Count(); + for ( TInt ix = 0; ix < allSlotsCount; ix++ ) + { + const CPEngSessionSlotState* handledSlot = allSlots[ ix ]; + CPEngSessionSlotId& ssBaseId = handledSlot->SessionSlotId(); + + const MDesC16Array& regApps = handledSlot->RegisteredApplications(); + const MDesC16Array& activeApps = handledSlot->ActiveApplications(); + DoGenerateMatchingSlotIdsL( aNWSessionSlotIDs, + ssBaseId, + regApps, + activeApps, + aMatchPattern, + aMatchState ); + } + + CleanupStack::PopAndDestroy(); //slotStates + } + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::ExistsNWSessionSlotL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotManager2Imp::ExistsNWSessionSlotL( + const CPEngNWSessionSlotID2& aNWSessionSlotID ) const + { + const CPEngNWSessionSlotID2Imp* slotIDImp = aNWSessionSlotID.Implementation(); + if ( !slotIDImp->IsFullyDefined() ) + { + User::Leave( KErrArgument ); + } + + //Try get the wanted slot + const CPEngSessionSlotId& wantedBaseId = aNWSessionSlotID.Implementation()->BasePart(); + CPEngSessionSlotState* wantedSlotState = CPEngSessionSlotState::NewLC(); + PEngStorageManager::SessionSlotStateL( wantedBaseId, *wantedSlotState ); + + + //Check if base & AppId's match to given match pattern + TInt matchStatus = KErrNotFound; + if ( wantedSlotState->SessionSlotId().Match( wantedBaseId ) == KErrNone ) + { + const MDesC16Array& apps = wantedSlotState->RegisteredApplications(); + + TInt appsCount = apps.MdcaCount(); + for ( TInt ii = 0; ii < appsCount; ii++ ) + { + TPtrC16 appId( apps.MdcaPoint( ii ) ); + matchStatus = aNWSessionSlotID.Implementation()->MatchAppIdPart( appId ); + if ( matchStatus == KErrNone ) + { + break; + } + } + } + + CleanupStack::PopAndDestroy( wantedSlotState ); + User::LeaveIfError( matchStatus ); + } + + + + +// ----------------------------------------------------------------------------- +// IsIdMatch() +// ----------------------------------------------------------------------------- +// +TBool IsIdMatch( const CPEngNWSessionSlotID2* aSlotIdMatcher, + const CPEngNWSessionSlotID2& aSlotId ) + { + TBool idMatch = ETrue; + + if ( aSlotIdMatcher ) + { + idMatch = ( aSlotId.MatchFullId( *aSlotIdMatcher ) == KErrNone ); + } + + return idMatch; + } + + +// ----------------------------------------------------------------------------- +// HasApp() +// ----------------------------------------------------------------------------- +// +TBool HasApp( const MDesC16Array& aActiveApps, const TDesC& aAppId ) + { + const TInt activeAppCount = aActiveApps.MdcaCount(); + for ( TInt ii = 0; ii < activeAppCount; ii++ ) + { + TPtrC app = aActiveApps.MdcaPoint( ii ); + if ( app == aAppId ) + { + return ETrue; + } + } + + return EFalse; + } + + +// ----------------------------------------------------------------------------- +// IsStateMatch() +// ----------------------------------------------------------------------------- +// +TBool IsStateMatch( const TPEngNWSessionSlotState* aSlotStateMatcher, + const MDesC16Array& aActiveApps, + const CPEngNWSessionSlotID2& aSlotId ) + { + TBool stateMatch = ETrue; + + if ( aSlotStateMatcher ) + { + if ( *aSlotStateMatcher == EPEngNWPresenceSessionClosed ) + { + //only closed apps wanted -> app id may not exist in aActiveApps + stateMatch = !HasApp( aActiveApps, aSlotId.AppId() ); + } + + if ( *aSlotStateMatcher == EPEngNWPresenceSessionOpen ) + { + //only open apps wanted -> app id must be found from aActiveApps + stateMatch = HasApp( aActiveApps, aSlotId.AppId() ); + } + } + + return stateMatch; + } + + + +// ----------------------------------------------------------------------------- +// CPEngNWSessionSlotManager2Imp::DoGenerateMatchingSlotIdsL() +// ----------------------------------------------------------------------------- +// +void CPEngNWSessionSlotManager2Imp::DoGenerateMatchingSlotIdsL( + RPointerArray& aNWSessionSlotIDs, + CPEngSessionSlotId& aSessionSlotBaseId, + const MDesC16Array& aRegApps, + const MDesC16Array& aActiveApps, + const CPEngNWSessionSlotID2* aSlotIdMatcher, + TPEngNWSessionSlotState* aSlotStateMatcher ) const + { + const TInt regAppCount = aRegApps.MdcaCount(); + + for ( TInt ii = 0; ii < regAppCount; ii++ ) + { + CPEngNWSessionSlotID2* slotId = CPEngNWSessionSlotID2::NewLC(); + CPEngNWSessionSlotID2Imp* slotIdImp = slotId->Implementation(); + + slotIdImp->SetAllL( aSessionSlotBaseId, + aRegApps.MdcaPoint( ii ) ); + + TBool idMatch = IsIdMatch( aSlotIdMatcher, *slotId ); + TBool stateMatch = IsStateMatch( aSlotStateMatcher, aActiveApps, *slotId ); + + if ( idMatch && stateMatch ) + { + User::LeaveIfError( aNWSessionSlotIDs.Append( slotId ) ); + CleanupStack::Pop( slotId ); + } + else + { + CleanupStack::PopAndDestroy( slotId ); + } + } + } + + + +// End of File + + + +