omadrm/drmengine/roapstorage/src/DRMContextDB.cpp
changeset 0 95b198f216e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/roapstorage/src/DRMContextDB.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,941 @@
+/*
+* Copyright (c) 2004 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:  Datatype for Rights Constraint
+*
+*/
+
+
+
+// INCLUDE FILES
+#include <s32file.h>
+#include <s32std.h>
+#include <caf/caf.h>
+
+#include "DRMContextDB.h"
+#include "DRMRIContext.h"
+#include "DRMDomainContext.h"
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::NewLC
+// -----------------------------------------------------------------------------
+//
+CDRMContextDB* CDRMContextDB::NewLC( const TFileName& aRightsIssuerContextFile, 
+                                     const TFileName& aDomainContextFile,
+                                     RFs& aFileServer )
+    {
+    CDRMContextDB* self = new( ELeave ) CDRMContextDB( aFileServer );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRightsIssuerContextFile, 
+                      aDomainContextFile );
+
+    return self;    
+    };
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::NewL
+// -----------------------------------------------------------------------------
+//
+CDRMContextDB* CDRMContextDB::NewL( const TFileName& aRightsIssuerContextFile, 
+                                    const TFileName& aDomainContextFile,
+                                    RFs& aFileServer )
+    {
+    CDRMContextDB* self = NewLC( aRightsIssuerContextFile, 
+                                 aDomainContextFile,  
+                                 aFileServer );
+    CleanupStack::Pop();	
+    
+    return self;    
+    };
+                                 
+// -----------------------------------------------------------------------------
+// CDRMContextDB::OpenLC
+// -----------------------------------------------------------------------------
+//
+CDRMContextDB* CDRMContextDB::OpenLC( const TFileName& aRightsIssuerContextFile, 
+                                      const TFileName& aDomainContextFile,
+                                      RFs& aFileServer )
+    {
+    CDRMContextDB* self = new( ELeave ) CDRMContextDB( aFileServer );
+    CleanupStack::PushL( self );    
+    self->ConstructL( aRightsIssuerContextFile, 
+                      aDomainContextFile );
+    
+    return self;
+    };    
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::OpenL
+// -----------------------------------------------------------------------------
+//
+CDRMContextDB* CDRMContextDB::OpenL( const TFileName& aRightsIssuerContextFile, 
+                                     const TFileName& aDomainContextFile,
+                                     RFs& aFileServer )
+    {
+    CDRMContextDB* self = OpenLC( aRightsIssuerContextFile, 
+                                  aDomainContextFile,  
+                                  aFileServer );
+    CleanupStack::Pop();
+    
+    return self;    
+    };    
+    
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+// 
+CDRMContextDB::~CDRMContextDB()
+    {
+    // Permanent File Store
+    if( iDomainStore )
+        {
+        delete iDomainStore;
+        iDomainStore = NULL;
+        }
+        
+    // Permanent File Store
+    if( iRightsIssuerStore )
+        {
+        delete iRightsIssuerStore;
+        iRightsIssuerStore = NULL;
+        }
+        
+    // index array    
+    iDomainArray.Close();
+    
+    // index array
+    iRightsIssuerArray.Close();
+    }; 
+      
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::StoreDomainContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::StoreDomainContextL( const CDRMDomainContext& aContext )
+    {
+    TStreamId rootId;
+    RStoreWriteStream stream;
+    RStoreWriteStream rootStream;
+    CDRMContextDB::TContextIndex searchData;
+    TInt index;
+    
+    // Copy the domain id to the 
+    searchData.iContextID.Copy( aContext.DomainID() );
+    
+    // get the id from the array if it doesn't exist, error
+    index = iDomainArray.Find( searchData, TContextIndex::Match );    
+    
+    if( index == KErrNotFound )
+        {
+        TStreamId sid;
+        // Create a new stream to the store:
+        sid = stream.CreateLC( *iDomainStore );    
+        
+        searchData.iStreamID = sid.Value();
+        
+        // Externalize the domain data
+        aContext.ExternalizeL( stream );
+        stream.CommitL();
+        
+        // add the id to the array
+        iDomainArray.Append( searchData );
+        
+        // Get the stream id of the root
+        rootId = iDomainStore->Root();  
+        
+        // Open the root stream
+        rootStream.ReplaceLC( *iDomainStore, rootId );
+        
+        // Store the changed index
+        StoreDomainIndexL( rootStream );    
+        rootStream.CommitL(); 
+        
+        // Commit the store
+        iDomainStore->CommitL();                      
+        
+        CleanupStack::PopAndDestroy();  // root stream
+        CleanupStack::PopAndDestroy();  // stream       
+        }
+    else
+        {
+        // open an existing one
+        TStreamId sid( iDomainArray[ index ].iStreamID );
+        
+        // Replace the existing stream
+        stream.ReplaceLC( *iDomainStore, sid );
+    
+        // Externalize the permission data
+        aContext.ExternalizeL( stream );
+    
+        // Required by the ReplaceLC
+        stream.CommitL();
+
+        // Commit the store    
+        iDomainStore->CommitL();
+    
+        CleanupStack::PopAndDestroy(); // stream    
+        }
+        
+    iDomainStore->CompactL();
+    iDomainStore->CommitL();
+    };    
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchDomainContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchDomainContextL( CDRMDomainContext& aContext ) const
+    {   
+    RStoreReadStream stream;
+    TUint32 index = 0;
+
+    TContextIndex searchData;
+    
+    // Copy the domain id to the search data
+    searchData.iContextID.Copy( aContext.DomainID() );
+    
+    // get the id from the array if it doesn't exist, error
+    User::LeaveIfError( index = iDomainArray.Find( searchData, 
+                                                   TContextIndex::Match ) );
+
+    TStreamId sid( iDomainArray[ index ].iStreamID );
+    // Open the root stream
+    
+    stream.OpenLC( *iDomainStore, sid );
+
+    // Read the common id
+    aContext.InternalizeL( stream );
+    
+    // Close the stream
+    CleanupStack::PopAndDestroy();        
+    };
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchDomainContextL 
+// For getting with the current id
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchDomainContextL( CDRMDomainContext& aContext, 
+                                         const TInt32& aStream ) const
+    {
+    RStoreReadStream stream;
+    TStreamId sid( aStream );
+       
+    stream.OpenLC( *iDomainStore, sid );
+
+    // Read the common id
+    aContext.InternalizeL( stream );
+    
+    // Close the stream
+    CleanupStack::PopAndDestroy();        
+    };    
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::DeleteDomainContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::DeleteDomainContextL( const TDesC8& aDomainID )
+    {
+    TStreamId rootId;
+    TInt index = 0;
+    RStoreWriteStream rootStream;
+
+    TContextIndex searchData;
+    
+    // Copy the domain id to the search data
+    // The last three digits presents the Domain generation
+    searchData.iContextID.Copy( aDomainID.Mid(0, aDomainID.Length() - 3 ) );
+    
+    // get the id from the array if it doesn't exist, error
+    index = iDomainArray.Find( searchData, TContextIndex::Match ); 
+    
+    User::LeaveIfError( index = iDomainArray.Find( searchData, 
+                                                   TContextIndex::Match ) );
+
+    TStreamId sid( iDomainArray[ index ].iStreamID );
+
+    // Delete the stream from the store
+    iDomainStore->DeleteL( sid );
+            
+    iDomainArray.Remove( index );       
+    
+    
+    // Get the stream id of the root
+    rootId = iDomainStore->Root();
+    
+    // Open the root stream
+    rootStream.ReplaceLC( *iDomainStore, rootId );
+        
+    // Store the changed index
+    StoreDomainIndexL( rootStream );    
+    rootStream.CommitL();
+
+    // Commit the store
+    iDomainStore->CommitL();
+    
+    CleanupStack::PopAndDestroy();  // root stream
+    
+    // Compact and commit the changes
+    iDomainStore->CompactL();
+    iDomainStore->CommitL();        
+    };
+ 
+// -----------------------------------------------------------------------------
+// CDRMContextDB::StoreRightsIssuerContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::StoreRightsIssuerContextL( const CDRMRIContext& aContext )
+    {
+    TStreamId rootId;
+    RStoreWriteStream stream;
+    RStoreWriteStream rootStream;
+    TContextIndex searchData;
+    TInt index;
+    
+    // Copy the domain id to the 
+    searchData.iContextID.Copy( aContext.RIID() );
+    
+    // get the id from the array if it doesn't exist, error
+    index = iRightsIssuerArray.Find( searchData, TContextIndex::Match );    
+    
+    if( index == KErrNotFound )
+        {
+        TStreamId sid;
+        // Create a new stream to the store:
+        sid = stream.CreateLC( *iRightsIssuerStore );    
+        
+        searchData.iStreamID = sid.Value();
+        
+        // Externalize the domain data
+        aContext.ExternalizeL( stream );
+        stream.CommitL();
+        
+        // add the id to the array
+        iRightsIssuerArray.Append( searchData );
+        
+        // Get the stream id of the root
+        rootId = iRightsIssuerStore->Root();  
+        
+        // Open the root stream
+        rootStream.ReplaceLC( *iRightsIssuerStore, rootId );
+        
+        // Store the changed index
+        StoreRightsIssuerIndexL( rootStream );    
+        rootStream.CommitL(); 
+        
+        // Commit the store
+        iRightsIssuerStore->CommitL();                      
+        
+        CleanupStack::PopAndDestroy();  // root stream
+        CleanupStack::PopAndDestroy();  // stream       
+        }
+    else
+        {
+        // open an existing one
+        TStreamId sid( iRightsIssuerArray[ index ].iStreamID );
+        
+        // Replace the existing stream
+        stream.ReplaceLC( *iRightsIssuerStore, sid );
+    
+        // Externalize the permission data
+        aContext.ExternalizeL( stream );
+    
+        // Required by the ReplaceLC
+        stream.CommitL();
+
+        // Commit the store    
+        iRightsIssuerStore->CommitL();
+    
+        CleanupStack::PopAndDestroy(); // stream    
+        }
+        
+    iRightsIssuerStore->CompactL();
+    iRightsIssuerStore->CommitL();
+    };    
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchRightsIssuerContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchRightsIssuerContextL( CDRMRIContext& aContext ) const
+    {   
+    RStoreReadStream stream;
+    TUint32 index = 0;
+
+    TContextIndex searchData;
+    
+    // Copy the domain id to the search data
+    searchData.iContextID.Copy( aContext.RIID() );
+    
+    // get the id from the array if it doesn't exist, error
+    User::LeaveIfError( index = iRightsIssuerArray.Find( searchData, 
+                                                   TContextIndex::Match ) );
+
+    TStreamId sid( iRightsIssuerArray[ index ].iStreamID );
+    // Open the root stream
+    
+    stream.OpenLC( *iRightsIssuerStore, sid );
+
+    // Read the common id
+    aContext.InternalizeL( stream );
+    
+    // Close the stream
+    CleanupStack::PopAndDestroy();        
+    };
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchRightsIssuerContextL 
+// For getting with the current id
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchRightsIssuerContextL( CDRMRIContext& aContext, 
+                                               const TInt32& aStream ) const
+    {
+    RStoreReadStream stream;
+    TStreamId sid( aStream );
+       
+    stream.OpenLC( *iRightsIssuerStore, sid );
+
+    // Read the common id
+    aContext.InternalizeL( stream );
+    
+    // Close the stream
+    CleanupStack::PopAndDestroy();        
+    };
+
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchAllRightsIssuerContextsL
+// For getting with the current id
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchAllRightsIssuerContextsL( RPointerArray<CDRMRIContext>& aContexts) const
+    {
+    CDRMRIContext* context = NULL;
+
+    // No RI contexts to retrieve
+    if ( iRightsIssuerArray.Count() == 0) 
+        {
+        return;
+        }
+    
+    for( TInt count = 0; count < iRightsIssuerArray.Count(); count++ )
+        {
+        context = CDRMRIContext::NewLC();
+        FetchRightsIssuerContextL( *context, iRightsIssuerArray[ count ].iStreamID );
+        aContexts.AppendL( context );
+        CleanupStack::Pop( context );    
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::UpdateRightsIssuerContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::UpdateRightsIssuerContextL( const CDRMRIContext& aContext )
+    {
+    TStreamId rootId;
+    TInt index = 0;
+    RStoreWriteStream stream;    
+    CDRMRIContext* context = NULL;
+    
+    TContextIndex searchData;
+    
+    // Copy the domain id to the search data
+    searchData.iContextID.Copy( aContext.RIID() );
+    
+    // get the id from the array if it doesn't exist, error
+    User::LeaveIfError( index = iRightsIssuerArray.Find( searchData, 
+                                                   TContextIndex::Match ) );
+
+    TStreamId sid( iRightsIssuerArray[ index ].iStreamID );
+    
+    // Read the old context:    
+    context = CDRMRIContext::NewLC();
+    FetchRightsIssuerContextL( *context, iRightsIssuerArray[ index ].iStreamID );
+    
+    // update only the metering status:    
+    context->SetMeteringStatus( aContext.IsMeteringAllowed() );
+    
+    // Replace the existing stream
+    stream.ReplaceLC( *iRightsIssuerStore, sid );
+    
+    // Externalize the permission data
+    context->ExternalizeL( stream );
+     
+    // Required by the ReplaceLC
+    stream.CommitL();   
+    
+    // Commit the store    
+    iRightsIssuerStore->CommitL();
+    
+    CleanupStack::PopAndDestroy(); // stream
+    CleanupStack::PopAndDestroy(context);        
+    
+    
+    // Compact and commit the changes
+    iRightsIssuerStore->CompactL();
+    iRightsIssuerStore->CommitL();        
+    };
+
+
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::DeleteRightsIssuerContextL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::DeleteRightsIssuerContextL( const TDesC8& aStream )
+    {
+    TStreamId rootId;
+    TInt index = 0;
+    RStoreWriteStream rootStream;
+
+    TContextIndex searchData;
+    
+    // Copy the domain id to the search data
+    searchData.iContextID.Copy( aStream );
+    
+    // get the id from the array if it doesn't exist, error
+    User::LeaveIfError( index = iRightsIssuerArray.Find( searchData, 
+                                                   TContextIndex::Match ) );
+
+    TStreamId sid( iRightsIssuerArray[ index ].iStreamID );
+
+    // Delete the stream from the store
+    iRightsIssuerStore->DeleteL( sid );
+            
+    iRightsIssuerArray.Remove( index );       
+    
+    
+    // Get the stream id of the root
+    rootId = iRightsIssuerStore->Root();
+    
+    // Open the root stream
+    rootStream.ReplaceLC( *iRightsIssuerStore, rootId );
+        
+    // Store the changed index
+    StoreDomainIndexL( rootStream );    
+    rootStream.CommitL();
+
+    // Commit the store
+    iRightsIssuerStore->CommitL();
+    
+    CleanupStack::PopAndDestroy();  // root stream
+    
+    // Compact and commit the changes
+    iRightsIssuerStore->CompactL();
+    iRightsIssuerStore->CommitL();        
+    }; 
+                           
+// -----------------------------------------------------------------------------
+// CDRMContextDB::WhiteListURLExistsL
+// -----------------------------------------------------------------------------
+//
+TBool CDRMContextDB::WhiteListURLExistsL( const TDesC8& aRightsIssuerURL )
+    {
+    CDRMRIContext* context = NULL;
+    TBool retVal = EFalse;
+
+    if ( iRightsIssuerArray.Count() == 0) 
+        {
+        return retVal;
+        }
+    
+    context = CDRMRIContext::NewLC();
+    
+    for( TInt count = 0; count < iRightsIssuerArray.Count(); count++ )
+        {
+        FetchRightsIssuerContextL( *context, iRightsIssuerArray[ count ].iStreamID );
+        if( context->WhiteListURLExistsL( aRightsIssuerURL ) )
+            {
+            retVal = ETrue;
+            count = iRightsIssuerArray.Count();           
+            }
+        }
+    CleanupStack::PopAndDestroy(); // context       
+    return retVal;    
+    };    
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::DeleteExpiredDomainContextsL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::DeleteExpiredDomainContextsL( const TTime& aTime )
+    {  
+    CDRMDomainContext* context = NULL;    
+    TStreamId rootId;
+    RStoreWriteStream rootStream;
+
+    // Check if there is anything to go through
+    if ( iDomainArray.Count() == 0) 
+        {
+        return;
+        }
+      
+    context = CDRMDomainContext::NewLC();
+        
+    // Delete all permissions from the store which have expired    
+    for( TInt i = 0; i < iDomainArray.Count();)
+        {
+        FetchDomainContextL( *context, iDomainArray[i].iStreamID );
+        
+        if( context->ExpiryTime() < aTime && context->ExpiryTime() != Time::NullTTime() )
+            {
+            iDomainStore->DeleteL( TStreamId( iDomainArray[i].iStreamID ) );
+            iDomainArray.Remove(i);
+            }
+        else 
+            {
+            i++; // increment the counter for the next run       
+            }   
+        }
+        
+    CleanupStack::PopAndDestroy();  // context
+    
+    // Get the stream id of the root
+    rootId = iDomainStore->Root();
+    
+    // Open the root stream
+    rootStream.ReplaceLC( *iDomainStore, rootId );
+        
+    // Store the changed index
+    StoreDomainIndexL( rootStream );    
+    rootStream.CommitL();
+
+    // Commit the store
+    iDomainStore->CommitL();
+    
+    CleanupStack::PopAndDestroy();  // root stream
+    
+    // Compact and Commit the store
+    iDomainStore->CompactL();
+    iDomainStore->CommitL();          
+    };
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::DeleteExpiredRightsIssuerContextsL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::DeleteExpiredRightsIssuerContextsL( const TTime& aTime )
+    {
+    CDRMRIContext* context = NULL;    
+    TStreamId rootId;
+    RStoreWriteStream rootStream;
+
+    // Check if there is anything to go through
+    if ( iRightsIssuerArray.Count() == 0) 
+        {
+        return;
+        }
+        
+    context = CDRMRIContext::NewLC(); 
+           
+    // Delete all permissions from the store which have expired    
+    for( TInt i = 0; i < iRightsIssuerArray.Count();)
+        {
+        FetchRightsIssuerContextL( *context, iRightsIssuerArray[i].iStreamID );
+        
+        if( context->ExpiryTime() < aTime && context->ExpiryTime() != Time::NullTTime() )
+            {
+            iRightsIssuerStore->DeleteL( TStreamId( iRightsIssuerArray[i].iStreamID ) );
+            iRightsIssuerArray.Remove(i);
+            }
+        else
+            {
+            i++; // increment the counter for the next run                 
+            }       
+        }
+        
+    CleanupStack::PopAndDestroy();  // context 
+    
+    // Get the stream id of the root
+    rootId = iRightsIssuerStore->Root();
+    
+    // Open the root stream
+    rootStream.ReplaceLC( *iRightsIssuerStore, rootId );
+        
+    // Store the changed index
+    StoreRightsIssuerIndexL( rootStream );    
+    rootStream.CommitL();
+
+    // Commit the store
+    iRightsIssuerStore->CommitL();
+    
+    CleanupStack::PopAndDestroy();  // root stream
+    
+    // Compact and Commit the store
+    iRightsIssuerStore->CompactL();
+    iRightsIssuerStore->CommitL();           
+    };
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::CreateAndInitializeRIStoreL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::CreateAndInitializeRIStoreL( const TFileName& aRightsIssuerStore )
+    {
+    TStreamId rootId;  
+    RStoreWriteStream rootStream;
+        
+    // Create and initialize the permanent file store
+    iRightsIssuerStore = CPermanentFileStore::ReplaceL( iFileServer, 
+                                                        aRightsIssuerStore,
+                                                        EFileRead|EFileWrite );                                          
+    iRightsIssuerStore->SetTypeL( KPermanentFileStoreLayoutUid );
+    iRightsIssuerStore->CommitL(); 
+    
+    // Create the root stream:                                                   
+    rootId = rootStream.CreateLC( *iRightsIssuerStore );
+         
+    // Create the index
+    // Commit the previous changes 
+    StoreRightsIssuerIndexL( rootStream );
+    rootStream.CommitL();
+    
+    iRightsIssuerStore->SetRootL( rootId );
+    iRightsIssuerStore->CommitL();  
+    
+    // Commit the changes to the store as well
+    CleanupStack::PopAndDestroy(); // rootStream
+    
+    iRightsIssuerStore->CompactL();
+    iRightsIssuerStore->CommitL();
+    };
+
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::CreateAndInitializeDomainStoreL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::CreateAndInitializeDomainStoreL( const TFileName& aDomainStore )
+    {
+    TStreamId rootId;  
+    RStoreWriteStream rootStream;
+        
+    // Create and initialize the permanent file store
+    iDomainStore = CPermanentFileStore::ReplaceL( iFileServer, 
+                                                        aDomainStore,
+                                                        EFileRead|EFileWrite );                                          
+    iDomainStore->SetTypeL( KPermanentFileStoreLayoutUid );
+    iDomainStore->CommitL(); 
+    
+    // Create the root stream:                                                   
+    rootId = rootStream.CreateLC( *iDomainStore );
+                                               
+    // Create the index
+    // Commit the previous changes 
+    StoreDomainIndexL( rootStream );
+    rootStream.CommitL();
+    
+    iDomainStore->SetRootL( rootId );   
+    iDomainStore->CommitL();    
+        
+    // Commit the changes to the store as well
+    CleanupStack::PopAndDestroy(); // rootStream 
+    
+    iDomainStore->CompactL();
+    iDomainStore->CommitL();       
+    };
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::StoreRightsIssuerIndexL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::StoreRightsIssuerIndexL( RWriteStream& aStream ) const
+    {
+    // Write the array size and possibly the array to the stream
+    aStream.WriteInt32L( iRightsIssuerArray.Count() );
+             
+    for( TInt count = 0; count < iRightsIssuerArray.Count(); count++ )
+        {
+        aStream << iRightsIssuerArray[ count ].iContextID;
+        aStream.WriteUint32L( iRightsIssuerArray[ count ].iStreamID );
+        }
+    };
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::StoreDomainIndexL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::StoreDomainIndexL( RWriteStream& aStream ) const
+    {
+    // Write the array size and possibly the array to the stream
+    aStream.WriteInt32L( iDomainArray.Count() );
+    
+    for( TInt count = 0; count < iDomainArray.Count(); count++ )
+        {
+        aStream << iDomainArray[ count ].iContextID;
+        aStream.WriteUint32L( iDomainArray[ count ].iStreamID );
+        }
+    };
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchRightsIssuerIndexL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchRightsIssuerIndexL()
+    {
+    TStreamId rootId;
+    RStoreReadStream stream;
+    TInt count = 0;
+    TContextIndex index;
+ 
+    // Get the stream id of the root
+    rootId = iRightsIssuerStore->Root();
+    
+    // Open the root stream
+    stream.OpenLC( *iRightsIssuerStore, rootId );
+    
+    // read the count of the array:
+    iRightsIssuerArray.Reset();
+    
+    count = stream.ReadInt32L();
+    
+    for( ; count > 0; count-- )
+        {
+        stream >> index.iContextID;
+        index.iStreamID = stream.ReadInt32L();
+        iRightsIssuerArray.Append( index );
+        }
+     
+    // Close the stream
+    CleanupStack::PopAndDestroy();    
+    };
+    
+// -----------------------------------------------------------------------------
+// CDRMContextDB::FetchDomainIndexL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::FetchDomainIndexL()
+    {
+    TStreamId rootId;
+    RStoreReadStream stream;
+    TInt count = 0;
+    TContextIndex index;
+ 
+    // Get the stream id of the root
+    rootId = iDomainStore->Root();
+    
+    // Open the root stream
+    stream.OpenLC( *iDomainStore, rootId );
+    
+    // read the count of the array:
+    iDomainArray.Reset();
+    
+    count = stream.ReadInt32L();
+    
+    for( ; count > 0; count-- )
+        {
+        stream >> index.iContextID;
+        index.iStreamID = stream.ReadInt32L();
+        iDomainArray.Append( index );
+        }
+     
+    // Close the stream
+    CleanupStack::PopAndDestroy();    
+    };
+
+// -----------------------------------------------------------------------------
+// CDRMContextDB::DeleteAllL
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::DeleteAllL( const TFileName& aRightsIssuerContextFile, 
+                                const TFileName& aDomainContextFile )
+    {
+    delete iRightsIssuerStore;
+    iRightsIssuerStore = NULL;
+    iRightsIssuerArray.Reset();
+    CreateAndInitializeRIStoreL( aRightsIssuerContextFile );
+ 
+    delete iDomainStore;
+    iDomainStore = NULL;
+    iDomainArray.Reset();
+    CreateAndInitializeDomainStoreL( aDomainContextFile );
+    }
+
+// -----------------------------------------------------------------------------
+// Default Constructor - First phase.
+// Can be used by itself to generate an empty object
+// -----------------------------------------------------------------------------
+//
+CDRMContextDB::CDRMContextDB( RFs& aFileServer ) :
+    iFileServer( aFileServer )
+    {
+    };
+
+// -----------------------------------------------------------------------------
+// 2nd phase Constructor
+// -----------------------------------------------------------------------------
+//
+void CDRMContextDB::ConstructL( const TFileName& aRightsIssuerContextFile, 
+                                const TFileName& aDomainContextFile )
+    {
+    TInt error = KErrNone;
+    
+    // Open the file store
+    TRAP( error, iRightsIssuerStore = CPermanentFileStore::OpenL( iFileServer, 
+                                                      aRightsIssuerContextFile, 
+                                                      EFileRead|EFileWrite ) );
+    if( error == KErrNotFound )
+        {
+        CreateAndInitializeRIStoreL( aRightsIssuerContextFile );
+        }
+    else 
+        {   
+        User::LeaveIfError( error );
+        
+        // Get the index
+        FetchRightsIssuerIndexL();       
+        }    
+    
+    
+    // Open the file store
+    TRAP( error, iDomainStore = CPermanentFileStore::OpenL( iFileServer, 
+                                                      aDomainContextFile, 
+                                                      EFileRead|EFileWrite ) );
+    if( error == KErrNotFound ) 
+        {
+        CreateAndInitializeDomainStoreL( aDomainContextFile );
+        }
+    else 
+        {   
+        User::LeaveIfError( error );
+        
+        // Get the index
+        FetchDomainIndexL();       
+        
+        }
+    };
+            
+// End of File