diff -r 000000000000 -r c53acadfccc6 metadataengine/server/inc/mdsnotifier.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metadataengine/server/inc/mdsnotifier.h Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,348 @@ +/* +* Copyright (c) 2002-2009 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: Notifier engine* +*/ + +#ifndef __MDSNOTIFIER_H__ +#define __MDSNOTIFIER_H__ + +#include + +#include "mdscommoninternal.h" + + +// forward declarations +class CMdSServerSession; +class CMdSNotifyComparator; +class CMdSSchema; +class CMdCSerializationBuffer; + +/** +* A class that contains notification profiles for clients. +* The class compares events against each profile and +* triggers the client side which then calls back the observer. +*/ +class CMdSNotifier : public CBase + { + public: // public construction + + /** static construction */ + static CMdSNotifier* NewL(); + static CMdSNotifier* NewLC(); + + /** destructor */ + virtual ~CMdSNotifier(); + + private: // private construction + + /** constructor */ + CMdSNotifier(); + + /** 2nd phase constructor */ + void ConstructL(); + + public: // methods + + /** + * An inner class for an entry in the array of listeners to + * notify for different notification profiles.Each entry + * contains the notification profiles against which to + * compare the event and the parameters required to perform + * the asynchronous notification. + */ + class TEntry + { + friend class CMdSNotifier; // accessible by host + + public: + + /** + * sets the entry up for asynchronous callback + * @param aMessage the asynchronous message + * @param aRemoteSize the pointer to remote message size buffer + */ + void SetupForCallback( RMessage2 aMessage, TInt aRemoteSizeMsgSlot ); + + /** + * Whether or not this entry has an asynchronous message + * pending + */ + TBool IsPending() { return ( iRemoteSizeMsgSlot!=KErrNotFound ); } + + /** the criteria folder */ + CMdCSerializationBuffer& Condition() + { + return *iSerializedCondition; + } + + /** + * Does this entry allow confidential data + * @return EFalse if not allowed + */ + TBool AllowConfidential() + { + return iConfidential; + } + + /** + * Return the id of this entry + * @return The id + */ + TInt Id() + { + return iId; + } + + /** + * Return the id of this entry + * @return The id + */ + TDefId NamespaceDefId() + { + return iNamespaceDefId; + } + + /** + * Trigger a previously cached notification + * @param aCompleteCode The code to complete the message + * @param aData The data hierarchy to send to the client, + * ownership changes only if method doesn't leave + * @return none + */ + void TriggerCachedL(TUint32 aCompleteCode, CMdCSerializationBuffer* aData); + + /** + * Get the data buffer + * @return the serialised data buffer + */ + CMdCSerializationBuffer* GetDataBuffer(); + + private: // methods for host class + + /** constructor */ + TEntry( TInt aId, TConditionType aType, + CMdCSerializationBuffer* aSerializedBuffer, + TDefId aNamespaceDefId, + CMdSServerSession& aSession, TBool aConfidential ); + + /** + * Triggers the notifier causing the observer to be + * notifier with the given code. + * @param aCompleteCode either added/removed/modified + * @param aItem the target of the event + */ + void TriggerL( TUint32 aCompleteCode, + const RArray& aIdArray ); + + /** + * Triggers the notifier causing the observer to be + * notifier with the given code. + * + * @param aCompleteCode either added/removed/modified + * @param aBuffer relation items of the event + * @param aRelationIdArray matched relation ids + */ + void TriggerRelationItemsL( TUint32 aCompleteCode, + CMdCSerializationBuffer& aBuffer, + const RArray& aRelationIdArray ); + + /** + * Trigger a notification of a schema change + */ + void TriggerSchema(); + + /** + * The entry has currently no message active, + * wait until one is available. + */ + void CacheL(TUint32 aCompleteCode, const RArray& aIdArray ); + + /** + * The entry has currently no message active, + * wait until one is available. + */ + void CacheRelationItemsL(TUint32 aCompleteCode, + CMdCSerializationBuffer& aBuffer, + const RArray& aRelationIdArray); + + /** + * cache schema notification + */ + void CacheL(TUint32 aCompleteCode); + + /** + * Triggers the notifier with an error code + * @param aErrorCode one of system-wide error codes + */ + void TriggerError( TInt aErrorCode ); + + /** + * Copy all IDs from the array in to the buffer + * + * @param aIdArray ID array + * @return new buffer + */ + CMdCSerializationBuffer* CopyToBufferL( + const RArray& aIdArray); + + /** + * Copy matched relation IDs to a buffer + * + * @param aRelationItemsBuffer serialized items + * @param aIdArray matched IDs + * @return new buffer + */ + CMdCSerializationBuffer* CopyItemsToBufferL( + CMdCSerializationBuffer& aRelationItemsBuffer, + const RArray& aIdArray); + private: + + /** id */ + TInt iId; + + /** type of the notification */ + TUint32 iType; + + /** namespace definition ID */ + TDefId iNamespaceDefId; + + /** actual serialized condition */ + CMdCSerializationBuffer* iSerializedCondition; + + /** + * serialised id or relation items buffer. + * Used instead of iDataObject when + * sending object ids to the clients + */ + CMdCSerializationBuffer* iDataBuffer; + + /** asynchronous message */ + RMessage2 iMessage; + + /** pointer to remote size buffer */ + TInt iRemoteSizeMsgSlot; + + /** the session */ + CMdSServerSession& iSession; + + TBool iConfidential; + }; + + /** + * creates a notifier entry + * @param aId id of the entry to be created + * @param aType type of the notifier (object/relation/event) + * @param aCriteria the serialized criteria to compare against + * @param aSession the session that owns the notificant + * @param aConfidential Does the session get notifications of confidential items + * @return reference to the created entry + */ + TEntry& CreateEntryL( TInt aId, TConditionType aType, + CMdCSerializationBuffer* aSerializedBuffer, TDefId aNamespaceDefId, + CMdSServerSession& aSession, TBool aConfidential); + + /** + * finds an entry by its id, if not found leaves with KErrNotFound + * @param aId id of the entry + * @return reference to the entry found + */ + TEntry& FindEntryL( TInt aId ); + + /** + * removes a notifier entry, if not found leaves with KErrNotFound + * @param aId id of the entry to be removed + */ + void RemoveEntryL( TInt aId ); + + /** + * removes all notifier entries that belong to a certain session + * @param aSession session who's notify entries are to be removed + */ + void RemoveEntriesBySession(const CMdSServerSession& aSession ); + + /** + * notifiers that items has been added + * @param aSerializedItems serialized items + * @param aSerializedItemIds serialized item IDs + */ + void NotifyAddedL(CMdCSerializationBuffer& aSerializedItems, + CMdCSerializationBuffer& aSerializedItemIds); + + /** + * notifiers that items has been modified + * @param aSerializedItems serialized items + * @param aSerializedItemIds serialized item IDs + */ + void NotifyModifiedL(CMdCSerializationBuffer& aSerializedItems, + CMdCSerializationBuffer& aSerializedItemIds); + + /** + * notifiers that items has been modified + * @param aObjectIds object IDs + */ + void NotifyModifiedL(const RArray& aObjectIds); + + /** + * notifiers that objects has been set to present or not present state + * @param aPresent are object present state changed to present or not present + * @param aObjectIds object IDs + */ + void NotifyObjectPresent(TBool aPresent, const RArray& aObjectIds); + + /** + * notifiers that objects has been set to present or not present state + * @param aPresent are object present state changed to present or not present + * @param aObjectIds object IDs + */ + void NotifyRelationPresent(TBool aPresent, const RArray& aObjectIds); + + /** + * notify about removed relation items + * + * @param aRemovedRelations removed relations + * @param aAdditionalRemovedRelations possible additional removed relations + */ + void NotifyRemovedRelationItemsL( CMdCSerializationBuffer& aBuffer ); + + /** + * Notifiers that items has been removed. + * Can be only used for default namespace. + * + * @param aItemIdArray modified item IDs + */ + void NotifyRemovedL(const RArray& aItemIdArray); + + /** + * notifiers that items has been removed + * @param aSerializedItemIds serialized item IDs + * @param aItemIsConfidential are items confidential + */ + void NotifyRemovedL(CMdCSerializationBuffer& aSerializedItemIds, TBool aItemIsConfidential ); + + void NotifySchemaAddedL(); + + TBool CheckForNotifier( TUint32 aNotifyTypes ); + + private: // data members + + /** the entry array */ + RArray iEntries; + + /** the comparator */ + CMdSNotifyComparator* iComparator; + + TInt iDataAccessCount; + }; + +#endif // __MDSNOTIFIER_H__