wmdrm/wmdrmengine/wmdrmserver/server/src/wmdrmsession.cpp
changeset 0 95b198f216e5
child 22 ad2863178d17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wmdrm/wmdrmengine/wmdrmserver/server/src/wmdrmsession.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,827 @@
+/*
+* Copyright (c) 2007-2008 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:  WMDRM Server implementation
+*
+*/
+
+
+#include <bacntf.h>
+#include "wmdrmsession.h"
+#include "wmdrmserver.h"
+#include "clock.h"
+#include "slotdatacache.h"
+#include "slotenumeratorcache.h"
+#include "slot.h"
+#include "slotdata.h"
+#include "enumerator.h"
+#include "enumeratordata.h"
+#include "wmdrmdatastore.h"
+#include "wmdrmdb.h"
+#include "drmrightsstoringlocation.h"
+#include "drmutilityinternaltypes.h"
+
+#define _LOGGING_FILE L"wmdrmserver.txt"
+
+#include "flogger.h"
+#include "logfn.h"
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::CWmDrmSession
+// Constructor
+//---------------------------------------------------------------------------
+//
+CWmDrmSession::CWmDrmSession()
+	{
+	}
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::~CWmDrmSession
+// Destructor
+//---------------------------------------------------------------------------
+//	
+CWmDrmSession::~CWmDrmSession()
+	{
+	LOGFN( "CWmDrmSession::~CWmDrmSession" );
+    //Server().Cache()->FlushL();
+	delete iEnumerator;
+	iEnumerator = NULL;
+    delete iSlot;
+	iSlot = NULL;
+	}
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::InitStoreL
+//---------------------------------------------------------------------------
+//
+TInt CWmDrmSession::InitStoreL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TBuf8<KMaxWmDrmStoreNameSize> store;
+    
+    LOGFNR( "CWmDrmSession::InitStoreL", r );
+    if ( aMessage.GetDesLength( 0 ) > KMaxWmDrmStoreNameSize || aMessage.GetDesLength( 0 ) <= 0 )
+        {
+        User::Leave( KErrArgument );
+        }
+    aMessage.ReadL( 0, store );
+    TRAP( r, Server().Db()->InitStoreL( store, aMessage.Int1() ) );
+    if ( r == KErrAlreadyExists )
+        {
+        r = KErrNone;
+        }
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::RemoveStoreL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::RemoveStoreL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TBuf8<KMaxWmDrmStoreNameSize> store;
+    
+    LOGFNR( "CWmDrmSession::RemoveStoreL", r );
+    if ( aMessage.GetDesLength( 0 ) > KMaxWmDrmStoreNameSize || aMessage.GetDesLength( 0 ) <= 0  )
+        {
+        User::Leave( KErrArgument );
+        }
+    Server().ResetCacheL();
+    aMessage.ReadL( 0, store );
+    Server().Db()->RemoveStoreL( store );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::InitNamespaceL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::InitNamespaceL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TBuf8<KMaxWmDrmStoreNameSize> store;
+    TBuf8<KMaxWmDrmNamespaceNameSize> nameSpace;
+    
+    LOGFNR( "CWmDrmSession::InitNamespaceL", r );
+    // :KLUDGE: Note: store length of zero is allowed
+    if ( aMessage.GetDesLengthL( 0 ) > KMaxWmDrmStoreNameSize ||
+        aMessage.GetDesLengthL( 1 ) > KMaxWmDrmNamespaceNameSize ||
+        aMessage.GetDesLength( 1 ) <= 0 )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    if ( aMessage.GetDesLengthL( 0 ) > 0 )
+        {
+        aMessage.ReadL( 0, store );
+        }
+    else
+        {
+        // Use hds as the default store if none given
+        store.Copy( KDefaultStore );
+        }
+    aMessage.ReadL( 1, nameSpace );
+    Server().Db()->InitNameSpaceL( store, nameSpace, aMessage.Int1() );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::RemoveNamespaceL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::RemoveNamespaceL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TBuf8<KMaxWmDrmStoreNameSize> store;
+    TBuf8<KMaxWmDrmNamespaceNameSize> nameSpace;
+    
+    LOGFNR( "CWmDrmSession::RemoveNamespaceL", r );
+    // :KLUDGE: Note: store length of zero is allowed
+    if ( aMessage.GetDesLengthL( 0 ) > KMaxWmDrmStoreNameSize ||
+        aMessage.GetDesLengthL( 1 ) > KMaxWmDrmNamespaceNameSize ||
+        aMessage.GetDesLength( 1 ) <= 0 )
+        {
+        User::Leave( KErrArgument );
+        }
+
+    if ( aMessage.GetDesLengthL( 0 ) > 0 )
+        {
+        aMessage.ReadL( 0, store );
+        }
+    else
+        {
+        // :KLUDGE: Use hds as the default store if none given
+        store.Copy( KDefaultStore );
+        }
+    aMessage.ReadL( 1, nameSpace );
+    Server().Db()->RemoveNameSpaceL( store, nameSpace );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotOpenL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotOpenL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    RBuf8 messageBuffer;
+	TInt size;
+    
+    LOGFNR( "CWmDrmSession::SlotOpenL", r );
+    if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize || aMessage.GetDesLength( 0 ) <= 0 )
+        {
+        User::Leave( KErrArgument );
+        }
+    messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
+    messageBuffer.CleanupClosePushL();
+    aMessage.ReadL( 0, messageBuffer );
+    if ( iSlot != NULL )
+        {
+        delete iSlot;
+        iSlot = NULL;
+        }
+    iSlot = CSlot::NewL( &Server(), messageBuffer );
+    r = iSlot->OpenL( size );
+    aMessage.WriteL( 1, TPckg<TInt>( size ) );
+    CleanupStack::PopAndDestroy( &messageBuffer );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotCreateL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotCreateL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    RBuf8 messageBuffer;
+	TInt size;
+    
+    LOGFNR( "CWmDrmSession::SlotCreateL", r );
+    if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize || aMessage.GetDesLength( 0 ) <= 0  )
+        {
+        User::Leave( KErrArgument );
+        }
+    messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
+    messageBuffer.CleanupClosePushL();
+    aMessage.ReadL( 0, messageBuffer );
+    size = aMessage.Int1();
+    if ( iSlot != NULL )
+        {
+        delete iSlot;
+        iSlot = NULL;
+        }
+    
+    iSlot = CSlot::NewL( &Server(), messageBuffer );
+    iSlot->CreateL( size );
+    CleanupStack::PopAndDestroy( &messageBuffer );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotSeekL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotSeekL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TSeek whence = ESeekStart;
+    TInt pos = aMessage.Int0();
+    TInt size;
+    
+    LOGFNR( "CWmDrmSession::SlotSeekL", r );
+    if ( iSlot == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    switch ( aMessage.Int1() )
+        {
+        case ESeekStart:
+            whence = ESeekStart;
+            break;
+        case ESeekCurrent:
+            whence = ESeekCurrent;
+            break;
+        case ESeekEnd:
+            whence = ESeekEnd;
+            break;
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+    r = iSlot->SeekL( pos, whence );
+    if ( r == KErrNone && whence == ESeekStart )
+        {
+        size = iSlot->Size();
+        if ( pos >= size )
+            {
+            pos = 0;
+            r = iSlot->SeekL( pos, ESeekEnd );
+            }
+        }
+    aMessage.WriteL( 2, TPckg<TInt>( pos ) );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotReadL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotReadL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    RBuf8 buf;
+    TInt amountRead = 0;
+    
+    LOGFNR( "CWmDrmSession::SlotReadL", r );
+    if ( iSlot == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    buf.CreateL( aMessage.GetDesMaxLengthL( 0 ) );
+    buf.CleanupClosePushL();
+    r = iSlot->Read( buf );
+    if ( r == KErrNone )
+        {
+        aMessage.WriteL( 0, buf );
+        amountRead = buf.Size();
+        }
+    aMessage.WriteL( 1, TPckg<TInt>( amountRead ) );
+    CleanupStack::PopAndDestroy( &buf );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotWriteL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotWriteL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    RBuf8 buf;
+    
+    LOGFNR( "CWmDrmSession::SlotWriteL", r );
+    if ( iSlot == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    buf.CreateL( aMessage.GetDesLengthL( 0 ) );
+    buf.CleanupClosePushL();
+    aMessage.ReadL( 0, buf );
+    r = iSlot->WriteL( buf );
+    CleanupStack::PopAndDestroy( &buf );
+    return r;
+    }
+    
+TInt CWmDrmSession::SlotResizeL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    
+    LOGFNR( "CWmDrmSession::SlotResizeL", r );
+    if ( iSlot == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    r = iSlot->ResizeL( aMessage.Int0() );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotDeleteL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotDeleteL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    RBuf8 messageBuffer;
+    
+    LOGFNR( "CWmDrmSession::SlotDeleteL", r );
+    if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize )
+        {
+        User::Leave( KErrArgument );
+        }
+    messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
+    messageBuffer.CleanupClosePushL();
+    aMessage.ReadL( 0, messageBuffer );
+    if ( iSlot != NULL )
+        {
+        delete iSlot;
+        iSlot = NULL;
+        }
+    iSlot = CSlot::NewL( &Server(), messageBuffer );
+    r = iSlot->DeleteL();
+    delete iSlot;
+    iSlot = NULL;
+    CleanupStack::PopAndDestroy( &messageBuffer );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SlotCloseL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::SlotCloseL( const RMessage2& /*aMessage*/ )
+    {
+    TInt r = KErrNone;
+    
+    LOGFNR( "CWmDrmSession::SlotCloseL", r );
+    if ( iSlot == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    delete iSlot;
+    iSlot = NULL;
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::EnumerateStartL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::EnumerateStartL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    RBuf8 messageBuffer;
+    
+    LOGFNR( "CWmDrmSession::EnumerateStartL", r );
+    if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize || aMessage.GetDesLength( 0 ) <= 0  )
+        {
+        User::Leave( KErrArgument );
+        }
+    messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
+    messageBuffer.CleanupClosePushL();
+    aMessage.ReadL( 0, messageBuffer );
+    if ( iSlot != NULL )
+        {
+        delete iSlot;
+        iSlot = NULL;
+        }
+    if ( iEnumerator != NULL )
+        {
+        delete iEnumerator;
+        iEnumerator = NULL;
+        }
+    iEnumerator = CEnumerator::NewL( &Server(), messageBuffer );
+    r = iEnumerator->OpenL();
+    CleanupStack::PopAndDestroy( &messageBuffer );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::EnumerateReloadL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::EnumerateReloadL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TBuf8<KWmDrmIdSize> hash;
+    TBuf8<KWmDrmIdSize> id;
+    
+    LOGFNR( "CWmDrmSession::EnumerateReloadL", r );
+    if ( iEnumerator == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    iEnumerator->GetHashKey( hash );
+    LOGHEX( hash.Ptr(), hash.Size() );
+    iEnumerator->GetUniqueKey( id );
+    LOGHEX( id.Ptr(), id.Size() );
+    aMessage.WriteL( 0, iEnumerator->iStore);
+    aMessage.WriteL( 1, iEnumerator->iNamespace );
+    aMessage.WriteL( 2, hash );
+    aMessage.WriteL( 3, id );
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::EnumerateNextL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::EnumerateNextL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    TBuf8<KWmDrmIdSize> hash;
+    TBuf8<KWmDrmIdSize> id;
+    
+    LOGFNR( "CWmDrmSession::EnumerateNextL", r );
+    if ( iEnumerator == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    r = iEnumerator->NextL();
+    if ( r == KErrNone )
+        {
+        iEnumerator->GetHashKey( hash );
+        LOGHEX( hash.Ptr(), hash.Size() );
+        iEnumerator->GetUniqueKey( id );
+        LOGHEX( id.Ptr(), id.Size() );
+        aMessage.WriteL( 0, iEnumerator->iStore);
+        aMessage.WriteL( 1, iEnumerator->iNamespace );
+        aMessage.WriteL( 2, hash );
+        aMessage.WriteL( 3, id );
+        }
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::EnumerateDeleteL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::EnumerateDeleteL ( const RMessage2& /*aMessage*/ )
+    {
+    TInt r = KErrNone;
+    
+    LOGFNR( "CWmDrmSession::EnumerateDeleteL", r );
+    if ( iEnumerator == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    iEnumerator->DeleteCurrentL();
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::EnumerateEndL
+//---------------------------------------------------------------------------
+//
+TInt CWmDrmSession::EnumerateEndL ( const RMessage2& /*aMessage*/ )
+    {
+    TInt r = KErrNone;
+    
+    LOGFNR( "CWmDrmSession::EnumerateEndL", r );
+    if ( iEnumerator == NULL )
+        {
+        User::Leave( KErrNotReady );
+        }
+    iEnumerator->Close();
+    delete iEnumerator;
+    iEnumerator = NULL;
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::EmptyCacheL
+//---------------------------------------------------------------------------
+//
+TInt CWmDrmSession::EmptyCacheL( const RMessage2& aMessage )
+    {
+    TInt r = KErrNone;
+    
+    LOGFNR( "CWmDrmSession::EmptyCacheL", r );
+    TRAP_IGNORE( EnumerateEndL( aMessage ) );
+    TRAP_IGNORE( SlotCloseL( aMessage ) );
+    Server().ResetCacheL();
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::LogStats
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::LogStats( const RMessage2& /*aMessage*/ )
+    {
+    TInt r = KErrNone;
+
+#ifdef _LOGGING    
+    TInt cells;
+    TInt amount;
+    TInt i;
+    TInt j;
+    _LIT( KStatsDir, "wmdrm" );
+    _LIT( KStatsFile, "wmdrmserver.txt" );
+    
+    LOGFNR( "CWmDrmSession::LogStatsL", r );
+    cells = User::AllocSize( amount );
+    RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend, _L( "Statistics:" ) );
+    RFileLogger::WriteFormat( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+        _L( "Memory: %d cells, %d bytes allocated" ), cells, amount );
+
+    if (Server().Clock()->TimeIsGood() )
+        {
+        RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend, _L( "Time is valid" ) );
+        }
+    else
+        {
+        RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend, _L( "Time is invalid" ) );
+        }
+
+    RFileLogger::WriteFormat( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+        _L( "Cache: %d out of %d slots used" ),
+        Server().Cache()->iSlotCache.Count(),
+        Server().Cache()->iMaxCachedSlots );
+    for ( i = 0; i < Server().Cache()->iSlotCache.Count(); i++ )
+        {
+        RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+            Server().Cache()->iSlotCache[i]->iHashKey );
+        RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+            Server().Cache()->iSlotCache[i]->iUniqueKey );
+        }
+
+    RFileLogger::WriteFormat( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+        _L( "Enumerators: %d out of %d slots used" ),
+        Server().EnumeratorCache()->iEnumeratorCache.Count(),
+        Server().EnumeratorCache()->iMaxCachedEnumerators );
+    for ( i = 0; i < Server().EnumeratorCache()->iEnumeratorCache.Count(); i++ )
+        {
+        RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+            Server().EnumeratorCache()->iEnumeratorCache[i]->iHashKey );
+        for ( j = 0; j < Server().EnumeratorCache()->iEnumeratorCache[i]->iEntries.Count(); j++ )
+            {
+            RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
+                *Server().EnumeratorCache()->iEnumeratorCache[i]->iEntries[j] );
+            }
+        }
+#endif
+    
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::TimeValid
+//---------------------------------------------------------------------------
+//
+TInt CWmDrmSession::TimeValid( const RMessage2& /*aMessage*/ )
+    {
+    TInt r = KErrNone;
+    
+    LOGFNR( "CWmDrmSession::TimeValid", r );
+    r = Server().Clock()->TimeIsGood();
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::SetTimeAsValidL
+//---------------------------------------------------------------------------
+//    
+void CWmDrmSession::SetTimeAsValidL( const RMessage2& aMessage )
+    {
+    LOGFN( "CWmDrmSession::TimeValid" );
+    Server().Clock()->SetTimeAsGoodL( aMessage.Int0() == 0 ? EFalse : ETrue );
+    }
+    
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::DeleteRightsL
+//---------------------------------------------------------------------------
+//    
+TInt CWmDrmSession::DeleteRightsL( const RMessage2& /*aMessage*/ )
+    {
+    TInt r = KErrNone;
+    TBool wmDrmRightsConfigFound( EFalse );
+    TChar driveLetter;
+    TDrmScheme drmScheme( EDrmSchemeWmDrm );
+    
+    LOGFNR( "CWmDrmSession::DeleteRightsL", r );
+    // Close EVERYTHING down, clear cache etc, so that we have nothing going on
+    // When we start to delete stuff
+    Server().ResetCacheL();
+    
+    wmDrmRightsConfigFound = DrmRightsStoringLocation::CheckDrmRightsStorageDriveL(
+	  		Server().Fs(), drmScheme, driveLetter );
+    
+    // If WM DRM rights storage configuration is found, update both databases
+    if ( wmDrmRightsConfigFound )
+        {
+    	Server().DataStore()->UpdateDummyDbFileL( 
+    	    Server().DataStore()->DummyDBSizeL( ETrue ), ETrue );
+    	}
+    Server().DataStore()->UpdateDummyDbFileL( 
+        Server().DataStore()->DummyDBSizeL( EFalse ), EFalse );
+    
+    // Delete license store
+    Server().Db()->DeleteLicenseStoreL();
+    
+    // If WM DRM rights storage configuration is found, update both databases 
+    if ( wmDrmRightsConfigFound )
+    	{
+    	Server().DataStore()->UpdateDummyDbFileL( 0, ETrue );
+    	}	
+    Server().DataStore()->UpdateDummyDbFileL( 0, EFalse );
+    
+    return r;
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::StoreStateL
+//---------------------------------------------------------------------------
+//
+void CWmDrmSession::StoreStateL( const RMessage2& aMessage )
+    {
+    TWmDrmStoreState state;
+    
+    LOGFN( "CWmDrmSession::StoreStateL" );
+    state = Server().DataStore()->DataStoreStateL();
+    aMessage.WriteL( 0, TPckg<TWmDrmStoreState>( state ) );
+    }
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::GetTimeL
+//---------------------------------------------------------------------------
+//
+void CWmDrmSession::GetTimeL( const RMessage2& aMessage )
+    {
+    TTime time = Time::NullTTime();
+    TBool validity = EFalse;
+    TPckg<TTime> timePckg(time);
+    TPckg<TBool> validityPckg(validity);
+    
+    LOGFN( "CWmDrmSession::GetTimeL" );
+    
+    // Get the time from the clock
+    Server().Clock()->GetTimeL( time, validity );
+    
+    aMessage.WriteL(0, timePckg);
+    aMessage.WriteL(1, validityPckg);
+    }
+
+ 
+//---------------------------------------------------------------------------
+// CWmDrmSession::ServiceL
+//---------------------------------------------------------------------------
+//    
+void CWmDrmSession::ServiceL( const RMessage2& aMessage )
+	{
+	TInt r = KErrNone;
+	TInt trap = KErrNone;
+	_LIT_SECURITY_POLICY_C1(drmCheck, ECapabilityDRM);
+    RThread client;
+	
+	LOGFNR( "CWmDrmSession::ServiceL", r );
+#ifdef _LOGGING
+    TInt c;
+    TInt s;
+    c = User::AllocSize(s);
+    LOG3( "Memory: %d cells, %d bytes allocated", c, s );
+#endif
+
+    aMessage.ClientL( client );
+
+    if ( !drmCheck().CheckPolicy( client ) )
+        {
+        r = KErrAccessDenied;
+        }
+    else
+        {
+        switch ( aMessage.Function() )
+            {
+            case EInitStore:
+                TRAP( trap, r = InitStoreL( aMessage ) );
+                break;
+            case ERemoveStore:
+                TRAP( trap, r = RemoveStoreL( aMessage ) );
+                break;
+            case EInitNamespace:
+                TRAP( trap, r = InitNamespaceL( aMessage ) );
+                break;
+            case ERemoveNamespace:
+                TRAP( trap, r = RemoveNamespaceL( aMessage ) );
+                break;
+            case ESlotOpen:
+                TRAP( trap, r = SlotOpenL( aMessage ) );
+                break;
+            case ESlotCreate:
+                TRAP( trap, r = SlotCreateL( aMessage ) );
+                break;
+            case ESlotSeek:
+                TRAP( trap, r = SlotSeekL( aMessage ) );
+                break;
+            case ESlotRead:
+                TRAP( trap, r = SlotReadL( aMessage ) );
+                break;
+            case ESlotWrite:
+                TRAP( trap, r = SlotWriteL( aMessage ) );
+                break;
+            case ESlotDelete:
+                TRAP( trap, r = SlotDeleteL( aMessage ) );
+                break;
+            case ESlotResize:
+                TRAP( trap, r = SlotResizeL( aMessage ) );
+                break;
+            case ESlotClose:
+                TRAP( trap, r = SlotCloseL( aMessage ) );
+                break;
+            case EEnumerateStart:
+                TRAP( trap, r = EnumerateStartL( aMessage ) );
+                break;
+            case EEnumerateReload:
+                TRAP( trap, r = EnumerateReloadL( aMessage ) );
+                break;
+            case EEnumerateNext:
+                TRAP( trap, r = EnumerateNextL( aMessage ) );
+                break;
+            case EEnumerateDelete:
+                TRAP( trap, r = EnumerateDeleteL( aMessage ) );
+                break;
+            case EEnumerateEnd:
+                TRAP( trap, r = EnumerateEndL( aMessage ) );
+                break;
+            case ELogStats:
+                r = LogStats( aMessage );
+                break;
+            case EEmptyCache:
+                TRAP( trap, r = EmptyCacheL( aMessage ) );
+                break;
+            case ETimeValid:
+                r = TimeValid( aMessage );
+                break;
+            case ESetTimeAsValid:
+                TRAP( trap, SetTimeAsValidL( aMessage ) );
+                break;
+            case EDeleteRights:
+                TRAP( trap, DeleteRightsL( aMessage ) );
+                break;
+            case EStoreState:
+                TRAP( trap, StoreStateL( aMessage ) );
+                break;
+            case EGetTime:
+                TRAP( trap, GetTimeL( aMessage ) );
+                break;              
+            default:
+                r = KErrArgument;
+                break;
+                }
+        if ( trap != KErrNone )
+            {
+            r = trap;
+            }
+        if ( r == KErrDiskFull || r == KErrNoMemory )
+            {
+            TRAP_IGNORE( EmptyCacheL( aMessage ) );
+            }
+        }
+    client.Close();
+    LOG2( "** ServiceL error: %d", r );
+    aMessage.Complete( r );
+	}
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::ServiceError
+//---------------------------------------------------------------------------
+//
+void CWmDrmSession::ServiceError( const RMessage2& aMessage, TInt aError )
+	{
+	LOGFN( "CWmDrmSession::ServiceError" );
+	LOG2( "** Error: %d", aError );
+	CSession2::ServiceError( aMessage, aError );
+	}
+
+//---------------------------------------------------------------------------
+// CWmDrmSession::Server
+//---------------------------------------------------------------------------
+//
+CWmDrmServer& CWmDrmSession::Server()
+	{
+	return *static_cast<CWmDrmServer*>( const_cast<CServer2*>( CSession2::Server() ) );
+	}