wmdrm/wmdrmengine/wmdrmserver/server/src/wmdrmsession.cpp
changeset 0 95b198f216e5
child 47 5ed7931150e9
equal deleted inserted replaced
-1:000000000000 0:95b198f216e5
       
     1 /*
       
     2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  WMDRM Server implementation
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <bacntf.h>
       
    20 #include "wmdrmsession.h"
       
    21 #include "wmdrmserver.h"
       
    22 #include "clock.h"
       
    23 #include "slotdatacache.h"
       
    24 #include "slotenumeratorcache.h"
       
    25 #include "slot.h"
       
    26 #include "slotdata.h"
       
    27 #include "enumerator.h"
       
    28 #include "enumeratordata.h"
       
    29 #include "wmdrmdatastore.h"
       
    30 #include "wmdrmdb.h"
       
    31 #include "drmrightsstoringlocation.h"
       
    32 #include "drmutilityinternaltypes.h"
       
    33 
       
    34 #define _LOGGING_FILE L"wmdrmserver.txt"
       
    35 
       
    36 #include "flogger.h"
       
    37 #include "logfn.h"
       
    38 
       
    39 //---------------------------------------------------------------------------
       
    40 // CWmDrmSession::CWmDrmSession
       
    41 // Constructor
       
    42 //---------------------------------------------------------------------------
       
    43 //
       
    44 CWmDrmSession::CWmDrmSession()
       
    45 	{
       
    46 	}
       
    47 
       
    48 //---------------------------------------------------------------------------
       
    49 // CWmDrmSession::~CWmDrmSession
       
    50 // Destructor
       
    51 //---------------------------------------------------------------------------
       
    52 //	
       
    53 CWmDrmSession::~CWmDrmSession()
       
    54 	{
       
    55 	LOGFN( "CWmDrmSession::~CWmDrmSession" );
       
    56     //Server().Cache()->FlushL();
       
    57 	delete iEnumerator;
       
    58 	iEnumerator = NULL;
       
    59     delete iSlot;
       
    60 	iSlot = NULL;
       
    61 	}
       
    62 
       
    63 //---------------------------------------------------------------------------
       
    64 // CWmDrmSession::InitStoreL
       
    65 //---------------------------------------------------------------------------
       
    66 //
       
    67 TInt CWmDrmSession::InitStoreL( const RMessage2& aMessage )
       
    68     {
       
    69     TInt r = KErrNone;
       
    70     TBuf8<KMaxWmDrmStoreNameSize> store;
       
    71     
       
    72     LOGFNR( "CWmDrmSession::InitStoreL", r );
       
    73     if ( aMessage.GetDesLength( 0 ) > KMaxWmDrmStoreNameSize || aMessage.GetDesLength( 0 ) <= 0 )
       
    74         {
       
    75         User::Leave( KErrArgument );
       
    76         }
       
    77     aMessage.ReadL( 0, store );
       
    78     TRAP( r, Server().Db()->InitStoreL( store, aMessage.Int1() ) );
       
    79     if ( r == KErrAlreadyExists )
       
    80         {
       
    81         r = KErrNone;
       
    82         }
       
    83     return r;
       
    84     }
       
    85 
       
    86 //---------------------------------------------------------------------------
       
    87 // CWmDrmSession::RemoveStoreL
       
    88 //---------------------------------------------------------------------------
       
    89 //    
       
    90 TInt CWmDrmSession::RemoveStoreL( const RMessage2& aMessage )
       
    91     {
       
    92     TInt r = KErrNone;
       
    93     TBuf8<KMaxWmDrmStoreNameSize> store;
       
    94     
       
    95     LOGFNR( "CWmDrmSession::RemoveStoreL", r );
       
    96     if ( aMessage.GetDesLength( 0 ) > KMaxWmDrmStoreNameSize || aMessage.GetDesLength( 0 ) <= 0  )
       
    97         {
       
    98         User::Leave( KErrArgument );
       
    99         }
       
   100     Server().ResetCacheL();
       
   101     aMessage.ReadL( 0, store );
       
   102     Server().Db()->RemoveStoreL( store );
       
   103     return r;
       
   104     }
       
   105 
       
   106 //---------------------------------------------------------------------------
       
   107 // CWmDrmSession::InitNamespaceL
       
   108 //---------------------------------------------------------------------------
       
   109 //    
       
   110 TInt CWmDrmSession::InitNamespaceL( const RMessage2& aMessage )
       
   111     {
       
   112     TInt r = KErrNone;
       
   113     TBuf8<KMaxWmDrmStoreNameSize> store;
       
   114     TBuf8<KMaxWmDrmNamespaceNameSize> nameSpace;
       
   115     
       
   116     LOGFNR( "CWmDrmSession::InitNamespaceL", r );
       
   117     // :KLUDGE: Note: store length of zero is allowed
       
   118     if ( aMessage.GetDesLengthL( 0 ) > KMaxWmDrmStoreNameSize ||
       
   119         aMessage.GetDesLengthL( 1 ) > KMaxWmDrmNamespaceNameSize ||
       
   120         aMessage.GetDesLength( 1 ) <= 0 )
       
   121         {
       
   122         User::Leave( KErrArgument );
       
   123         }
       
   124 
       
   125     if ( aMessage.GetDesLengthL( 0 ) > 0 )
       
   126         {
       
   127         aMessage.ReadL( 0, store );
       
   128         }
       
   129     else
       
   130         {
       
   131         // Use hds as the default store if none given
       
   132         store.Copy( KDefaultStore );
       
   133         }
       
   134     aMessage.ReadL( 1, nameSpace );
       
   135     Server().Db()->InitNameSpaceL( store, nameSpace, aMessage.Int1() );
       
   136     return r;
       
   137     }
       
   138 
       
   139 //---------------------------------------------------------------------------
       
   140 // CWmDrmSession::RemoveNamespaceL
       
   141 //---------------------------------------------------------------------------
       
   142 //    
       
   143 TInt CWmDrmSession::RemoveNamespaceL( const RMessage2& aMessage )
       
   144     {
       
   145     TInt r = KErrNone;
       
   146     TBuf8<KMaxWmDrmStoreNameSize> store;
       
   147     TBuf8<KMaxWmDrmNamespaceNameSize> nameSpace;
       
   148     
       
   149     LOGFNR( "CWmDrmSession::RemoveNamespaceL", r );
       
   150     // :KLUDGE: Note: store length of zero is allowed
       
   151     if ( aMessage.GetDesLengthL( 0 ) > KMaxWmDrmStoreNameSize ||
       
   152         aMessage.GetDesLengthL( 1 ) > KMaxWmDrmNamespaceNameSize ||
       
   153         aMessage.GetDesLength( 1 ) <= 0 )
       
   154         {
       
   155         User::Leave( KErrArgument );
       
   156         }
       
   157 
       
   158     if ( aMessage.GetDesLengthL( 0 ) > 0 )
       
   159         {
       
   160         aMessage.ReadL( 0, store );
       
   161         }
       
   162     else
       
   163         {
       
   164         // :KLUDGE: Use hds as the default store if none given
       
   165         store.Copy( KDefaultStore );
       
   166         }
       
   167     aMessage.ReadL( 1, nameSpace );
       
   168     Server().Db()->RemoveNameSpaceL( store, nameSpace );
       
   169     return r;
       
   170     }
       
   171 
       
   172 //---------------------------------------------------------------------------
       
   173 // CWmDrmSession::SlotOpenL
       
   174 //---------------------------------------------------------------------------
       
   175 //    
       
   176 TInt CWmDrmSession::SlotOpenL( const RMessage2& aMessage )
       
   177     {
       
   178     TInt r = KErrNone;
       
   179     RBuf8 messageBuffer;
       
   180 	TInt size;
       
   181     
       
   182     LOGFNR( "CWmDrmSession::SlotOpenL", r );
       
   183     if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize || aMessage.GetDesLength( 0 ) <= 0 )
       
   184         {
       
   185         User::Leave( KErrArgument );
       
   186         }
       
   187     messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
       
   188     messageBuffer.CleanupClosePushL();
       
   189     aMessage.ReadL( 0, messageBuffer );
       
   190     if ( iSlot != NULL )
       
   191         {
       
   192         delete iSlot;
       
   193         iSlot = NULL;
       
   194         }
       
   195     iSlot = CSlot::NewL( &Server(), messageBuffer );
       
   196     r = iSlot->OpenL( size );
       
   197     aMessage.WriteL( 1, TPckg<TInt>( size ) );
       
   198     CleanupStack::PopAndDestroy( &messageBuffer );
       
   199     return r;
       
   200     }
       
   201 
       
   202 //---------------------------------------------------------------------------
       
   203 // CWmDrmSession::SlotCreateL
       
   204 //---------------------------------------------------------------------------
       
   205 //    
       
   206 TInt CWmDrmSession::SlotCreateL( const RMessage2& aMessage )
       
   207     {
       
   208     TInt r = KErrNone;
       
   209     RBuf8 messageBuffer;
       
   210 	TInt size;
       
   211     
       
   212     LOGFNR( "CWmDrmSession::SlotCreateL", r );
       
   213     if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize || aMessage.GetDesLength( 0 ) <= 0  )
       
   214         {
       
   215         User::Leave( KErrArgument );
       
   216         }
       
   217     messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
       
   218     messageBuffer.CleanupClosePushL();
       
   219     aMessage.ReadL( 0, messageBuffer );
       
   220     size = aMessage.Int1();
       
   221     if ( iSlot != NULL )
       
   222         {
       
   223         delete iSlot;
       
   224         iSlot = NULL;
       
   225         }
       
   226     
       
   227     iSlot = CSlot::NewL( &Server(), messageBuffer );
       
   228     iSlot->CreateL( size );
       
   229     CleanupStack::PopAndDestroy( &messageBuffer );
       
   230     return r;
       
   231     }
       
   232 
       
   233 //---------------------------------------------------------------------------
       
   234 // CWmDrmSession::SlotSeekL
       
   235 //---------------------------------------------------------------------------
       
   236 //    
       
   237 TInt CWmDrmSession::SlotSeekL( const RMessage2& aMessage )
       
   238     {
       
   239     TInt r = KErrNone;
       
   240     TSeek whence = ESeekStart;
       
   241     TInt pos = aMessage.Int0();
       
   242     TInt size;
       
   243     
       
   244     LOGFNR( "CWmDrmSession::SlotSeekL", r );
       
   245     if ( iSlot == NULL )
       
   246         {
       
   247         User::Leave( KErrNotReady );
       
   248         }
       
   249     switch ( aMessage.Int1() )
       
   250         {
       
   251         case ESeekStart:
       
   252             whence = ESeekStart;
       
   253             break;
       
   254         case ESeekCurrent:
       
   255             whence = ESeekCurrent;
       
   256             break;
       
   257         case ESeekEnd:
       
   258             whence = ESeekEnd;
       
   259             break;
       
   260         default:
       
   261             User::Leave( KErrArgument );
       
   262             break;
       
   263         }
       
   264     r = iSlot->SeekL( pos, whence );
       
   265     if ( r == KErrNone && whence == ESeekStart )
       
   266         {
       
   267         size = iSlot->Size();
       
   268         if ( pos >= size )
       
   269             {
       
   270             pos = 0;
       
   271             r = iSlot->SeekL( pos, ESeekEnd );
       
   272             }
       
   273         }
       
   274     aMessage.WriteL( 2, TPckg<TInt>( pos ) );
       
   275     return r;
       
   276     }
       
   277 
       
   278 //---------------------------------------------------------------------------
       
   279 // CWmDrmSession::SlotReadL
       
   280 //---------------------------------------------------------------------------
       
   281 //    
       
   282 TInt CWmDrmSession::SlotReadL( const RMessage2& aMessage )
       
   283     {
       
   284     TInt r = KErrNone;
       
   285     RBuf8 buf;
       
   286     TInt amountRead = 0;
       
   287     
       
   288     LOGFNR( "CWmDrmSession::SlotReadL", r );
       
   289     if ( iSlot == NULL )
       
   290         {
       
   291         User::Leave( KErrNotReady );
       
   292         }
       
   293     buf.CreateL( aMessage.GetDesMaxLengthL( 0 ) );
       
   294     buf.CleanupClosePushL();
       
   295     r = iSlot->Read( buf );
       
   296     if ( r == KErrNone )
       
   297         {
       
   298         aMessage.WriteL( 0, buf );
       
   299         amountRead = buf.Size();
       
   300         }
       
   301     aMessage.WriteL( 1, TPckg<TInt>( amountRead ) );
       
   302     CleanupStack::PopAndDestroy( &buf );
       
   303     return r;
       
   304     }
       
   305 
       
   306 //---------------------------------------------------------------------------
       
   307 // CWmDrmSession::SlotWriteL
       
   308 //---------------------------------------------------------------------------
       
   309 //    
       
   310 TInt CWmDrmSession::SlotWriteL( const RMessage2& aMessage )
       
   311     {
       
   312     TInt r = KErrNone;
       
   313     RBuf8 buf;
       
   314     
       
   315     LOGFNR( "CWmDrmSession::SlotWriteL", r );
       
   316     if ( iSlot == NULL )
       
   317         {
       
   318         User::Leave( KErrNotReady );
       
   319         }
       
   320     buf.CreateL( aMessage.GetDesLengthL( 0 ) );
       
   321     buf.CleanupClosePushL();
       
   322     aMessage.ReadL( 0, buf );
       
   323     r = iSlot->WriteL( buf );
       
   324     CleanupStack::PopAndDestroy( &buf );
       
   325     return r;
       
   326     }
       
   327     
       
   328 TInt CWmDrmSession::SlotResizeL( const RMessage2& aMessage )
       
   329     {
       
   330     TInt r = KErrNone;
       
   331     
       
   332     LOGFNR( "CWmDrmSession::SlotResizeL", r );
       
   333     if ( iSlot == NULL )
       
   334         {
       
   335         User::Leave( KErrNotReady );
       
   336         }
       
   337     r = iSlot->ResizeL( aMessage.Int0() );
       
   338     return r;
       
   339     }
       
   340 
       
   341 //---------------------------------------------------------------------------
       
   342 // CWmDrmSession::SlotDeleteL
       
   343 //---------------------------------------------------------------------------
       
   344 //    
       
   345 TInt CWmDrmSession::SlotDeleteL( const RMessage2& aMessage )
       
   346     {
       
   347     TInt r = KErrNone;
       
   348     RBuf8 messageBuffer;
       
   349     
       
   350     LOGFNR( "CWmDrmSession::SlotDeleteL", r );
       
   351     if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize )
       
   352         {
       
   353         User::Leave( KErrArgument );
       
   354         }
       
   355     messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
       
   356     messageBuffer.CleanupClosePushL();
       
   357     aMessage.ReadL( 0, messageBuffer );
       
   358     if ( iSlot != NULL )
       
   359         {
       
   360         delete iSlot;
       
   361         iSlot = NULL;
       
   362         }
       
   363     iSlot = CSlot::NewL( &Server(), messageBuffer );
       
   364     r = iSlot->DeleteL();
       
   365     delete iSlot;
       
   366     iSlot = NULL;
       
   367     CleanupStack::PopAndDestroy( &messageBuffer );
       
   368     return r;
       
   369     }
       
   370 
       
   371 //---------------------------------------------------------------------------
       
   372 // CWmDrmSession::SlotCloseL
       
   373 //---------------------------------------------------------------------------
       
   374 //    
       
   375 TInt CWmDrmSession::SlotCloseL( const RMessage2& /*aMessage*/ )
       
   376     {
       
   377     TInt r = KErrNone;
       
   378     
       
   379     LOGFNR( "CWmDrmSession::SlotCloseL", r );
       
   380     if ( iSlot == NULL )
       
   381         {
       
   382         User::Leave( KErrNotReady );
       
   383         }
       
   384     delete iSlot;
       
   385     iSlot = NULL;
       
   386     return r;
       
   387     }
       
   388 
       
   389 //---------------------------------------------------------------------------
       
   390 // CWmDrmSession::EnumerateStartL
       
   391 //---------------------------------------------------------------------------
       
   392 //    
       
   393 TInt CWmDrmSession::EnumerateStartL( const RMessage2& aMessage )
       
   394     {
       
   395     TInt r = KErrNone;
       
   396     RBuf8 messageBuffer;
       
   397     
       
   398     LOGFNR( "CWmDrmSession::EnumerateStartL", r );
       
   399     if ( aMessage.GetDesLength( 0 ) > KMaxSlotNameSize || aMessage.GetDesLength( 0 ) <= 0  )
       
   400         {
       
   401         User::Leave( KErrArgument );
       
   402         }
       
   403     messageBuffer.CreateL( aMessage.GetDesLengthL( 0 ) );
       
   404     messageBuffer.CleanupClosePushL();
       
   405     aMessage.ReadL( 0, messageBuffer );
       
   406     if ( iSlot != NULL )
       
   407         {
       
   408         delete iSlot;
       
   409         iSlot = NULL;
       
   410         }
       
   411     if ( iEnumerator != NULL )
       
   412         {
       
   413         delete iEnumerator;
       
   414         iEnumerator = NULL;
       
   415         }
       
   416     iEnumerator = CEnumerator::NewL( &Server(), messageBuffer );
       
   417     r = iEnumerator->OpenL();
       
   418     CleanupStack::PopAndDestroy( &messageBuffer );
       
   419     return r;
       
   420     }
       
   421 
       
   422 //---------------------------------------------------------------------------
       
   423 // CWmDrmSession::EnumerateReloadL
       
   424 //---------------------------------------------------------------------------
       
   425 //    
       
   426 TInt CWmDrmSession::EnumerateReloadL( const RMessage2& aMessage )
       
   427     {
       
   428     TInt r = KErrNone;
       
   429     TBuf8<KWmDrmIdSize> hash;
       
   430     TBuf8<KWmDrmIdSize> id;
       
   431     
       
   432     LOGFNR( "CWmDrmSession::EnumerateReloadL", r );
       
   433     if ( iEnumerator == NULL )
       
   434         {
       
   435         User::Leave( KErrNotReady );
       
   436         }
       
   437     iEnumerator->GetHashKey( hash );
       
   438     LOGHEX( hash.Ptr(), hash.Size() );
       
   439     iEnumerator->GetUniqueKey( id );
       
   440     LOGHEX( id.Ptr(), id.Size() );
       
   441     aMessage.WriteL( 0, iEnumerator->iStore);
       
   442     aMessage.WriteL( 1, iEnumerator->iNamespace );
       
   443     aMessage.WriteL( 2, hash );
       
   444     aMessage.WriteL( 3, id );
       
   445     return r;
       
   446     }
       
   447 
       
   448 //---------------------------------------------------------------------------
       
   449 // CWmDrmSession::EnumerateNextL
       
   450 //---------------------------------------------------------------------------
       
   451 //    
       
   452 TInt CWmDrmSession::EnumerateNextL( const RMessage2& aMessage )
       
   453     {
       
   454     TInt r = KErrNone;
       
   455     TBuf8<KWmDrmIdSize> hash;
       
   456     TBuf8<KWmDrmIdSize> id;
       
   457     
       
   458     LOGFNR( "CWmDrmSession::EnumerateNextL", r );
       
   459     if ( iEnumerator == NULL )
       
   460         {
       
   461         User::Leave( KErrNotReady );
       
   462         }
       
   463     r = iEnumerator->NextL();
       
   464     if ( r == KErrNone )
       
   465         {
       
   466         iEnumerator->GetHashKey( hash );
       
   467         LOGHEX( hash.Ptr(), hash.Size() );
       
   468         iEnumerator->GetUniqueKey( id );
       
   469         LOGHEX( id.Ptr(), id.Size() );
       
   470         aMessage.WriteL( 0, iEnumerator->iStore);
       
   471         aMessage.WriteL( 1, iEnumerator->iNamespace );
       
   472         aMessage.WriteL( 2, hash );
       
   473         aMessage.WriteL( 3, id );
       
   474         }
       
   475     return r;
       
   476     }
       
   477 
       
   478 //---------------------------------------------------------------------------
       
   479 // CWmDrmSession::EnumerateDeleteL
       
   480 //---------------------------------------------------------------------------
       
   481 //    
       
   482 TInt CWmDrmSession::EnumerateDeleteL ( const RMessage2& /*aMessage*/ )
       
   483     {
       
   484     TInt r = KErrNone;
       
   485     
       
   486     LOGFNR( "CWmDrmSession::EnumerateDeleteL", r );
       
   487     if ( iEnumerator == NULL )
       
   488         {
       
   489         User::Leave( KErrNotReady );
       
   490         }
       
   491     iEnumerator->DeleteCurrentL();
       
   492     return r;
       
   493     }
       
   494 
       
   495 //---------------------------------------------------------------------------
       
   496 // CWmDrmSession::EnumerateEndL
       
   497 //---------------------------------------------------------------------------
       
   498 //
       
   499 TInt CWmDrmSession::EnumerateEndL ( const RMessage2& /*aMessage*/ )
       
   500     {
       
   501     TInt r = KErrNone;
       
   502     
       
   503     LOGFNR( "CWmDrmSession::EnumerateEndL", r );
       
   504     if ( iEnumerator == NULL )
       
   505         {
       
   506         User::Leave( KErrNotReady );
       
   507         }
       
   508     iEnumerator->Close();
       
   509     delete iEnumerator;
       
   510     iEnumerator = NULL;
       
   511     return r;
       
   512     }
       
   513 
       
   514 //---------------------------------------------------------------------------
       
   515 // CWmDrmSession::EmptyCacheL
       
   516 //---------------------------------------------------------------------------
       
   517 //
       
   518 TInt CWmDrmSession::EmptyCacheL( const RMessage2& aMessage )
       
   519     {
       
   520     TInt r = KErrNone;
       
   521     
       
   522     LOGFNR( "CWmDrmSession::EmptyCacheL", r );
       
   523     TRAP_IGNORE( EnumerateEndL( aMessage ) );
       
   524     TRAP_IGNORE( SlotCloseL( aMessage ) );
       
   525     Server().ResetCacheL();
       
   526     return r;
       
   527     }
       
   528 
       
   529 //---------------------------------------------------------------------------
       
   530 // CWmDrmSession::LogStats
       
   531 //---------------------------------------------------------------------------
       
   532 //    
       
   533 TInt CWmDrmSession::LogStats( const RMessage2& /*aMessage*/ )
       
   534     {
       
   535     TInt r = KErrNone;
       
   536 
       
   537 #ifdef _LOGGING    
       
   538     TInt cells;
       
   539     TInt amount;
       
   540     TInt i;
       
   541     TInt j;
       
   542     _LIT( KStatsDir, "wmdrm" );
       
   543     _LIT( KStatsFile, "wmdrmserver.txt" );
       
   544     
       
   545     LOGFNR( "CWmDrmSession::LogStatsL", r );
       
   546     cells = User::AllocSize( amount );
       
   547     RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend, _L( "Statistics:" ) );
       
   548     RFileLogger::WriteFormat( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   549         _L( "Memory: %d cells, %d bytes allocated" ), cells, amount );
       
   550 
       
   551     if (Server().Clock()->TimeIsGood() )
       
   552         {
       
   553         RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend, _L( "Time is valid" ) );
       
   554         }
       
   555     else
       
   556         {
       
   557         RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend, _L( "Time is invalid" ) );
       
   558         }
       
   559 
       
   560     RFileLogger::WriteFormat( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   561         _L( "Cache: %d out of %d slots used" ),
       
   562         Server().Cache()->iSlotCache.Count(),
       
   563         Server().Cache()->iMaxCachedSlots );
       
   564     for ( i = 0; i < Server().Cache()->iSlotCache.Count(); i++ )
       
   565         {
       
   566         RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   567             Server().Cache()->iSlotCache[i]->iHashKey );
       
   568         RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   569             Server().Cache()->iSlotCache[i]->iUniqueKey );
       
   570         }
       
   571 
       
   572     RFileLogger::WriteFormat( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   573         _L( "Enumerators: %d out of %d slots used" ),
       
   574         Server().EnumeratorCache()->iEnumeratorCache.Count(),
       
   575         Server().EnumeratorCache()->iMaxCachedEnumerators );
       
   576     for ( i = 0; i < Server().EnumeratorCache()->iEnumeratorCache.Count(); i++ )
       
   577         {
       
   578         RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   579             Server().EnumeratorCache()->iEnumeratorCache[i]->iHashKey );
       
   580         for ( j = 0; j < Server().EnumeratorCache()->iEnumeratorCache[i]->iEntries.Count(); j++ )
       
   581             {
       
   582             RFileLogger::Write( KStatsDir, KStatsFile, EFileLoggingModeAppend,
       
   583                 *Server().EnumeratorCache()->iEnumeratorCache[i]->iEntries[j] );
       
   584             }
       
   585         }
       
   586 #endif
       
   587     
       
   588     return r;
       
   589     }
       
   590 
       
   591 //---------------------------------------------------------------------------
       
   592 // CWmDrmSession::TimeValid
       
   593 //---------------------------------------------------------------------------
       
   594 //
       
   595 TInt CWmDrmSession::TimeValid( const RMessage2& /*aMessage*/ )
       
   596     {
       
   597     TInt r = KErrNone;
       
   598     
       
   599     LOGFNR( "CWmDrmSession::TimeValid", r );
       
   600     r = Server().Clock()->TimeIsGood();
       
   601     return r;
       
   602     }
       
   603 
       
   604 //---------------------------------------------------------------------------
       
   605 // CWmDrmSession::SetTimeAsValidL
       
   606 //---------------------------------------------------------------------------
       
   607 //    
       
   608 void CWmDrmSession::SetTimeAsValidL( const RMessage2& aMessage )
       
   609     {
       
   610     LOGFN( "CWmDrmSession::TimeValid" );
       
   611     Server().Clock()->SetTimeAsGoodL( aMessage.Int0() == 0 ? EFalse : ETrue );
       
   612     }
       
   613     
       
   614 
       
   615 //---------------------------------------------------------------------------
       
   616 // CWmDrmSession::DeleteRightsL
       
   617 //---------------------------------------------------------------------------
       
   618 //    
       
   619 TInt CWmDrmSession::DeleteRightsL( const RMessage2& /*aMessage*/ )
       
   620     {
       
   621     TInt r = KErrNone;
       
   622     TBool wmDrmRightsConfigFound( EFalse );
       
   623     TChar driveLetter;
       
   624     TDrmScheme drmScheme( EDrmSchemeWmDrm );
       
   625     
       
   626     LOGFNR( "CWmDrmSession::DeleteRightsL", r );
       
   627     // Close EVERYTHING down, clear cache etc, so that we have nothing going on
       
   628     // When we start to delete stuff
       
   629     Server().ResetCacheL();
       
   630     
       
   631     wmDrmRightsConfigFound = DrmRightsStoringLocation::CheckDrmRightsStorageDriveL(
       
   632 	  		Server().Fs(), drmScheme, driveLetter );
       
   633     
       
   634     // If WM DRM rights storage configuration is found, update both databases
       
   635     if ( wmDrmRightsConfigFound )
       
   636         {
       
   637     	Server().DataStore()->UpdateDummyDbFileL( 
       
   638     	    Server().DataStore()->DummyDBSizeL( ETrue ), ETrue );
       
   639     	}
       
   640     Server().DataStore()->UpdateDummyDbFileL( 
       
   641         Server().DataStore()->DummyDBSizeL( EFalse ), EFalse );
       
   642     
       
   643     // Delete license store
       
   644     Server().Db()->DeleteLicenseStoreL();
       
   645     
       
   646     // If WM DRM rights storage configuration is found, update both databases 
       
   647     if ( wmDrmRightsConfigFound )
       
   648     	{
       
   649     	Server().DataStore()->UpdateDummyDbFileL( 0, ETrue );
       
   650     	}	
       
   651     Server().DataStore()->UpdateDummyDbFileL( 0, EFalse );
       
   652     
       
   653     return r;
       
   654     }
       
   655 
       
   656 //---------------------------------------------------------------------------
       
   657 // CWmDrmSession::StoreStateL
       
   658 //---------------------------------------------------------------------------
       
   659 //
       
   660 void CWmDrmSession::StoreStateL( const RMessage2& aMessage )
       
   661     {
       
   662     TWmDrmStoreState state;
       
   663     
       
   664     LOGFN( "CWmDrmSession::StoreStateL" );
       
   665     state = Server().DataStore()->DataStoreStateL();
       
   666     aMessage.WriteL( 0, TPckg<TWmDrmStoreState>( state ) );
       
   667     }
       
   668 
       
   669 //---------------------------------------------------------------------------
       
   670 // CWmDrmSession::GetTimeL
       
   671 //---------------------------------------------------------------------------
       
   672 //
       
   673 void CWmDrmSession::GetTimeL( const RMessage2& aMessage )
       
   674     {
       
   675     TTime time = Time::NullTTime();
       
   676     TBool validity = EFalse;
       
   677     TPckg<TTime> timePckg(time);
       
   678     TPckg<TBool> validityPckg(validity);
       
   679     
       
   680     LOGFN( "CWmDrmSession::GetTimeL" );
       
   681     
       
   682     // Get the time from the clock
       
   683     Server().Clock()->GetTimeL( time, validity );
       
   684     
       
   685     aMessage.WriteL(0, timePckg);
       
   686     aMessage.WriteL(1, validityPckg);
       
   687     }
       
   688 
       
   689  
       
   690 //---------------------------------------------------------------------------
       
   691 // CWmDrmSession::ServiceL
       
   692 //---------------------------------------------------------------------------
       
   693 //    
       
   694 void CWmDrmSession::ServiceL( const RMessage2& aMessage )
       
   695 	{
       
   696 	TInt r = KErrNone;
       
   697 	TInt trap = KErrNone;
       
   698 	_LIT_SECURITY_POLICY_C1(drmCheck, ECapabilityDRM);
       
   699     RThread client;
       
   700 	
       
   701 	LOGFNR( "CWmDrmSession::ServiceL", r );
       
   702 #ifdef _LOGGING
       
   703     TInt c;
       
   704     TInt s;
       
   705     c = User::AllocSize(s);
       
   706     LOG3( "Memory: %d cells, %d bytes allocated", c, s );
       
   707 #endif
       
   708 
       
   709     aMessage.ClientL( client );
       
   710 
       
   711     if ( !drmCheck().CheckPolicy( client ) )
       
   712         {
       
   713         r = KErrAccessDenied;
       
   714         }
       
   715     else
       
   716         {
       
   717         switch ( aMessage.Function() )
       
   718             {
       
   719             case EInitStore:
       
   720                 TRAP( trap, r = InitStoreL( aMessage ) );
       
   721                 break;
       
   722             case ERemoveStore:
       
   723                 TRAP( trap, r = RemoveStoreL( aMessage ) );
       
   724                 break;
       
   725             case EInitNamespace:
       
   726                 TRAP( trap, r = InitNamespaceL( aMessage ) );
       
   727                 break;
       
   728             case ERemoveNamespace:
       
   729                 TRAP( trap, r = RemoveNamespaceL( aMessage ) );
       
   730                 break;
       
   731             case ESlotOpen:
       
   732                 TRAP( trap, r = SlotOpenL( aMessage ) );
       
   733                 break;
       
   734             case ESlotCreate:
       
   735                 TRAP( trap, r = SlotCreateL( aMessage ) );
       
   736                 break;
       
   737             case ESlotSeek:
       
   738                 TRAP( trap, r = SlotSeekL( aMessage ) );
       
   739                 break;
       
   740             case ESlotRead:
       
   741                 TRAP( trap, r = SlotReadL( aMessage ) );
       
   742                 break;
       
   743             case ESlotWrite:
       
   744                 TRAP( trap, r = SlotWriteL( aMessage ) );
       
   745                 break;
       
   746             case ESlotDelete:
       
   747                 TRAP( trap, r = SlotDeleteL( aMessage ) );
       
   748                 break;
       
   749             case ESlotResize:
       
   750                 TRAP( trap, r = SlotResizeL( aMessage ) );
       
   751                 break;
       
   752             case ESlotClose:
       
   753                 TRAP( trap, r = SlotCloseL( aMessage ) );
       
   754                 break;
       
   755             case EEnumerateStart:
       
   756                 TRAP( trap, r = EnumerateStartL( aMessage ) );
       
   757                 break;
       
   758             case EEnumerateReload:
       
   759                 TRAP( trap, r = EnumerateReloadL( aMessage ) );
       
   760                 break;
       
   761             case EEnumerateNext:
       
   762                 TRAP( trap, r = EnumerateNextL( aMessage ) );
       
   763                 break;
       
   764             case EEnumerateDelete:
       
   765                 TRAP( trap, r = EnumerateDeleteL( aMessage ) );
       
   766                 break;
       
   767             case EEnumerateEnd:
       
   768                 TRAP( trap, r = EnumerateEndL( aMessage ) );
       
   769                 break;
       
   770             case ELogStats:
       
   771                 r = LogStats( aMessage );
       
   772                 break;
       
   773             case EEmptyCache:
       
   774                 TRAP( trap, r = EmptyCacheL( aMessage ) );
       
   775                 break;
       
   776             case ETimeValid:
       
   777                 r = TimeValid( aMessage );
       
   778                 break;
       
   779             case ESetTimeAsValid:
       
   780                 TRAP( trap, SetTimeAsValidL( aMessage ) );
       
   781                 break;
       
   782             case EDeleteRights:
       
   783                 TRAP( trap, DeleteRightsL( aMessage ) );
       
   784                 break;
       
   785             case EStoreState:
       
   786                 TRAP( trap, StoreStateL( aMessage ) );
       
   787                 break;
       
   788             case EGetTime:
       
   789                 TRAP( trap, GetTimeL( aMessage ) );
       
   790                 break;              
       
   791             default:
       
   792                 r = KErrArgument;
       
   793                 break;
       
   794                 }
       
   795         if ( trap != KErrNone )
       
   796             {
       
   797             r = trap;
       
   798             }
       
   799         if ( r == KErrDiskFull || r == KErrNoMemory )
       
   800             {
       
   801             TRAP_IGNORE( EmptyCacheL( aMessage ) );
       
   802             }
       
   803         }
       
   804     client.Close();
       
   805     LOG2( "** ServiceL error: %d", r );
       
   806     aMessage.Complete( r );
       
   807 	}
       
   808 
       
   809 //---------------------------------------------------------------------------
       
   810 // CWmDrmSession::ServiceError
       
   811 //---------------------------------------------------------------------------
       
   812 //
       
   813 void CWmDrmSession::ServiceError( const RMessage2& aMessage, TInt aError )
       
   814 	{
       
   815 	LOGFN( "CWmDrmSession::ServiceError" );
       
   816 	LOG2( "** Error: %d", aError );
       
   817 	CSession2::ServiceError( aMessage, aError );
       
   818 	}
       
   819 
       
   820 //---------------------------------------------------------------------------
       
   821 // CWmDrmSession::Server
       
   822 //---------------------------------------------------------------------------
       
   823 //
       
   824 CWmDrmServer& CWmDrmSession::Server()
       
   825 	{
       
   826 	return *static_cast<CWmDrmServer*>( const_cast<CServer2*>( CSession2::Server() ) );
       
   827 	}