installationservices/swi/source/swis/server/siscontentprovider.cpp
changeset 0 ba25891c3a9e
child 21 5bddc28da627
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/installationservices/swi/source/swis/server/siscontentprovider.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,226 @@
+/*
+* Copyright (c) 2004-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: 
+* Definition of the CContentProvider
+* Life-Cycle methods
+*
+*/
+
+
+/**
+ @file siscontentprovider.cpp
+*/
+
+#include "siscontentprovider.h"
+#include "siscontroller.h" 
+#include "sissupportedlanguages.h"
+#include "sislanguage.h"
+#include "sisstring.h"
+#include "sisinfo.h"
+#include "sissupportedoptions.h"
+#include "sissupportedoption.h"
+#include "sisversion.h"
+#include "sisinstallblock.h"
+#include "swi/sisinstallerrors.h"
+#include "siselseif.h"
+
+using namespace Swi;
+using namespace Swi::Sis;
+
+/*static*/ CContentProvider* CContentProvider::NewLC(const CController& aController)
+	{
+	CContentProvider* self = new(ELeave) CContentProvider(aController);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+/*static*/ CContentProvider* CContentProvider::NewL(const CController& aController)
+	{
+	CContentProvider* self = CContentProvider::NewLC(aController);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CContentProvider::CContentProvider(const CController& aController) : iController(aController)
+	{
+	}
+
+void CContentProvider::ConstructL()
+	{
+	const CSupportedLanguages& supportedLanguages = iController.SupportedLanguages();
+	iAvailableLanguages.Reset();
+	
+    // builds a list of TLanguage of available languages from SISX file
+	for(TInt language = 0; language < supportedLanguages.Count(); language++)
+		{
+		User::LeaveIfError(iAvailableLanguages.Append(supportedLanguages[language]));
+		}
+	}
+
+CContentProvider::~CContentProvider()
+	{
+	iAvailableLanguages.Close();
+	}
+
+// Business methods
+
+TAppInfo CContentProvider::DefaultLanguageAppInfoL() const
+	{
+	return DefaultLanguageAppInfoL(iController.Info());
+	}
+
+TAppInfo CContentProvider::LocalizedAppInfoL(TInt aLanguageIndex) const
+	{
+	return LocalizedAppInfoL(iController.Info(), aLanguageIndex);
+	}
+
+TAppInfo CContentProvider::DefaultLanguageAppInfoL(const CInfo& aInfo) const
+	{
+	TLanguage current = User::Language();    // Language of the current locale
+	
+	// Check whether the current locale is in the list of available languages
+	TInt idx = iAvailableLanguages.Find(current);
+
+	if (idx == KErrNotFound) 
+		{
+		idx = 0;
+		}
+	return LocalizedAppInfoL(aInfo, idx);
+	}
+
+TAppInfo CContentProvider::LocalizedAppInfoL(const CInfo& aInfo, TInt aLanguageIndex) const
+	{
+	const RPointerArray<CString>& names = aInfo.Names();
+
+	const RPointerArray<CString>& vendors = aInfo.VendorNames();
+
+	// These two things can leave if the language specified is not present
+	if (names.Count() <= aLanguageIndex)
+		{
+		User::Leave(KErrSISInfoSISNamesMissing);
+		}
+	CString* localizedName = names[aLanguageIndex];
+	
+	if (vendors.Count() <= aLanguageIndex)
+		{
+		User::Leave(KErrSISInfoSISVendorNamesMissing);		
+		}
+	CString* localizedVendor = vendors[aLanguageIndex];
+
+	const CVersion& version = aInfo.Version();
+	TVersion ver(version.Major(), version.Minor(), version.Build());
+
+	TAppInfo appaInfo = TAppInfo(localizedName->Data(), localizedVendor->Data(), ver);
+
+	return appaInfo;
+	}
+
+TInt64 CContentProvider::TotalSizeL(const CInstallBlock&  aInstallBlock,
+									CExpressionEvaluator* aCreateExpressionEvaluator,
+									TBool aEmbedded) const
+	{	
+	// Calculate the total size of the SIS file descriptions in this SISInstallBlock.
+	TInt64 sizeOfInstallationBelowController = SizeOfFileDescriptionsInInstallBlock(aInstallBlock);
+	
+	// Process the expressions.
+	for (TInt i=0 ; i < aInstallBlock.IfStatements().Count(); i++)
+		{
+		Sis::CIf* ifBlock=aInstallBlock.IfStatements()[i];
+		
+		if (!ifBlock)
+			{
+			User::Leave(KErrCorrupt);
+			}
+		
+		// Main expression.
+		if (aCreateExpressionEvaluator->EvaluateL(ifBlock->Expression()).BoolValueL())
+			{
+			sizeOfInstallationBelowController += TotalSizeL(ifBlock->InstallBlock(),
+															aCreateExpressionEvaluator,
+															aEmbedded);
+			}
+		else
+			{
+			// There are Else If blocks.
+			const RPointerArray<CElseIf>& elseIfs=ifBlock->ElseIfs();
+		
+			for (TInt j = 0 ; j < elseIfs.Count(); j++)
+				{				
+				if (!elseIfs[j])
+				 	{
+					User::Leave(KErrCorrupt);
+					}
+				
+				if (aCreateExpressionEvaluator->EvaluateL(elseIfs[j]->Expression()).BoolValueL())
+					{
+					sizeOfInstallationBelowController += TotalSizeL(elseIfs[j]->InstallBlock(),
+																	aCreateExpressionEvaluator,
+																	aEmbedded);
+					break;	// stop processing else if blocks
+					}
+				}
+			}
+		}
+
+	if(aEmbedded)
+		{
+		// Embedded controllers in this SISInstallBlock.
+		for (TInt k=0 ; k < aInstallBlock.EmbeddedControllers().Count(); k++)
+			{
+			if (aInstallBlock.EmbeddedControllers()[k]==NULL)
+				{
+				User::Leave(KErrCorrupt);
+				}
+			sizeOfInstallationBelowController += TotalSizeL(aInstallBlock.EmbeddedControllers()[k]->InstallBlock(),
+														aCreateExpressionEvaluator,
+														aEmbedded);
+			}
+		}
+	return sizeOfInstallationBelowController;
+	}
+	
+RPointerArray<TDesC> CContentProvider::LocalizedOptionsL(TInt aLanguageIndex) const
+	{
+	const CSupportedOptions& options= iController.SupportedOptions();
+
+	// Now get the options and localize them...
+	RPointerArray<TDesC> ret;
+	CleanupClosePushL(ret);
+
+	for (TInt option = 0; option < options.Count(); option++)
+		{
+		const RPointerArray<CString>& names = options[option].Names();
+		ret.Append(&names[aLanguageIndex]->Data());
+		}
+
+	CleanupStack::Pop(&ret);
+	return ret;
+	}
+
+TInt64 CContentProvider::SizeOfFileDescriptionsInInstallBlock(const CInstallBlock& aInstallBlock) const
+	{
+	// Get all the SIS file descriptions in this SISInstallBlock.
+	const RPointerArray<CFileDescription>& files=aInstallBlock.FileDescriptions();
+  	
+	TInt64 totalSizeOfFileDescriptions = 0;
+
+	// Calculate the size of all the SIS file descriptions in this SISInstallBlock.
+	for (TInt l=0; l < files.Count(); l++)
+		{
+		CFileDescription& sisFileDescription = (*files[l]);
+		totalSizeOfFileDescriptions += sisFileDescription.UncompressedLength();
+		}
+	return totalSizeOfFileDescriptions;
+	}