lowlevellibsandfws/pluginfw/Framework/frame/EComEntryBase.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 14 Apr 2010 17:44:02 +0300
branchRCL_3
changeset 17 ef2ebc87518f
parent 0 e4d67989cc36
permissions -rw-r--r--
Revision: 201012 Kit: 201015

// Copyright (c) 2005-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 <e32uid.h>
#include <bautils.h>
#include <barsread2.h>
#include <baspi.h>
#include <ecom/ecomerrorcodes.h>

#include "Discoverer.h"
#include "EComEntryBase.h"
#include "EComUidCodes.h"
#include "DriveInfo.h"

const TInt KEcomResourceIndex=1;
const TInt KEComDllExtensionLength=4;

CPluginBase::CPluginBase():CBase()
{
}

CPluginBase::~CPluginBase()
{
	delete iDllName;
	delete iRscFile;
}

//
CSecurePlugin::CSecurePlugin(const TEntry& aEntry):CPluginBase()
{
	//only needs to copy the modified time here and construct the dll name
	iDllModifiedTime=aEntry.iModified;
}

CSecurePlugin* CSecurePlugin::NewL(RFs& aFs,const TEntry& aEntry,const TDriveName& aDriveName, TBool aIsRO)
{
	CSecurePlugin* self=new (ELeave) CSecurePlugin(aEntry);
	CleanupStack::PushL(self);
	self->ConstructL(aFs,aEntry,aDriveName, aIsRO);
	CleanupStack::Pop();
	return self;
}

void CSecurePlugin::ConstructL(RFs& aFs,const TEntry& aEntry,const TDriveName& aDriveName, TBool aIsRO)
{
	TInt resourceNameOnlyLength=aEntry.iName.Length()-KExtensionLength;
	TPtrC resourceNameOnly(aEntry.iName.Left(resourceNameOnlyLength));

	//constructing the dll file name	
	iDllName=HBufC::NewL(KEComDllExtensionLength+resourceNameOnlyLength);
	TPtr namePtr=iDllName->Des();
	namePtr.Append(resourceNameOnly);
	namePtr.Append(KDllExtension);	

	//Constructing the rsc file name
	TFileName rscFileName;
	rscFileName.Append(aDriveName);
	rscFileName.Append(KResourcePlugins);
	rscFileName.Append(resourceNameOnly);
	rscFileName.Append(KRscExtension);

	//Construct the CResourceFile
	BaflUtils::NearestLanguageFile(aFs,rscFileName);
	iRscFile=CResourceFile::NewL(aFs,rscFileName,0,0);

	//Now get the secure id from resource and store in iDllThirdUid
	//In addition, store the correct Interface Implementation Collection Uid in iDllSecondUid
	RResourceReader theReader;
	theReader.OpenLC(iRscFile,KEcomResourceIndex);
	const TUid uid={theReader.ReadInt32L()};
	if (uid == KUidEComResourceFormatV3)		
		{
		// If the resource format is version 3, then the dll type must
		// be of type "plugin3".
		iDllSecondUid = KUidInterfaceImplementationCollection3;
		}
	else
		{
		iDllSecondUid = KUidInterfaceImplementationCollection;	
		}
			
	if (uid==KUidEComResourceFormatV2 || uid==KUidEComResourceFormatV3)
		{
		iDllThirdUid.iUid=theReader.ReadInt32L();
		}
	else
		iDllThirdUid=uid;

	//Construct resource file extension
	if(!aIsRO)
		{
		// rscFileName is sane so we can use TParsePtrC instead of TParse
		TParsePtrC fileNameParser(rscFileName);
		TPtrC fileNameParserPtr = fileNameParser.Ext();
		iRscFileExt = fileNameParserPtr.AllocL();
		}
	
	//Perform cleanup now
	CleanupStack::PopAndDestroy(&theReader);
}

CSecurePlugin::~CSecurePlugin()
{
	delete iRscFileExt;
}

//	
CSpiPlugin::CSpiPlugin():CPluginBase()
{
}

CSpiPlugin* CSpiPlugin::NewL(RResourceArchive& aRscArchive)
{
	CSpiPlugin* self=new (ELeave) CSpiPlugin();
	CleanupStack::PushL(self);
	self->ConstructL(aRscArchive);
	CleanupStack::Pop();
	return self;
}

void CSpiPlugin::ConstructL(RResourceArchive& aRscArchive)
{
	HBufC* resourceName = NULL;
	iRscFile=aRscArchive.NextL(resourceName);
	CleanupStack::PushL(resourceName);
	
	//Now set the iDllName
	iDllName=HBufC::NewL(KEComDllExtensionLength+resourceName->Length());
	TPtr namePtr(iDllName->Des());	
	namePtr.Append(*resourceName);
	namePtr.Append(KDllExtension);
		
	//Now get the secure id from resource and store the uid in iDllThirdUid
	RResourceReader theReader;
	theReader.OpenLC(iRscFile,KEcomResourceIndex);
	const TUid uid={theReader.ReadInt32L()};
	if (uid == KUidEComResourceFormatV3)		
		{
		// If the resource format is version 3, then the dll type must
		// be of type "plugin3".
		iDllSecondUid = KUidInterfaceImplementationCollection3;
		}
	else
		{
		iDllSecondUid = KUidInterfaceImplementationCollection;		
		}
	
	TUid dllUid;	
	if (uid==KUidEComResourceFormatV2 || uid==KUidEComResourceFormatV3)
		{
		dllUid.iUid=theReader.ReadInt32L();
		}
	else
		dllUid=uid;
	iDllThirdUid=dllUid;
	CleanupStack::PopAndDestroy(&theReader);
		
	//Now perform the necessary cleanup
	CleanupStack::PopAndDestroy(resourceName);
}