diff -r 000000000000 -r 95b198f216e5 omadrm/drmengine/roapstorage/src/DRMContextDB.cpp --- /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 +#include +#include + +#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& 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