diff -r 000000000000 -r a41df078684a kernel/eka/euser/epoc/up_lib.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/euser/epoc/up_lib.cpp Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,285 @@ +// Copyright (c) 1996-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "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: +// e32\euser\epoc\up_lib.cpp +// +// + +#include "up_std.h" +#include +#include "u32std.h" +#include +#include + +//#define __DEBUG_IMAGE__ 1 + +#if defined(__DEBUG_IMAGE__) && defined (__EPOC32__) +#include "e32svr.h" + +extern RDebug debug; +#define __IF_DEBUG(t) {debug.t;} +#else +#define __IF_DEBUG(t) +#endif + +#if defined(_UNICODE) +#define __SIZE(len) ((len)<<1) +#else +#define __SIZE(len) (len) +#endif + + + + +/** +@internalComponent +*/ +EXPORT_C TInt RLibrary::LoadRomLibrary(const TDesC& aFileName, const TDesC& aPath) + { + return Load(aFileName,aPath); + } + + + + +/** +Loads the named DLL which matches the specified UID type. + +If successful, the function increments the usage count by one. +No additional search paths can be specified with this function. + +@param aFileName A descriptor containing the name of the DLL to be loaded. + The length of the file name must not be greater than KMaxFileName. +@param aType A UID type (a triplet of UIDs) which the DLL must match. + Individual UIDs can contain the KNullUid wild card. + +@return KErrNone, if successful; + KErrBadName, if the length of aFileName is greater than KMaxFileName; + otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt RLibrary::Load(const TDesC& aFileName, const TUidType& aType) + { + + return Load(aFileName, KNullDesC, aType); + } + + + + +/** +Loads the named DLL. + +If successful, the function increments the usage count by one. + +@param aFileName A descriptor containing the name of the DLL to be loaded. + The length of the file name must not be greater than KMaxFileName. +@param aPath A descriptor containing a list of path names, each separated by + a semicolon. When specified, these paths are searched for the DLL + before the standard search locations. By default, + no pathnames are specified. + +@return KErrNone, if successful; + KErrBadName, if the length of aFileName is greater than KMaxFileName; + otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt RLibrary::Load(const TDesC& aFileName, const TDesC& aPath) + { + + return Load(aFileName, aPath, TUidType()); + } + + + + +/** +Loads the named DLL that matches the specified UID type. + +If successful, the function increments the usage count by one. + +@param aFileName A descriptor containing the name of the DLL to be loaded. + The length of the file name must not be greater than KMaxFileName. +@param aPath A descriptor containing a list of path names, each separated by + a semicolon. When specified, these paths are searched for the DLL + before the standard search locations. +@param aType A UID type (a triplet of UIDs) that the DLL must match. Individual UIDs + can contain the KNullUid wild card. + +@return KErrNone, if successful; + KErrBadName, if the length of aFileName is greater than KMaxFileName; + otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt RLibrary::Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType) + { + return Load(aFileName, aPath, aType, KModuleVersionWild); + } + + + + +/** +Loads the named DLL that matches the specified UID type and version. + +If successful, the function increments the usage count by one. + +@param aFileName A descriptor containing the name of the DLL to be loaded. + The length of the file name must not be greater + than KMaxFileName. +@param aPath A descriptor containing a list of path names, each + separated by a semicolon. When specified, these paths + are searched for the DLL before the standard search locations. +@param aType A UID type (a triplet of UIDs) that the DLL must match. + Individual UIDs can contain the KNullUid wild card. +@param aModuleVersion A version specification that the DLL must match. Major + version must match exactly and minor version must be >= the + specified minor version. + +@return KErrNone, if successful; + KErrBadName, if the length of aFileName is greater than KMaxFileName; + otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt RLibrary::Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion) + { + + __IF_DEBUG(Print(_L("RLibrary::Load ##"))); + + RLoader loader; + TInt r=loader.Connect(); + if (r!=KErrNone) + return r; + + r=loader.LoadLibrary(iHandle, aFileName, aPath, aType, aModuleVersion); + loader.Close(); + if (r==KErrNone) + r=Init(); + return r; + } + + + + +/** +Gets information about the specified DLL. + +@param aFileName A descriptor containing the name of the DLL to be checked. + The length of the file name must not be greater than KMaxFileName. +@param aInfoBuf On return, contains information about the DLL (RLibrary::TInfo) + +@return KErrNone, if successful; + KErrBadName, if the length of aFileName is greater than KMaxFileName; + otherwise one of the other system wide error codes. +*/ +EXPORT_C TInt RLibrary::GetInfo(const TDesC& aFileName, TDes8& aInfoBuf) + { + __IF_DEBUG(Print(_L("RLibrary::GetInfo ##"))); + RLoader loader; + TInt r=loader.Connect(); + if (r!=KErrNone) + return r; + r=loader.GetInfo(aFileName, aInfoBuf); + loader.Close(); + return r; + } + + + + +/** +Gets information about an executable binary, (DLL or EXE), based on header data +from that binaries image. + +@param aHeader A descriptor containing the data from the start of the binaries image. + This data should be of size RLibrary::KRequiredImageHeaderSize or the + total length of the binary image, whichever is smallest. +@param aInfoBuf A descriptor which will be filled with the extracted information. + This information will be in the form of a RLibrary::TInfo structure. + This should usually be an object of type RLibrary::TInfoBuf. + +@return KErrNone, if successful; + KErrUnderflow, if the size of aHeader is too small; + KErrCorrupt, if the data in aHeader isn't a valid executable image header; + Otherwise one of the other system wide error codes. + +@internalTechnology +*/ +EXPORT_C TInt RLibrary::GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf) + { + RLoader loader; + TInt r=loader.Connect(); + if (r!=KErrNone) + return r; + r=loader.GetInfoFromHeader(aHeader, aInfoBuf); + loader.Close(); + return r; + } + + + + +TInt RLibrary::InitL() +// +// Initialise any static data following a DLL load +// + { + TLinAddr ep[KMaxLibraryEntryPoints]; + TInt numEps=KMaxLibraryEntryPoints; + E32Loader::LibraryAttach(iHandle, numEps, ep); + if (numEps==0) + return KErrNone; + TInt i; + for (i=0; i