diff -r 000000000000 -r 4e1aa6a622a0 sysstatemgmt/systemstatemgr/ssm/src/ssmswppolicyresolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysstatemgmt/systemstatemgr/ssm/src/ssmswppolicyresolver.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,207 @@ +// Copyright (c) 2007-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: +// + +#include +#include "ssmswppolicyframe.h" +#include "ssmswppolicyresolver.h" +#include "ssmdebug.h" +#include "ssmserverpanic.h" +#include "ssmswppolicymap.h" + +_LIT(KRomDriveLetter, "Z:"); +_LIT(KDllFilenamePostfix, ".dll"); + +/** +Empty constructor +*/ +CSsmSwpPolicyResolver::CSsmSwpPolicyResolver() + { + } + +/** +Destructor cleans up internal resources +*/ +CSsmSwpPolicyResolver::~CSsmSwpPolicyResolver() + { + delete iSwpPolicyMap; + } + +/** +Static Factory +*/ +CSsmSwpPolicyResolver* CSsmSwpPolicyResolver::NewL() + { + CSsmSwpPolicyResolver* self = new (ELeave) CSsmSwpPolicyResolver(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/** +Construct policy map object +*/ +void CSsmSwpPolicyResolver::ConstructL() + { + iSwpPolicyMap = CSsmSwpPolicyMap::NewL(); + } + + +/** +Register an Swp and its policy file with the map + +@param aSwp the swp value to register +@param aFile The file name to associate with the swp value +@leave KErrAlreadyExists if the swp value already exists +@leave KErrArgument if aFilename is larger than KMaxFileName +*/ +void CSsmSwpPolicyResolver::RegisterSwpMappingL(TUint aSwpKey, const TDesC& aFilename) + { + SSMLOGLEAVEIFNULL(iSwpPolicyMap); + DEBUGPRINT3(_L("CSsmSwpPolicyResolver::RegisterSwpMappingL swp %d file %S"), aSwpKey, &aFilename); + if(aFilename.Length() > KMaxFileName) + { + DEBUGPRINT1(_L("Filename too long")); + SSMLOGLEAVE(KErrArgument); //lint !e527 Suppress Unreachable. Lint is just confused by macro, warning goes away when code in macro gets expanded + } + iSwpPolicyMap->AddL(aSwpKey, aFilename); + } //lint !e1746 Suppress parameter 'aSwpKey' could be made const reference + +/** + * Used only for testing purposes + * DeRegister an Swp and its policy file with the map + + * @param aSwpKey the swp value to deregister + * @param aFilename The file name to associate with the swp value + * @leave KErrNotFound if the swp value doesn't exists + * @leave KErrArgument if aFilename is longer than KMaxFileName +*/ +#ifdef _DEBUG +void CSsmSwpPolicyResolver::DeRegisterSwpMappingL(TUint aSwpKey, const TDesC& aFilename) + { + SSMLOGLEAVEIFNULL(iSwpPolicyMap); + DEBUGPRINT3(_L("CSsmSwpPolicyResolver::DeRegisterSwpMappingL swp %d file %S"), aSwpKey, &aFilename); + if(aFilename.Length() > KMaxFileName) + { + DEBUGPRINT1(_L("Filename too long")); + SSMLOGLEAVE(KErrArgument); //lint !e527 Suppress Unreachable. Lint is just confused by macro, warning goes away when code in macro gets expanded + } + iSwpPolicyMap->DeleteSwpMapL(aSwpKey); + } +#endif + +/** +Construct a policy frame object based on the SWP value supplied + +@param aSwp The swp to resolve +@return A policy frame containing a valid policy for the swp value +@leave KErrNotFound If the swp is not registered +@leave Any error returned from LoadLibraryLC +*/ +CSsmSwpPolicyFrame* CSsmSwpPolicyResolver::GetSwpPolicyL(const TSsmSwp& aSwp) + { + TBuf libraryFilename; //KMaxFileName + KRomDriveLetter().Length() + GetFileNameForSwpL(aSwp, libraryFilename); + + RLibrary library; + LoadLibraryLC(library, libraryFilename); + + // make a process-owned copy of the handle as it has to be used by SsmSwpPolicyServer, + // which runs in a separate thread + User::LeaveIfError(library.Duplicate(RThread(), EOwnerProcess)); + + CSsmSwpPolicyFrame* policy = CreatePolicyLC(library); + CleanupStack::Pop(policy); + policy->SetLibrary(library); // takes ownership of open library handle + CleanupStack::Pop(&library); + policy->SetSwpKey(aSwp.Key()); + + DEBUGPRINT2(_L("Created Swp Policy DLL %S"), &libraryFilename); + + return policy; + } + +/** +Construct a descriptor containing the composite file name from the DLL to load + +@param aSwp The swp to create the file name for +@param aLibraryFilename reference to object in which file name is returned +@leave KErrNotFound If the swp is not registered +*/ +void CSsmSwpPolicyResolver::GetFileNameForSwpL(const TSsmSwp& aSwp, TDes& aLibraryFilename) const + { + aLibraryFilename.Zero(); + aLibraryFilename.Append(KRomDriveLetter); + aLibraryFilename.Append(iSwpPolicyMap->FilenameL(aSwp.Key())); + const TInt postfixLength = KDllFilenamePostfix().Length(); + if(KDllFilenamePostfix().CompareF(aLibraryFilename.Right(postfixLength))) + { + aLibraryFilename.Append(KDllFilenamePostfix); + } + } + +/** +Attempt to load the library with the supplied name + +@param aLibrary Library object used to load the DLL +@param aLibraryFilename file name of library to load +@leave KErrNotSupported If UID2 of the DLL is not KStatePolicyDllTypeUidValue +@leave KErrNotFound If the requested policy DLL file is missing. +@leave KErrCorrupt Or any other system wide error code that the fileserver can raise. +*/ +void CSsmSwpPolicyResolver::LoadLibraryLC(RLibrary& aLibrary, const TDesC& aLibraryFilename) const + { + CleanupClosePushL(aLibrary); + const TInt fileErr = aLibrary.Load(aLibraryFilename); + if (fileErr != KErrNone) + { + DEBUGPRINT3(_L("Failed to load library file %S, file error-code: %d"), &aLibraryFilename, fileErr); + User::Leave(fileErr); + } + if (aLibrary.Type()[1] != KSsmSwpPolicyDllTypeUid) + { + DEBUGPRINT4(_L("Wrong type (uid2) in swp policy library dll %S. Expected %x found %x"), + &aLibraryFilename, KSsmSwpPolicyDllTypeUid, aLibrary.Type()[1]); + User::Leave(KErrNotSupported); + } + } + +/** +Create a policy frame that encapsulates the policy dll represented by the library +Retrieves the DLLs factory method which is passed to the frame in oder to create the policy object + +@param aLibrary The library object that references the DLL +@return A policy frame containing the loaded policy +@leave Any system error +*/ +CSsmSwpPolicyFrame* CSsmSwpPolicyResolver::CreatePolicyLC(const RLibrary& aLibrary) const + { + __ASSERT_DEBUG( KNullHandle != aLibrary.Handle(), PanicNow(KPanicSysStateMgr, ESwpPolicyResolverLibraryNotLoaded)); + + CSsmSwpPolicyFrame* frame = NULL; + TRAPD(err, frame = CSsmSwpPolicyFrame::NewL(aLibrary.Lookup(1))); + CleanupStack::PushL(frame); +#ifdef _DEBUG + if(KErrNone != err) + { + TFileName name = aLibrary.FileName(); + DEBUGPRINT3(_L("Error %d when calling first function in State Policy DLL %S."), err, &name); + } +#endif + SSMLOGLEAVEIFERROR(err); + return frame; + } + +