/*
* Copyright (c) 2006-2006 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: CFContextManager.
*
*/
#ifndef C_CFCONTEXTMANAGER_H
#define C_CFCONTEXTMANAGER_H
// INCLUDES
#include "cfcontextobject.h"
#include "CFSecurityChecker.h"
#include <e32base.h>
#include <f32file.h>
#include "CFContextQueryImpl.h"
#include "CFContextObjectImpl.h"
// FORWARD DECLARATIONS
//class TCFSubscription;
class CCFCacheElement;
class CCFContextSubscription;
class CCFContextSubscriptionImpl;
class MCFContextSubscriptionListener;
class MCFContextSource;
class CCFContextDataObject;
typedef TBool ( CCFContextQueryImpl::*queryMatchFunction )
( const TDesC&, const TDesC& ) const;
/**
* Front-end class for data storage access.
* Data storage service provider for CF Server. This manager stores contexts
* into a cache.
*
* The cache stores the latest context for each type for fast change
* comparison (and quick query latest response).
*/
NONSHARABLE_CLASS( CCFContextManager ): public CBase
{
public: // constructors and destructor
static CCFContextManager* NewL( MCFSecurityChecker& aSecurityChecker );
static CCFContextManager* NewLC( MCFSecurityChecker& aSecurityChecker );
~CCFContextManager();
public: // new functions
/**
* Defines a new context in Context Framework.
* Every context needs to be defined before it can be published
* and subscribed.
* If the context is already defined KErrPermissionDenied is
* returned.
*
* @since S60 5.0
* @param aContextSource Source of the context.
* @param aContextType Type of the context.
* @param aReadSecurityPolicy Needed read capabilities for the context.
* @param aWriteSecurityPolicy Needed write capabilities for the context
* @return None
*/
void DefineContextL( const TDesC& aContextSource,
const TDesC& aContextType,
const TSecurityPolicy& aReadSecurityPolicy,
const TSecurityPolicy& aWriteSecurityPolicy);
/**
* Defines a new context in Context Framework.
* Every context needs to be defined before it can be published
* and subscribed.
* If the context is already defined KErrPermissionDenied is
* returned.
*
* @since S60 5.0
* @param aContextSource Source of the context.
* @param aContextType Type of the context.
* @param aReadSecurityPolicy Needed read capabilities for the context.
* @param aWriteSecurityPolicy Needed write capabilities for the context
* @param aContextPublisher Interface to which the information whether
* this context has subscribers or not is reported, can be also NULL.
* @param aPublisherUid Secure UID of the process which registered
* this context. Only process with the same SID is able to reregister
* context in the purpose registering aContextPublisher.
* @return None
*/
void DefineContextL( const TDesC& aContextSource,
const TDesC& aContextType,
const TSecurityPolicy& aReadSecurityPolicy,
const TSecurityPolicy& aWriteSecurityPolicy,
MCFContextSource* aContextPublisher,
const TUid& aPublisherUid );
/**
* Publishes a new context object.
* The new context value is cached and needed indications
* for context subscribers are sent.
* Leaves with:
* - KErrNotFound, context not defined
* - KErrAccessDenied, insufficient capabilities to write the context
*
* @since S60 5.0
* @param aContext New context object.
* @param aClientThread Handle to the current client.
* @return None.
*/
void PublishContextL( CCFContextObject& aContext,
RThread& aClientThread );
/**
* Publishes a new context object.
* The new context value is cached and needed indications
* for context subscribers are sent.
* The data object is also sent to subscribers currently
* interested from the data.
*
* @since S60 5.0
* @param aContext New context object.
* @param aClientThread Handle to the current client.
* @param aData Data object associated with the context.
* @return None.
*/
void PublishContextL( CCFContextObject& aContext,
RThread& aClientThread,
CCFContextDataObject& aData );
/**
* Gets contexts of specified type.
* Tries to retrieve from cache the requested contexts using the given
* request (query) type. The requested context type can be partial
* ontology path.
*
* @param aResultBuffer Storage for the requested contexts.
* @param aContextQuery Settings for the request (query).
*/
void RequestContextL(
RContextObjectArray& aResultBuffer,
CCFContextQuery& aContextQuery,
RThread& aClientThread );
/**
* Requests specified context object.
* @param aContextType: Specifies the context type requested
* @param aContextSource: Specifies the context source
* @return CCFContextObject*
*/
CCFContextObject* RequestContextL(
const TDesC& aContextType,
const TDesC& aContextSource,
RThread& aClientThread );
/**
*
* @since S60 5.0
* @param aParam1 Explanation.
* @param aParam2 Explanation.
* @return None
*/
void SubscribeContextL( CCFContextSubscription* aSubscription,
MCFContextSubscriptionListener* aListener,
RThread& aClientThread );
/**
*
* @since S60 5.0
* @param aParam1 Explanation.
* @param aParam2 Explanation.
* @return ETrue if cache element(s) was added to cleanup array
* (subscription was nullified, not removed), EFalse otherwise.
*/
TBool RemoveSubscription( CCFContextSubscription& aSubscription,
MCFContextSubscriptionListener& aListener );
/**
*
* @since S60 5.0
* @param aParam1 Explanation.
* @param aParam2 Explanation.
* @return ETrue if cache element(s) was added to cleanup array
* (subscription(s) was nullified, not removed), EFalse otherwise.
*/
TBool RemoveSubscriptions(
MCFContextSubscriptionListener* aListener );
/**
* Cleanups context cache element's subscriptions by removing nullified
* subscriptions for all cache elements added to the cleanup array.
*
* @since S60 5.0
* @return None.
*/
void CleanupCacheElementSubscriptions();
/**
* Gets the read security policy of particular action.
*
* @param aContextSource Context Source.
* @param aContextType Context Type.
* @param aPolicy security policy which will be set by this method.
* @return None.
*/
void GetReadSecurityPolicyL( const TDesC& aContextSource,
const TDesC& aContextType,
TSecurityPolicy& aPolicy );
/**
* Gets the write security policy of particular action.
*
* @param aContextSource Context Source.
* @param aContextType Context Type.
* @param aPolicy security policy which will be set by this method.
* @return None.
*/
void GetWriteSecurityPolicyL( const TDesC& aContextSource,
const TDesC& aContextType,
TSecurityPolicy& aPolicy );
/**
* Deregister context publisher for all contexts it has been
* registered as a publisher.
* This has to be called before context publisher can be deleted.
* @param aPublisher Publisher to be deregistered.
*/
void DeregisterPublisher( MCFContextSource& aPublisher );
/**
* Validates that the context can be published.
* Checks that the context is defined and the client has sufficient
* capabilities to write to the context.
*
* Leaves with:
* - KErrNotFound, context not defined
* - KErrAccessDenied, insufficient capabilities to write the context
*
* @since S60 5.0
* @param aContext New context object.
* @param aClientThread Handle to the current client.
* @return None.
*/
void ValidatePublishContextL( CCFContextObject& aContext,
RThread& aClientThread );
/**
* Executes the actual publishing for the context.
* ValidatePublishContextL() must have been called before calling this
* because security is not checked by this function.
*
* Leaves with:
* - KErrNotFound, context not defined
* - any other system-wide error code
*
* @since S60 5.0
* @param aContext New context object.
* @param aData Data object associated with the context.
* @return None.
*/
void DoPublishContextL( CCFContextObject& aContext,
CCFContextDataObject* aData = NULL );
private: // Constructors
CCFContextManager( MCFSecurityChecker& aSecurityChecker );
void ConstructL();
private: // New functions
// Notifies data manager that new subscription has been added.
void SubscriptionAddedL( CCFContextSubscriptionImpl& aSubscription,
RThread& aClientThread );
// Notifies data manager that subscription has been removed.
// Returns value ETrue if cache element(s) was added to cleanup array,
// EFalse otherwise.
TBool SubscriptionRemoved( CCFContextSubscriptionImpl& aSubscription );
// Finalizes security check.
TInt DoReadSecurityCheck( CCFCacheElement& aContextCache,
RThread& aClientThread );
// Checks if the particular client has write access to particular
// cache element
TInt DoWriteSecurityCheck( CCFCacheElement& aContextCache,
RThread& aClientThread );
// Gets latest context values from context cache based on the specified
// query.
void GetLatestFromCacheL(
RContextObjectArray& aLatestContexts,
queryMatchFunction aMatchFunction,
const CCFContextQueryImpl& aContextQuery,
RThread* aClientThread );
// Logs context cache
void LogContextCache();
// Checks if the current client is from the same process
TBool RequestFromSameProcess( RThread& aClientThread );
// Request contexts
void DoRequestContextL( RContextObjectArray& aResultBuffer,
CCFContextQuery& aContextQuery,
RThread* aClientThread );
// From MCFSubscriptionManager
void CacheElementAddedL( CCFCacheElement& aCacheElement );
// Checks if context re-define is allowed
TBool RedefineAllowed( CCFCacheElement& aElement,
const MCFContextSource* aSource,
const TUid& aUid ) const;
private: // Member variables
// Previous context instance for subscriber indications.
CCFContextObject* iPreviousContext;
// Context cache.
RPointerArray<CCFCacheElement> iContextCache;
// A "linear order" instance.
TLinearOrder<CCFCacheElement>* iCacheOrder;
//
CCFCacheElement* iCacheSearchKey;
// Own: Subscriptions
RPointerArray<CCFContextSubscriptionImpl> iSubscriptions;
// Security checker interface.
MCFSecurityChecker* iSecurityChecker;
// Signals SubscriptionRemoved() that manager is in the middle of
// publishing context. Needed for context operations and context sources
// removing their subscriptions based on context indication, and doing
// it as a synchronous operation during the indication process.
// Not owned.
CCFCacheElement* iPublishingForCacheElement;
// Cleanup array for cache elements having nullified subscriptions,
// pointers are not owned.
RPointerArray< CCFCacheElement > iCleanupCacheElements;
};
#endif // C_CFCONTEXTMANAGER_H
// End of File