--- /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;
+ }