--- /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 <CPEngNWSessionSlotManager2.h>
+
+#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<CPEngNWSessionSlotID2>& 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<CPEngNWSessionSlotID2>& 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
+
+
+
+