--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/profilesservices/ProfileEngine/WrapperSrc/CProEngNotifyHandlerImpl.cpp Thu Dec 17 08:52:52 2009 +0200
@@ -0,0 +1,277 @@
+/*
+* Copyright (c) 2002-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: Implementation of CProEngNotifyHandlerImpl.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CProEngNotifyHandlerImpl.h"
+#include <MProEngProfileActivationObserver.h>
+#include <MProEngActiveProfileObserver.h>
+#include <MProEngProfileObserver.h>
+#include <MProEngProfileNameArrayObserver.h>
+#include "ProfileEngineConstants.h"
+#include "ProfileEnginePrivateCRKeys.h"
+#include "ProfileEnginePrivatePSKeys.h"
+#include "CProEngProfileActivationDelegate.h"
+#include "CProEngActiveProfileDelegate.h"
+#include "CProEngProfileNameArrayEventDelegate.h"
+#include "CProEngProfileEventDelegate.h"
+
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CompareDelegates
+//
+// Comparison function to check that RPointerArray does not already
+// contain the given delegate for profile events
+// -----------------------------------------------------------------------------
+
+TBool CompareDelegates( const CProEngProfileEventDelegate& aDelegate1,
+ const CProEngProfileEventDelegate& aDelegate2 )
+ {
+ return ( aDelegate1.ProfileId() == aDelegate2.ProfileId() );
+ }
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::CProEngNotifyHandlerImpl
+// -----------------------------------------------------------------------------
+//
+CProEngNotifyHandlerImpl::CProEngNotifyHandlerImpl()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CProEngNotifyHandlerImpl* CProEngNotifyHandlerImpl::NewL()
+ {
+ return new ( ELeave ) CProEngNotifyHandlerImpl();
+ }
+
+// Destructor
+CProEngNotifyHandlerImpl::~CProEngNotifyHandlerImpl()
+ {
+ CancelAll();
+ //iProfileEventDelegates.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::RequestProfileActivationNotifications
+// -----------------------------------------------------------------------------
+//
+TInt CProEngNotifyHandlerImpl::RequestProfileActivationNotificationsL(
+ MProEngProfileActivationObserver& aObserver )
+ {
+ if( iActiveIdEventDelegate )
+ {
+ return KErrAlreadyExists;
+ }
+
+ iActiveIdEventDelegate =
+ CProEngProfileActivationDelegate::NewL( aObserver );
+
+ // make the actual request to the Publish & Subscribe:
+ TInt result( iActiveIdEventDelegate->RequestNotification() );
+ if( result != KErrNone )
+ {
+ delete iActiveIdEventDelegate;
+ iActiveIdEventDelegate = NULL;
+ }
+
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::RequestActiveProfileNotificationsL
+// -----------------------------------------------------------------------------
+//
+TInt CProEngNotifyHandlerImpl::RequestActiveProfileNotificationsL(
+ MProEngActiveProfileObserver& aObserver )
+ {
+ if( iActiveProfileEventDelegate )
+ {
+ return KErrAlreadyExists;
+ }
+
+ iActiveProfileEventDelegate = new ( ELeave ) CProEngActiveProfileDelegate(
+ aObserver );
+
+ // make the actual request to the Publish & Subscribe:
+ TInt result( iActiveProfileEventDelegate->RequestNotification() );
+ if( result != KErrNone )
+ {
+ delete iActiveProfileEventDelegate;
+ iActiveProfileEventDelegate = NULL;
+ }
+
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::RequestProfileNotificationsL
+// -----------------------------------------------------------------------------
+//
+TInt CProEngNotifyHandlerImpl::RequestProfileNotificationsL(
+ MProEngProfileObserver& aObserver,
+ TInt aProfileId )
+ {
+ if( ( aProfileId < 0 ) || // profile id cannot be negative
+ // or greater than the last dynamic profile id
+ ( aProfileId > KProfileBaseDynamicProfileId +
+ KProfilesMaxNumberOfDynamicProfiles ) )
+ {
+ return KErrNotFound;
+ }
+
+ CProEngProfileEventDelegate* delegate = CProEngProfileEventDelegate::NewL(
+ aProfileId, aObserver );
+
+ TIdentityRelation<CProEngProfileEventDelegate> relation( CompareDelegates );
+ if( iProfileEventDelegates.Find( delegate, relation ) != KErrNotFound )
+ { // an observer has already been registered for the given profile id
+ delete delegate;
+ return KErrAlreadyExists;
+ }
+
+ TInt result( iProfileEventDelegates.Append( delegate ) );
+ if( result == KErrNone )
+ {
+ // make the actual request to the Central Repository:
+ result = delegate->RequestNotification();
+ }
+
+ if( result != KErrNone )
+ {
+ iProfileEventDelegates.Remove( iProfileEventDelegates.Count() - 1 );
+ delete delegate;
+ }
+
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::RequestProfileNameArrayNotificationsL
+// -----------------------------------------------------------------------------
+//
+TInt CProEngNotifyHandlerImpl::RequestProfileNameArrayNotificationsL(
+ MProEngProfileNameArrayObserver& aObserver )
+ {
+ if( iNameArrayEventDelegate )
+ {
+ return KErrAlreadyExists;
+ }
+
+ iNameArrayEventDelegate = CProEngProfileNameArrayEventDelegate::NewL(
+ aObserver );
+
+ // make the actual request to the Central Repository:
+ TInt result( iNameArrayEventDelegate->RequestNotification() );
+ if( result != KErrNone )
+ {
+ delete iNameArrayEventDelegate;
+ iNameArrayEventDelegate = NULL;
+ }
+
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::CancelProfileActivationNotifications
+// -----------------------------------------------------------------------------
+//
+void CProEngNotifyHandlerImpl::CancelProfileActivationNotifications()
+ {
+ if( iActiveIdEventDelegate )
+ {
+ iActiveIdEventDelegate->Cancel();
+ delete iActiveIdEventDelegate;
+ iActiveIdEventDelegate = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::CancelActiveProfileNotifications
+// -----------------------------------------------------------------------------
+//
+void CProEngNotifyHandlerImpl::CancelActiveProfileNotifications()
+ {
+ if( iActiveProfileEventDelegate )
+ {
+ iActiveProfileEventDelegate->Cancel();
+ delete iActiveProfileEventDelegate;
+ iActiveProfileEventDelegate = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::CancelProfileNotifications
+// -----------------------------------------------------------------------------
+//
+void CProEngNotifyHandlerImpl::CancelProfileNotifications( TInt aProfileId )
+ {
+ TInt count( iProfileEventDelegates.Count() );
+ for( TInt i( 0 ); i<count; ++i )
+ {
+ if( iProfileEventDelegates[i]->ProfileId() == aProfileId )
+ {
+ CProEngProfileEventDelegate* delegate = iProfileEventDelegates[i];
+ iProfileEventDelegates.Remove( i );
+ delegate->Cancel();
+ delete delegate;
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::CancelProfileNameArrayNotifications
+// -----------------------------------------------------------------------------
+//
+void CProEngNotifyHandlerImpl::CancelProfileNameArrayNotifications()
+ {
+ if( iNameArrayEventDelegate )
+ {
+ iNameArrayEventDelegate->Cancel();
+ delete iNameArrayEventDelegate;
+ iNameArrayEventDelegate = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CProEngNotifyHandlerImpl::CancelAll
+// -----------------------------------------------------------------------------
+//
+void CProEngNotifyHandlerImpl::CancelAll()
+ {
+ CancelProfileActivationNotifications();
+ CancelActiveProfileNotifications();
+ CancelProfileNameArrayNotifications();
+ TInt count = iProfileEventDelegates.Count();
+ for( TInt i( 0 ); i<count; ++i )
+ {
+ iProfileEventDelegates[i]->Cancel();
+ }
+ iProfileEventDelegates.ResetAndDestroy();
+ }
+
+// End of File
+