--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/metadataengine/client/inc/mdesessionimpl.h Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,672 @@
+/*
+* Copyright (c) 2005-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: Metadata engine client session implementation*
+*/
+
+
+#ifndef __MDESESSIONIMPL_H__
+#define __MDESESSIONIMPL_H__
+
+#include "mdesession.h"
+#include "mdeenginesession.h"
+#include "mdscommoninternal.h"
+
+
+// forward declarations
+class CMdENotifierAO;
+class CMdEDataBuffer;
+class CMdCSerializationBuffer;
+class CMdESessionStartupAO;
+class CMdESessionAsyncHandler;
+
+class RMdESessionAsyncRequest
+ {
+ friend class CMdESessionAsyncHandler;
+ private:
+ enum TRequestType
+ {
+ EAddRequest,
+ EUpdateRequest,
+ ERemoveRequest
+ };
+
+ RMdESessionAsyncRequest(TRequestType aRequestType,
+ CMdCSerializationBuffer* aBuffer,
+ CMdCSerializationBuffer& aResultBuffer,
+ TRequestStatus& aRequestStatus);
+
+ void Close();
+
+ private:
+ TRequestType iRequestType;
+ CMdCSerializationBuffer* iBuffer;
+ CMdCSerializationBuffer* iResultBuffer;
+ TRequestStatus* iRequestStatus;
+ };
+
+NONSHARABLE_CLASS(CMdESessionAsyncHandler) : public CActive
+{
+public:
+ void AddRequest( CMdCSerializationBuffer* aBuffer,
+ CMdCSerializationBuffer& aResultBuffer,
+ TRequestStatus& aRequestStatus );
+
+ void UpdateRequest( CMdCSerializationBuffer * aBuffer,
+ CMdCSerializationBuffer& aResultBuffer,
+ TRequestStatus& aRequestStatus );
+
+ void RemoveRequest( CMdCSerializationBuffer* aBuffer,
+ CMdCSerializationBuffer& aResultBuffer,
+ TRequestStatus& aRequestStatus );
+
+ static CMdESessionAsyncHandler* NewL(CMdESessionImpl& aSession,
+ RMdEEngineSession &aEngineSession);
+
+ static CMdESessionAsyncHandler* NewLC( CMdESessionImpl& aSession,
+ RMdEEngineSession &aEngineSession );
+
+ ~CMdESessionAsyncHandler();
+
+
+private:
+ void RunL();
+
+ TInt RunError(TInt aError);
+
+ void DoCancel();
+
+ CMdESessionAsyncHandler(CMdESessionImpl& aSession,
+ RMdEEngineSession &aEngineSession);
+
+ void ConstructL();
+
+private:
+ RArray<RMdESessionAsyncRequest> iRequests;
+ CMdESessionImpl& iSession;
+ RMdEEngineSession& iEngineSession;
+};
+
+/**
+ * Metadata engine session implementation.
+ */
+NONSHARABLE_CLASS(CMdESessionImpl) : public CMdESession
+ {
+ friend class CMdESessionStartupAO;
+
+ public: // Constructors and destructor.
+
+ /**
+ * Constructor.
+ *
+ * @param aObserver observer to notify when opening the session has
+ * been completed
+ */
+ CMdESessionImpl( MMdESessionObserver& aObserver );
+
+ /**
+ * Second-phase constructor.
+ */
+ void ConstructL();
+
+ /**
+ * Destructor.
+ */
+ virtual ~CMdESessionImpl();
+
+ /** From MdESession */
+ TInt NamespaceDefCount() const;
+
+ /** From MdESession */
+ CMdENamespaceDef& NamespaceDefL(TInt aIndex);
+
+ /** From MdESession */
+ CMdENamespaceDef& GetNamespaceDefL(const TDesC& aName);
+
+ CMdENamespaceDef& GetNamespaceDefL(TDefId aId);
+
+ /** From MdESession */
+ CMdENamespaceDef& GetDefaultNamespaceDefL();
+
+ /** From MdESession */
+ CMdEObject* NewObjectL( CMdEObjectDef& aDef, const TDesC& aUri,
+ TUint32 aMediaId = 0 );
+
+ /** From MdESession */
+ CMdEObject* NewObjectLC( CMdEObjectDef& aDef, const TDesC& aUri,
+ TUint32 aMediaId = 0 );
+
+ /** From MdESession */
+ TInt AddObjectsL(RPointerArray<CMdEObject>& aObjects);
+
+ /** From MdESession */
+ void CommitObjectL(CMdEObject& aObject);
+
+ /** From MdESession */
+ void CommitObjectsL(RPointerArray<CMdEObject>& aObjects);
+
+ /** From MdESession */
+ TItemId CancelObjectL(CMdEObject& aObject);
+
+ /** From MdESession */
+ CMdERelation* NewRelationLC(CMdERelationDef& aDef,
+ TItemId aLeftObjectId, TItemId aRightObjectId,
+ TInt32 aParameter);
+
+ /** From MdESession */
+ CMdERelation* NewRelationL(CMdERelationDef& aDef,
+ TItemId aLeftObjectId, TItemId aRightObjectId,
+ TInt32 aParameter);
+
+ /** From MdESession */
+ CMdEEvent* NewEventLC(CMdEEventDef& aDef, TItemId aObjectId,
+ TTime aTime, const TDesC* aSource, const TDesC* aParticipant);
+
+ /** From MdESession */
+ CMdEEvent* NewEventL(CMdEEventDef& aDef, TItemId aObjectId,
+ TTime aTime, const TDesC* aSource, const TDesC* aParticipant);
+
+ /** From MdESession */
+ void AddSchemaObserverL(MMdESchemaObserver& aObserver);
+
+ /** From MdESession */
+ void RemoveSchemaObserverL(MMdESchemaObserver& aObserver);
+
+ /** From MdESession */
+ void AddRelationDefL(const CMdENamespaceDef &aNamespaceDef,
+ const TDesC &aName);
+
+ /** From MdESession */
+ void AddEventDefL(const CMdENamespaceDef &aNamespaceDef,
+ const TDesC &aName);
+
+ /* From MdESession */
+ TItemId AddObjectL(CMdEObject& aObject);
+
+ /* From MdESession */
+ TInt DeserializeIdsL( RMdEDataBuffer& aSerializedItemIds,
+ RArray<TItemId>* aResultObjects = NULL,
+ RArray<TItemId>* aResultEvents = NULL,
+ RArray<TItemId>* aResultRelations = NULL );
+
+ /* From MdESession */
+ TInt DeserializeItemsL( RMdEDataBuffer& aSerializedItems,
+ RPointerArray<CMdEInstanceItem>& aItems );
+
+ /* From MdESession */
+ TItemId RemoveObjectL( TItemId aId, CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ TItemId RemoveObjectL( const TDesC& aUri,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ TInt RemoveObjectsL( const RArray<TItemId>& aId,
+ RArray<TItemId>& aResult, CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ TInt RemoveObjectsL( const RPointerArray<TDesC>& aUri,
+ RArray<TItemId>& aResult, CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ void RemoveObjectsAsyncL(
+ const RArray<TItemId>& aId, TRequestStatus& aStatus,
+ RMdEDataBuffer& aSerializedObjectIds,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ void RemoveObjectsAsyncL(
+ const RPointerArray<TDesC>& aUri, TRequestStatus& aStatus,
+ RMdEDataBuffer& aSerializedObjectIds,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* GetObjectL( const TItemId aId,
+ CMdEObjectDef& aObjectDef );
+
+ /* From MdESession */
+ CMdEObject* OpenObjectL( const TItemId aId,
+ CMdEObjectDef& aObjectDef );
+
+ /* From MdESession */
+ CMdEObject* GetObjectL(
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ CMdEObjectDef& aObjectDef );
+
+ /* From MdESession */
+ CMdEObject* OpenObjectL(
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ CMdEObjectDef& aObjectDef );
+
+ /* From MdESession. */
+ CMdEObject* GetObjectL( const TDesC& aUri,
+ CMdEObjectDef& aObjectDef );
+
+ /* From MdESession. */
+ CMdEObject* OpenObjectL( const TDesC& aUri,
+ CMdEObjectDef& aObjectDef );
+
+ /* From MdESession */
+ CMdEObject* GetObjectL( const TItemId aId,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* OpenObjectL( const TItemId aId,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* GetObjectL(
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* OpenObjectL(
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ CMdEObject* GetObjectL( const TDesC& aUri,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ CMdEObject* OpenObjectL( const TDesC& aUri,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* GetFullObjectL( const TItemId aId,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* OpenFullObjectL( const TItemId aId,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* GetFullObjectL(
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession */
+ CMdEObject* OpenFullObjectL(
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ CMdEObject* GetFullObjectL( const TDesC& aUri,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ CMdEObject* OpenFullObjectL( const TDesC& aUri,
+ CMdENamespaceDef* aNamespaceDef );
+
+ void CheckObjectL( TMdEObject& aObject, const TDesC& aUri,
+ CMdENamespaceDef* aNamespaceDef );
+
+ void CheckObjectL( TMdEObject& aObject, TItemId aId,
+ CMdENamespaceDef* aNamespaceDef );
+
+ void CheckObjectL( RArray<TMdEObject>& aObjects,
+ const RArray<TItemId>& aIds,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ TItemId AddRelationL( CMdERelation& aRelation );
+
+ /* From MdESession. */
+ TItemId UpdateRelationL( CMdERelation& aRelation );
+
+ /* From MdESession. */
+ TInt AddItemsL( RPointerArray<CMdEInstanceItem>& aItems );
+
+ /* From MdESession. */
+ TInt UpdateItemsL( RPointerArray<CMdEInstanceItem>& aItems );
+
+ /* From MdESession. */
+ void AddItemsAsyncL(
+ RPointerArray<CMdEInstanceItem>& aItems,
+ TRequestStatus& aStatus,
+ RMdEDataBuffer& aSerializedItemIds );
+
+ /* From MdESession. */
+ void UpdateItemsAsyncL(
+ RPointerArray<CMdEInstanceItem>& aItems,
+ TRequestStatus& aStatus,
+ RMdEDataBuffer& aSerializedItemIds );
+
+ /* From MdESession. */
+ CMdERelation* GetRelationL(TItemId aId,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ TItemId RemoveRelationL(TItemId aId,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ TInt RemoveRelationsL(const RArray<TItemId>& aId,
+ RArray<TItemId>& aSuccessful, CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void RemoveRelationsAsyncL(
+ const RArray<TItemId>& aId, TRequestStatus& aStatus,
+ RMdEDataBuffer& aSerializedRelationIds,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ CMdEObjectQuery* NewObjectQueryL(CMdENamespaceDef& aNamespaceDef,
+ CMdEObjectDef& aObjectDef, MMdEQueryObserver* aObserver);
+
+ /* From MdESession. */
+ CMdEObjectQuery* NewObjectQueryL(CMdEObjectDef& aObjectDef,
+ RPointerArray<CMdEObjectDef>* aObjectDefs,
+ MMdEQueryObserver* aObserver);
+
+ /* From MdESession. */
+ CMdEEvent* GetEventL(TItemId aId, CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ TItemId AddEventL( CMdEEvent& aEvent );
+
+ /* From MdESession. */
+ TItemId RemoveEventL( TItemId aId, CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ TInt RemoveEventsL( const RArray<TItemId>& aId,
+ RArray<TItemId>& aSuccessful,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ void RemoveEventsAsyncL(
+ const RArray<TItemId>& aId, TRequestStatus& aStatus,
+ RMdEDataBuffer& aSerializedEventIds,
+ CMdENamespaceDef* aNamespaceDef );
+
+ /* From MdESession. */
+ CMdERelationQuery* NewRelationQueryL(CMdENamespaceDef& aNamespaceDef,
+ MMdEQueryObserver* aObserver);
+
+ /* From MdESession. */
+ CMdEEventQuery* NewEventQueryL(CMdENamespaceDef& aNamespaceDef,
+ MMdEQueryObserver* aObserver);
+
+ /* From MdESession. */
+ void AddObjectObserverL(MMdEObjectObserver& aObserver,
+ CMdELogicCondition* aCondition,
+ TUint32 aNotificationType,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void RemoveObjectObserverL(MMdEObjectObserver& aObserver,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void AddObjectPresentObserverL(
+ MMdEObjectPresentObserver& aObserver);
+
+ /* From MdESession. */
+ void RemoveObjectPresentObserverL(
+ MMdEObjectPresentObserver& aObserver);
+
+ /* From MdESession. */
+ void AddRelationObserverL(MMdERelationObserver& aObserver,
+ CMdECondition* aCondition,
+ TUint32 aNotificationType,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void RemoveRelationObserverL(MMdERelationObserver& aObserver,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void AddRelationItemObserverL(MMdERelationItemObserver& aObserver,
+ CMdECondition* aCondition,
+ TUint32 aNotificationType,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void RemoveRelationItemObserverL(MMdERelationItemObserver& aObserver,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void AddRelationPresentObserverL(
+ MMdERelationPresentObserver& aObserver);
+
+ /* From MdESession. */
+ void RemoveRelationPresentObserverL(
+ MMdERelationPresentObserver& aObserver);
+
+ /* From MdESession. */
+ void AddEventObserverL(MMdEEventObserver& aObserver,
+ CMdECondition* aCondition,
+ TUint32 aNotificationType,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /* From MdESession. */
+ void RemoveEventObserverL(MMdEEventObserver& aObserver,
+ CMdENamespaceDef* aNamespaceDef);
+
+ /** Finds an existing observer notifier */
+ TInt FindNotifier( TUint32 aNotifyType, TAny* aObserver,
+ CMdENamespaceDef& aNamespaceDef );
+
+ /** With this call Notifier announces it is in error state */
+ void NotifierInError( CMdENotifierAO* aNotifier );
+
+ /* From MdESession. */
+ void ImportSchemaL( const TDesC& aFileName );
+
+ /* From MdESession. */
+ TInt ImportMetadataL(const TDesC& aFileName );
+
+ /* From MdESession. */
+ void ImportMetadata( const TDesC& aFileName, TPckgBuf<TInt>& aResult,
+ TRequestStatus& aStatus );
+
+ /* From MdESession. */
+ void ExportMetadataL( const TDesC& aFileName,
+ const CMdENamespaceDef* aNamespaceDef = NULL,
+ const RPointerArray<CMdEObjectDef>* aObjectDefs = NULL,
+ const RPointerArray<CMdERelationDef>* aRelationDefs = NULL,
+ const RPointerArray<CMdEEventDef>* aEventDefs = NULL );
+
+ /* From MdESession. */
+ void ExportMetadataL( const TDesC& aFileName, TRequestStatus& aStatus,
+ RMdEDataBuffer& aBuffer,
+ const CMdENamespaceDef* aNamespaceDef = NULL,
+ const RPointerArray<CMdEObjectDef>* aObjectDefs = NULL,
+ const RPointerArray<CMdERelationDef>* aRelationDefs = NULL,
+ const RPointerArray<CMdEEventDef>* aEventDefs = NULL );
+
+ void LoadSchemaL();
+
+ RMdEEngineSession& EngineSession();
+
+ /* From MdESession. */
+ void GetSchemaVersionL(TInt& aMajorVersion, TInt& aMinorVersion);
+
+ /* From MdESession. */
+ void SetObjectToPresentByGuidL(
+ const TInt64& aGuidHigh, const TInt64& aGuidLow );
+
+ void GetCountL( CMdCSerializationBuffer* aBuffer, TUint32& aResult );
+
+ void GetItemIdL( CMdCSerializationBuffer* aBuffer,
+ RArray<TItemId>& aIdArray );
+
+ void GetDistinctValuesL( CMdCSerializationBuffer& aBuffer,
+ CDesCArray& aResults );
+
+ /**
+ * Should be called to notify the base class about errors, which are
+ * not a direct consequence of the operations initiated by the client
+ * but caused by some external source (e.g., other clients). Attempts
+ * to recover from the error have failed. All on-going operations
+ * initiated by the client should be aborted before calling this
+ * method. After calling this method any attempts to use the session
+ * will cause a panic.
+ *
+ * @param aError one of the system-wide error codes
+ */
+ void NotifyError(TInt aError);
+
+ protected:
+
+ /*
+ * Loads the schema
+ */
+ void DoLoadSchemaL();
+
+ void Close();
+
+ /* Methods to notify the base class about different events. */
+
+ /**
+ * Should be called to notify the base class that opening the session
+ * has been completed and, if the opening succeeded, the session is
+ * ready for use.
+ *
+ * @param aError <code>KErrNone</code>, if opening the session
+ * succeeded; or one of the system-wide error codes,
+ * if opening the session failed
+ */
+ void NotifySessionOpened(TInt aError);
+
+ /* Utility methods for concrete session implementations. */
+
+ /**
+ * Panics if the session has not been succesfully opened.
+ */
+ void CheckOpened() const;
+
+ public:
+
+ void DeserializeQueryResultL( CMdCSerializationBuffer& aBuffer,
+ RPointerArray<CMdEInstanceItem>& aItems );
+
+ protected:
+ CMdCSerializationBuffer* SerializeItemsL(
+ RPointerArray<CMdEInstanceItem>& aItems );
+
+ TItemId AddItemL( CMdEInstanceItem& aItem );
+
+ void DeserializeAddingResultsL(
+ RPointerArray<CMdEInstanceItem>& aItems,
+ CMdCSerializationBuffer& aResultBuffer );
+
+ /**
+ * Creates a serialized buffer with id marked to be removed
+ *
+ * @param aNamespaceDef namespace where items should be removed
+ * @param aObjects objects id to remove (could be NULL)
+ * @param aEvents events id to remove (could be NULL)
+ * @param aRelations relation id to remove (could be NULL)
+ * @return serialized buffer
+ */
+ CMdCSerializationBuffer* RemoveCommonL(
+ CMdENamespaceDef& aNamespaceDef,
+ const RPointerArray<TDesC16>* aObjects,
+ const RArray<TItemId>* aEvents,
+ const RArray<TItemId>* aRelations );
+
+ /**
+ * Creates a serialized buffer with id marked to be removed
+ *
+ * @param aNamespaceDef namespace where items should be removed
+ * @param aObjects objects uri to remove (could be NULL)
+ * @param aEvents events id to remove (could be NULL)
+ * @param aRelations relation id to remove (could be NULL)
+ * @return serialized buffer
+ */
+ CMdCSerializationBuffer* RemoveCommonL(
+ CMdENamespaceDef& aNamespaceDef,
+ const RArray<TItemId>* aObjects,
+ const RArray<TItemId>* aEvents,
+ const RArray<TItemId>* aRelations );
+
+ /**
+ * Creates a serialized buffer with defs id items to be exported
+ *
+ * @param aNamespaceDef namespace from where items should be removed
+ * (NULL means from every)
+ * @param aObjectDefs objectDefs to export
+ * @param aRelationDefs
+ * @param aEventDefs
+ * @return serialized items ids
+ */
+ CMdCSerializationBuffer* ExportCommonL(
+ const CMdENamespaceDef* aNamespaceDef,
+ const RPointerArray<CMdEObjectDef>* aObjectDefs,
+ const RPointerArray<CMdERelationDef>* aRelationDefs,
+ const RPointerArray<CMdEEventDef>* aEventDefs );
+
+ private:
+ /**
+ * If aId is KNoId it isn't used. If aUri is KNullDesC, it isn't used.
+ */
+ CMdEObject* GetObjectL( CMdEObjectDef& aObjectDef, const TItemId aId,
+ const TInt64 aGuidHigh, const TInt64 aGuidLow,
+ const TDesC& aUri, TMdCQueryLockType aLocktype,
+ TBool aIncludeFreetexts );
+
+ /**
+ * Return namespace definition or default namespace definition
+ *
+ * @param aNamespaceDef namespace definition or NULL
+ * @return default namespace definition if parameter was NULL,
+ * othrewise namespace definition which was given as parameter
+ */
+ CMdENamespaceDef* GetNamespaceDefL( CMdENamespaceDef* aNamespaceDef );
+
+ private: // data members
+
+ /**
+ *
+ */
+ CMdESessionStartupAO* iSessionStartupAO;
+
+ /**
+ * array of observer notifier active objects
+ */
+ RPointerArray<CMdENotifierAO> iNotifiers;
+
+ /** Open observer. */
+ MMdESessionObserver* iSessionObserver;
+
+ /** Schema observers. */
+ RPointerArray<MMdESchemaObserver> iSchemaObserverArray;
+
+ RChunk iSchemaChunk;
+
+ CMdCSerializationBuffer* iSchemaBuffer;
+
+ RPointerArray<CMdENamespaceDef> iNamespaceDefs;
+
+ CMdESessionAsyncHandler* iAsyncHandler;
+
+ TUint32 iNextQueryId;
+
+ protected:
+
+ /**
+ * iSession, client server session
+ */
+ RMdEEngineSession iSession;
+
+ enum TSessionState
+ {
+ EMdESessionClosed = 0,
+ EMdESessionOpen,
+ EMdESessionError,
+ };
+ TSessionState iSessionState;
+ };
+
+#endif // __MDESESSIONIMPL_H__