diff -r 000000000000 -r 08ec8eefde2f persistentstorage/dbms/security/SC_DomainLoader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/dbms/security/SC_DomainLoader.cpp Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,190 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// CPolicyDomainLoader class +// +// + +#include +#include "D32Strings.h" +#include "SC_StrmIn.h" +#include "SC_DomainLoader.h" + +//This function returns ETrue if the drives in aPath1 and aPath2 are equal. +TBool CheckDrivesL(const TDesC& aPath1, const TDesC& aPath2) + { + __ASSERT(aPath1.Length() > 0); + __ASSERT(aPath2.Length() > 0); + + TChar drvc1 = aPath1[0]; + TInt drv1; + __LEAVE_IF_ERROR(RFs::CharToDrive(drvc1, drv1)); + + TChar drvc2 = aPath2[0]; + TInt drv2; + __LEAVE_IF_ERROR(RFs::CharToDrive(drvc2, drv2)); + + return drv1 == drv2; + } + +namespace DBSC +{ + +/** +@param aFs A reference to a file server session object +@param aPolicyDir A reference to policy file sdirectory +@param aPDCollection The created policy domain objects will be stored in this output parameter. +*/ +inline CPolicyDomainLoader::CPolicyDomainLoader(RFs& aFs, const TDesC& aPolicyDir, + RMap& aPDCollection) : + iFs(aFs), + iPolicyDir(aPolicyDir), + iPDCollection(aPDCollection) + { + __ASSERT(iPolicyDir.Length() > 0); + __ASSERT(iPDCollection.Count() == 0); + } + +/** +Standard phase-one CPolicyDomainLoader factory method +@param aFs A reference to a file server session object +@param aPolicyDir A reference to policy file sdirectory +@param aPDCollection The created policy domain objects will be stored in this output parameter. +@return A pointer to just created CPolicyDomainLoader instance. +@leave System-wide error codes, including KErrNoMemory +*/ +CPolicyDomainLoader* CPolicyDomainLoader::NewLC(RFs& aFs, const TDesC& aPolicyDir, + RMap& aPDCollection) + { + CPolicyDomainLoader* self = new (ELeave) CPolicyDomainLoader(aFs, aPolicyDir, aPDCollection); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +/** +*/ +CPolicyDomainLoader::~CPolicyDomainLoader() + { + delete iFoundPolicyFiles; + } + +/** +Standard phase-two CPolicyDomainLoader construction method. +It does a search for binary policy files in the system and creates and stores +a list of found ones in iFoundPolicyFiles data member. +@leave System-wide error codes, including KErrNoMemory +*/ +void CPolicyDomainLoader::ConstructL() + { + TFindFile findFile(iFs); + TInt err = findFile.FindWildByDir(KPolicyFileExtMask, iPolicyDir, iFoundPolicyFiles); + if(err == KErrNone) + {//Check if the found drive is the same as the drive in iPolicyDir. + if(!::CheckDrivesL(findFile.File(), iPolicyDir)) + { + err = KErrNotFound; + } + } + __LEAVE_IF_ERROR(err); + } + +/** +The method creates the policy file path related to aPolicyFileIndex entry in +iFoundPolicyFiles list of binary policy file names. The path will be stored +in iPolicyFilePath data member. +@param aPolicyFileIndex Index of binary policy file name in iFoundPolicyFiles list. +@return The UID, extracted from binary policy file name. +@leave System-wide error codes, including KErrNoMemory +*/ +TUid CPolicyDomainLoader::CreatePolicyFilePathL(TInt aPolicyFileIndex) + { + __ASSERT(aPolicyFileIndex < iFoundPolicyFiles->Count()); + const ::TEntry& entry = (*iFoundPolicyFiles)[aPolicyFileIndex]; + __LEAVE_IF_ERROR(iParser.Set(entry.iName, NULL, NULL)); + TPtrC fileName = iParser.Name(); + TUid domainUid = KNullUid; + TLex lex(fileName); + __LEAVE_IF_ERROR(lex.Val(*(TUint32*)&domainUid, EHex)); + if(domainUid == KNullUid) + { + __LEAVE(KErrCorrupt); + } + iPolicyFilePath.Copy(iPolicyDir); + iPolicyFilePath.Append(entry.iName); + return domainUid; + } + +/** +The method creates the policy domain object related to aPolicyFileIndex entry in +iFoundPolicyFiles list of binary policy file names. The created policy domain object +will be added to iPDCollection collection of policy domain objects. +@param aPolicyFileIndex Index of binary policy file name in iFoundPolicyFiles list. +@leave System-wide error codes, including KErrNoMemory +*/ +void CPolicyDomainLoader::DoCreatePolicyDomainL(TInt aPolicyFileIndex) + { + TUid domainUid = CreatePolicyFilePathL(aPolicyFileIndex); + RFileReadStream strm; + CleanupClosePushL(strm); + __LEAVE_IF_ERROR(strm.Open(iFs, iPolicyFilePath, EFileRead)); + TPDStreamLoader in(strm); + CPolicyDomain* policyDomain = CPolicyDomain::NewLC(domainUid, in); + __ASSERT(policyDomain); + __LEAVE_IF_ERROR(iPDCollection.Insert(domainUid.iUid, policyDomain)); + CleanupStack::Pop(policyDomain); + CleanupStack::PopAndDestroy(&strm); + } + +/** +The method creates the policy domain object related to aPolicyFileIndex entry in +iFoundPolicyFiles list of binary policy file names. The created policy domain object +will be added to iPDCollection collection of policy domain objects. +@param aPolicyFileIndex Index of binary policy file name in iFoundPolicyFiles list. +@leave KErrNoMemory is the only possible leaving error code. The rest of errors + will be suppressed. +*/ +void CPolicyDomainLoader::CreatePolicyDomainL(TInt aPolicyFileIndex) + { + TRAPD(err, DoCreatePolicyDomainL(aPolicyFileIndex)); +#ifdef _DEBUG + if(err != KErrNone) + { + _LIT(KText, "Failed to load policy file \"%S\"!\n"); + TBuf buf; + buf.Format(KText, &iPolicyFilePath); + RDebug::Print(buf); + } +#endif//_DEBUG + if(err == KErrNoMemory) + { + __LEAVE(err); + } + } + +/** +The method creates a policy domain object for each binary policy file found in the system. +The created objects will be added to iPDCollection collection of policy domain objects. +@leave KErrNoMemory is the only possible leaving error code. The rest of errors + will be suppressed. +*/ +void CPolicyDomainLoader::RunL() + { + __ASSERT(iFoundPolicyFiles); + for(TInt i=(iFoundPolicyFiles->Count()-1);i>-1;--i) + { + CreatePolicyDomainL(i); + } + } + +} //end of - namespace DBSC