diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/inc/cfserver/CFContextManager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfw/inc/cfserver/CFContextManager.h Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,364 @@ +/* +* 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 +#include + +#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 iContextCache; + + // A "linear order" instance. + TLinearOrder* iCacheOrder; + + // + CCFCacheElement* iCacheSearchKey; + + // Own: Subscriptions + RPointerArray 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