installationservices/refswinstallationplugin/source/sifrefbinpkgextractor.cpp
branchRCL_3
changeset 66 8b7f4e561641
parent 65 7333d7932ef7
child 70 e8965914fac7
--- a/installationservices/refswinstallationplugin/source/sifrefbinpkgextractor.cpp	Tue Aug 31 15:21:33 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,426 +0,0 @@
-/*
-* Copyright (c) 2008-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: 
-* filemerger.cpp
-*
-*/
-
-
-#include <e32cons.h>
-#include <scs/cleanuputils.h>
-#include <apmstd.h> 
-#include <apgcli.h>
-#include "usiflog.h"
-#include "sifrefbinpkgextractor.h"
-
-_LIT8(KCompoundPackageHeader, "_SifReferenceInstallerPackageHeader_");
-_LIT8(KCompoundPackageFooter, "_SifReferenceInstallerPackageFooter_");
-_LIT(KPkgFileExt, ".sifrefpkg");
-_LIT(KRefBinPkgMimeType, "binary/sif-refpkg");
-_LIT(KEmbCompMidDir, "children\\");
-_LIT(KDirSeparator, "\\");
-
-const TInt KBufferLength = 0x3FFC; // 16kB
-const TInt KMaxNumFiles = 16;
-const TInt KMaxEmbCompSize = 0xFFFFFF; // 16MB
-
-using namespace Usif;
-
-namespace
-	{
-	TInt ReadInt32L(RFile& file)
-		{
-		TBuf8<4> buf;
-		User::LeaveIfError(file.Read(buf, sizeof(TInt)));
-		return buf[0] | buf[1]<<8 | buf[2]<<16 | buf[3]<<24;
-		}
-
-	HBufC* BuildPkgFileNameLC(const TDesC& aTempDir, const TDesC& aBinPkgPath)
-		{
-		TParsePtrC parser(aBinPkgPath);
-		TPtrC binPkgfileName = parser.Name();
-		HBufC* pkgfileName = HBufC::NewLC(aTempDir.Length() + binPkgfileName.Length() + KPkgFileExt.iTypeLength);
-		TPtr pkgfileNamePtr =  pkgfileName->Des();
-		pkgfileNamePtr += aTempDir;
-		pkgfileNamePtr += binPkgfileName;
-		pkgfileNamePtr += KPkgFileExt;
-		
-		return pkgfileName;
-		}
-
-	HBufC* BuildPkgFileNameLC(const TDesC& aTempDir, const RFile& aFile)
-		{
-		HBufC* name = HBufC::NewLC(KMaxFileName);
-		TPtr namePtr(name->Des());
-		User::LeaveIfError(aFile.Name(namePtr));
-		
-		HBufC* pkgName = BuildPkgFileNameLC(aTempDir, *name);
-		
-		CleanupStack::Pop(pkgName);
-		CleanupStack::PopAndDestroy(name);
-		CleanupStack::PushL(pkgName);
-		
-		return pkgName;
-		}
-
-	void ExtractBinPkgFileL(RStsSession& aSts, RFile& aInFile, const TDesC& aOutPath, RPointerArray<HBufC>& aOutFiles)
-		{
-		// Check file size
-		TInt size(0);
-		User::LeaveIfError(aInFile.Size(size));
-		if (size < KCompoundPackageHeader.iTypeLength+KCompoundPackageFooter.iTypeLength+sizeof(TInt))
-			{
-			User::Leave(KErrCorrupt);
-			}
-		
-		// Create a buffer
-		HBufC8* buffer = HBufC8::NewLC(KBufferLength);
-		TPtr8 bufPtr = buffer->Des();
-		
-		// Read header
-		User::LeaveIfError(aInFile.Read(bufPtr, KCompoundPackageHeader.iTypeLength));
-		if (bufPtr != KCompoundPackageHeader)
-			{
-			User::Leave(KErrCorrupt);
-			}
-		bufPtr.Zero();
-		
-		// Read the size of a pkg content
-		const TInt pkgSize = ReadInt32L(aInFile);
-		if (pkgSize > KBufferLength)
-			{
-			User::Leave(KErrCorrupt);
-			}
-
-		// Build the name of the pkg file
-		HBufC* inFileNameWithExt = HBufC::NewLC(KMaxFileName);
-		TPtr inFileNameWithExtPtr = inFileNameWithExt->Des();
-		User::LeaveIfError(aInFile.Name(inFileNameWithExtPtr));
-		HBufC* pkgFileName = BuildPkgFileNameLC(aOutPath, *inFileNameWithExt);
-
-		// Create the pkg file
-		RFile pkgFile;
-		aSts.CreateTemporaryL(*pkgFileName, pkgFile, EFileWrite);
-		CleanupClosePushL(pkgFile);
-		
-		// Copy the content of the pkg file
-		User::LeaveIfError(aInFile.Read(bufPtr, pkgSize));
-		User::LeaveIfError(pkgFile.Write(bufPtr));
-		CleanupStack::PopAndDestroy(&pkgFile);
-		bufPtr.Zero();
-		
-		// Read the number of embedded components
-		const TInt numEmbComps = ReadInt32L(aInFile);
-		if (numEmbComps > KMaxNumFiles)
-			{
-			User::Leave(KErrCorrupt);
-			}
-		
-		// Create a directory for embedded components
-		HBufC* embCompPath = NULL;
-		if (numEmbComps > 0)
-			{
-			embCompPath = HBufC::NewLC(aOutPath.Length() + KEmbCompMidDir.iTypeLength);
-			embCompPath->Des().Copy(aOutPath);
-			embCompPath->Des().Append(KEmbCompMidDir);
-			}
-		
-		// Iterate over the components and extract them
-		for (TInt i=0; i<numEmbComps; ++i)
-			{
-			// Read the length of the name of an embedded component
-			const TInt strLen = ReadInt32L(aInFile);
-			if (strLen > KMaxPath)
-				{
-				User::Leave(KErrCorrupt);
-				}
-			
-			// Read the name of an embedded component and build its target path
-			User::LeaveIfError(aInFile.Read(bufPtr, strLen));
-			HBufC* embFileName = ConvertBufferTo16bitL(bufPtr);
-			CleanupStack::PushL(embFileName);
-			bufPtr.Zero();
-			HBufC* embFileTargetPath = HBufC::NewLC(embCompPath->Length() + 2*embFileName->Length() + KDirSeparator.iTypeLength);
-			TPtr embFileTargetPathPtr(embFileTargetPath->Des());
-			embFileTargetPathPtr.Copy(*embCompPath);
-			embFileTargetPathPtr += *embFileName;
-			embFileTargetPathPtr += KDirSeparator;
-			embFileTargetPathPtr += *embFileName;
-			
-			// Read the size of an embedded component
-			const TInt fileSize = ReadInt32L(aInFile);
-			if (fileSize > KMaxEmbCompSize)
-				{
-				User::Leave(KErrCorrupt);
-				}
-			
-			// Create an output file
-			RFile outFile;
-			aSts.CreateTemporaryL(*embFileTargetPath, outFile, EFileWrite);
-			CleanupClosePushL(outFile);
-			
-			// Copy the content of the output file
-			const TInt numChunks = fileSize / KBufferLength;
-			for (TInt c=0; c<numChunks; ++c)
-				{
-				User::LeaveIfError(aInFile.Read(bufPtr, KBufferLength));
-				User::LeaveIfError(outFile.Write(bufPtr));
-				bufPtr.Zero();
-				}
-			const TInt remainder = fileSize % KBufferLength;
-			User::LeaveIfError(aInFile.Read(bufPtr, remainder));
-			User::LeaveIfError(outFile.Write(bufPtr));
-			bufPtr.Zero();
-			
-			CleanupStack::PopAndDestroy(&outFile);
-			aOutFiles.AppendL(embFileTargetPath);
-			CleanupStack::Pop(embFileTargetPath);
-			CleanupStack::PopAndDestroy(embFileName);
-			}
-		
-		if (embCompPath != NULL)
-			{
-			CleanupStack::PopAndDestroy(embCompPath);
-			}
-		
-		// Read footer
-		User::LeaveIfError(aInFile.Read(bufPtr, KCompoundPackageFooter.iTypeLength));
-		if (bufPtr != KCompoundPackageFooter)
-			{
-			User::Leave(KErrCorrupt);
-			}
-		bufPtr.Zero();
-		
-		CleanupStack::PopAndDestroy(3, buffer); // inFileNameWithExt, pkgFileName
-		}
-		
-	void ExtractBinPkgFileL(RStsSession& aSts, const TDesC& aInFileName, const TDesC& aOutPath, RPointerArray<HBufC>& aOutFiles)
-		{
-		RFs fs;
-		RFile file;
-		User::LeaveIfError(fs.Connect());
-		CleanupClosePushL(fs);
-		TInt err = file.Open(fs, aInFileName, EFileShareReadersOnly);
-		if (err != KErrNone)
-			{
-			DEBUG_PRINTF3(_L8("Failed to open file: %S with error: %d"), &aInFileName, err);
-			User::Leave(err);
-			}
-		CleanupClosePushL(file);
-		
-		ExtractBinPkgFileL(aSts, file, aOutPath, aOutFiles);
-		
-		CleanupStack::PopAndDestroy(2, &fs);
-		}
-
-	TBool IsForeignL(RFile& aFileHandle)
-		{
-		// Get the MIME type of the component to be installed from AppArc
-		TDataType dataType;
-		RApaLsSession apa;
-		User::LeaveIfError(apa.Connect());
-		CleanupClosePushL(apa);
-		TUid appUid = TUid::Null();
-		User::LeaveIfError(apa.AppForDocument(aFileHandle, appUid, dataType));
-		// A possible problem with recognizers is returning a successful result, but forgetting to set the MIME type
-		if (dataType.Des8().Ptr() == NULL) 
-			{
-			User::Leave(KErrCompletion);
-			}
-		CleanupStack::PopAndDestroy(&apa);
-		
-		return dataType.Des() != KRefBinPkgMimeType;
-		}
-
-	TBool IsForeignL(const TDesC& aFileName)
-		{
-		RFs fs;
-		RFile file;
-		User::LeaveIfError(fs.Connect());
-		CleanupClosePushL(fs);
-		User::LeaveIfError(fs.ShareProtected());
-		TInt err = file.Open(fs, aFileName, EFileShareReadersOnly);
-		if (err != KErrNone)
-			{
-			DEBUG_PRINTF3(_L8("Failed to open file: %S with error: %d"), &aFileName, err);
-			User::Leave(err);
-			}
-		CleanupClosePushL(file);
-		
-		const TBool result = IsForeignL(file);
-
-		CleanupStack::PopAndDestroy(2, &fs); // file
-
-		return result;
-		}
-	}
-
-namespace Usif
-	{
-	namespace SifRefBinPkgExtractor
-		{
-		CAuxNode* CAuxNode::NewLC(const TDesC& aFileName, TBool aForeign, CAuxNode& aParent)
-			{
-			CAuxNode* self = new (ELeave) CAuxNode;
-			CleanupStack::PushL(self);
-			
-			self->iFileName = aFileName.AllocL();
-			self->iForeign = aForeign;
-			self->iParent = &aParent;
-			
-			return self;
-			}
-		CAuxNode* CAuxNode::NewLC(const RFile& aFile, TBool aForeign, CAuxNode& aParent)
-		    {
-	        CAuxNode* self = new (ELeave) CAuxNode;
-	        CleanupStack::PushL(self);
-	                    
-	        HBufC* name = HBufC::NewLC(KMaxFileName);
-	        TPtr namePtr(name->Des());
-	        User::LeaveIfError(aFile.Name(namePtr));
-	                    
-	        self->iFileName = name->AllocL();
-	        self->iForeign = aForeign;
-	        self->iParent = &aParent;
-	        
-	        CleanupStack::PopAndDestroy(name); 
-	        return self;
-	        }
-
-		CAuxNode::CAuxNode()
-			{
-			}
-		
-		CAuxNode::~CAuxNode()
-			{
-			delete iFileName;
-			delete iNode;
-			delete iCompInfo;
-			}
-
-		void CAuxNode::SetNodeL(CComponentInfo::CNode* aNode)
-			{
-			if (iNode != NULL)
-				{
-				User::Leave(KErrAlreadyExists);
-				}
-			iNode = aNode;
-			}
-
-		void CAuxNode::SetCompInfoL(CComponentInfo* aCompInfo)
-			{
-			if (iCompInfo != NULL)
-				{
-				User::Leave(KErrAlreadyExists);
-				}
-			iCompInfo = aCompInfo;
-			}
-		
-		void CAuxNode::RegisterChildToParentL()
-			{
-			ASSERT (iCompInfo != NULL || iNode != NULL);
-			
-			if (iCompInfo != NULL)
-				{
-				iCompInfo->SetRootNodeAsChildL(*iParent->iNode);
-				delete iCompInfo;
-				iCompInfo = NULL;
-				}
-			else
-				{
-				iParent->iNode->AddChildL(iNode);
-				iNode = NULL;
-				}
-			}
-		
-		void CAuxNode::SetAsRootNodeL(CComponentInfo& aCompInfo)
-			{
-			if (iNode == NULL)
-				{
-				User::Leave(KErrNotFound);
-				}
-			aCompInfo.SetRootNodeL(iNode);
-			iNode = NULL;
-			}
-
-//-------------------------------------------------------------------------------------------------------
-
-		void BuildPkgTreeImplL(RStsSession& aSts, const TDesC* aInFileName, RFile* aInFile, const TDesC& aTempDir, RPointerArray<CAuxNode>& aFlatTree, CAuxNode* aParent)
-			{
-			__ASSERT_ALWAYS(aInFileName != NULL || aInFile != NULL, User::Leave(KErrArgument));
-			
-			RCPointerArray<HBufC> embFiles;
-			CleanupClosePushL(embFiles);
-			CAuxNode* node = NULL;
-			HBufC* pkgFileName = NULL;
-			const TBool foreign = aInFile ? IsForeignL(*aInFile) : IsForeignL(*aInFileName);
-			if (!foreign)
-				{
-				if (aInFile != NULL)
-					{
-					ExtractBinPkgFileL(aSts, *aInFile, aTempDir, embFiles);
-					}
-				else
-					{
-					ExtractBinPkgFileL(aSts, *aInFileName, aTempDir, embFiles);
-					}
-				
-				pkgFileName = aInFile ? BuildPkgFileNameLC(aTempDir, *aInFile) : BuildPkgFileNameLC(aTempDir, *aInFileName);
-				node = CAuxNode::NewLC(*pkgFileName, EFalse, *aParent);
-				aFlatTree.AppendL(node);
-				CleanupStack::Pop(node);
-				for (TInt i=0; i<embFiles.Count(); ++i)
-					{
-					const TDesC& fileName = *embFiles[i];
-					TParsePtrC parser(fileName);
-					BuildPkgTreeImplL(aSts, &fileName, NULL, parser.DriveAndPath(), aFlatTree, node);
-					}
-				}
-			else
-				{
-				if (aParent == NULL)
-					{
-					User::Leave(KErrCorrupt);
-					}
-				if (aInFileName != NULL)
-				    {
-				    node = CAuxNode::NewLC(*aInFileName, ETrue, *aParent);
-				    }
-				else
-				    {
-				    node = CAuxNode::NewLC(*aInFile, ETrue, *aParent);
-				    }			
-				aFlatTree.AppendL(node);
-				CleanupStack::Pop(node);
-				}
-			
-				if (pkgFileName != NULL)
-					{
-					CleanupStack::PopAndDestroy(pkgFileName);
-					}
-			
-			CleanupStack::PopAndDestroy(&embFiles);
-			}
-		
-		void BuildPkgTreeL(RStsSession& aSts, RFile& aInFile, const TDesC& aTempDir, RPointerArray<CAuxNode>& aFlatTree, CAuxNode* aParent)
-			{
-			BuildPkgTreeImplL(aSts, NULL, &aInFile, aTempDir, aFlatTree, aParent);
-			}
-		
-		void BuildPkgTreeL(RStsSession& aSts, const TDesC& aInFileName, const TDesC& aTempDir, RPointerArray<CAuxNode>& aFlatTree, CAuxNode* aParent)
-			{
-			BuildPkgTreeImplL(aSts, &aInFileName, NULL, aTempDir, aFlatTree, aParent);
-			}
-		} // namespace SifRefBinPkgExtractor
-	} //namespace Usif