sysstatemgmt/systemstatemgr/ssm/src/ssmswppolicyresolver.cpp
changeset 0 4e1aa6a622a0
--- /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 <f32file.h>
+#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<KMaxFileName + 2> 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;
+	}
+
+