// 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 <ssm/ssmutility.h>#include <ssm/ssmsuscli.h>#include "suspluginloader.h"#include "suspluginframe.h"#include "ssmdebug.h"#include "suspanic.h"_LIT(KRomDriveLetter, "Z:");/** Loads the specified DLL into an RLibrary. DLL is typechecked and optionally its uid3 can be verified. If the RLibrariy::iHandle was opened pushed onto and left on the CleanupStack. */void SusPluginLoader::LoadDllFileLC(RLibrary& aLibrary, const TSsmSupInfo& aSupInfo) { //Enforce that plugins can only be loaded from ROM TBuf<KMaxFileName + 2> filename = aSupInfo.FileName(); //KMaxFileName + KRomDriveLetter().Length() if( filename.Left(2).CompareF(KRomDriveLetter) ) { filename.Insert(0, KRomDriveLetter); } const TUid expectedUid3 = aSupInfo.Identity(); DoLoadDllFileLC(aLibrary, filename, expectedUid3); }/** */CSusPluginFrame* SusPluginLoader::CreatePluginLC(RLibrary& aLibrary, TInt aNewLOrdinal) { CSusPluginFrame* plugin = SusPluginLoader::DoCreatePluginL(aLibrary, aNewLOrdinal); CleanupStack::PushL(plugin);#ifdef _DEBUG TFileName name = aLibrary.FileName(); #endif DEBUGPRINT2(_L("Utility Plugin [%S] loaded."), &name); plugin->InitializeL(); DEBUGPRINT2(_L("Utility Plugin [%S] initialized."), &name); plugin->StartL(); DEBUGPRINT2(_L("Utility Plugin [%S] started."), &name); return plugin; }/** Load the DLL file from the file system. @leave KErrNotSupported If UID2 of the DLL is not KSsmUtilityPluginDllTypeUid @leave KErrNotFound If the requested policy DLL file is missing. @leave KErrBadName If @c aSupInfo contains an Identity different from UID3 of the DLL. @leave KErrCorrupt Or any other system wide error code that the fileserver can rise. */void SusPluginLoader::DoLoadDllFileLC(RLibrary& aLibrary, const TDesC& aFileName, TUid aExpectedUid3) { const TInt fileErr = aLibrary.Load(aFileName); CleanupClosePushL(aLibrary); //Leave if we couldn't open aLibrary if (fileErr != KErrNone) { DEBUGPRINT3(_L("Failed to load utility plugin DLL named %S, file error: %d"), &aFileName, fileErr); User::Leave(fileErr); } //Check that the DLL is the SUP type if (aLibrary.Type()[1] != KSsmUtilityPluginDllTypeUid) { DEBUGPRINT4(_L("Wrong type (uid2) in the utility plugin DLL %S. Expected %x found %x"), &aFileName, KSsmUtilityPluginDllTypeUid, aLibrary.Type()[1]);; User::Leave(KErrNotSupported); } //If we were given a identity, check that the loaded file conforms if ( (aExpectedUid3 != KNullUid) && (aExpectedUid3 != aLibrary.Type()[2]) ) { DEBUGPRINT4(_L("Wrong identity (uid3) in the utility plugin DLL %S. Expected %x found %x"), &aFileName, aExpectedUid3, aLibrary.Type()[2]); User::Leave(KErrBadName); } } //lint !e1746 suppress parameter 'aExpectedUid3' could be made const reference/** */CSusPluginFrame* SusPluginLoader::DoCreatePluginL(const RLibrary& aLibrary, TInt aNewLOrdinal) { __ASSERT_DEBUG(KNullHandle != aLibrary.Handle(), User::Panic(KPanicSsmSus, EPluginLoaderError1)); CSusPluginFrame* frame = NULL; TRAPD(err, frame = CSusPluginFrame::NewL(aLibrary.Lookup(aNewLOrdinal), aNewLOrdinal));#ifdef _DEBUG if(KErrNone != err) { TFileName name = aLibrary.FileName(); DEBUGPRINT4(_L("Specified ordinal function (%d) in DLL %S didn't create a new instance, err=%d."), aNewLOrdinal, &name, err); }#endif SSMLOGLEAVEIFERROR(err); return frame; }