diff -r 3f419852be07 -r 364021cecc90 smartinstaller/adm/src/ADMSisParser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smartinstaller/adm/src/ADMSisParser.cpp Wed Jun 30 11:01:26 2010 +0530 @@ -0,0 +1,192 @@ +/* +* Copyright (c) 2009-2010 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: +* Declares the CXmlParser class for ADM application. +* +* +*/ + + +#include "ADMSisParser.h" +#include "ADMPackageInfo.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace Swi; + +CSisParser* CSisParser::NewLC() + { + CSisParser* object = new ( ELeave ) CSisParser(); + CleanupStack::PushL( object ); + object->ConstructL(); + return object; + } + +CSisParser* CSisParser::NewL() + { + CSisParser* object = CSisParser::NewLC(); + CleanupStack::Pop(); + return object; + } + +CSisParser::CSisParser() + { + } + +CSisParser::~CSisParser() + { + iRfs.Close(); + } + +void CSisParser::ConstructL() + { + User::LeaveIfError(iRfs.Connect()); + } + +//TODO: a http sis data provider would allow partial download? +CPackageInfo* CSisParser::GetDepContentsL(const TDesC& aDepFileName, CPackageInfo *packageInfo,CDepTree* mainTree) + { + CFileSisDataProvider *provider = CFileSisDataProvider::NewLC(iRfs, aDepFileName); + Sis::CContents* contents = Sis::Parser::ContentsL(*provider); + CleanupStack::PushL(contents); + HBufC8* controllerpkg = contents->ReadControllerL(); + CleanupStack::PushL(controllerpkg); + CDesDataProvider* controllerProvider= CDesDataProvider::NewLC(*controllerpkg); + Sis::CController* controller = CController::NewLC(*controllerProvider); + SetDependenciesL(packageInfo, mainTree, controller, aDepFileName); + + CleanupStack::PopAndDestroy(controller); + CleanupStack::PopAndDestroy(controllerProvider); + CleanupStack::PopAndDestroy(controllerpkg); + CleanupStack::PopAndDestroy(contents); + CleanupStack::PopAndDestroy(provider); + return packageInfo; + } + +void CSisParser::SetDependenciesL(CPackageInfo *packageInfo,CDepTree* mainTree, Sis::CController* controller, const TDesC& aFileName) + { + //have now extracted the controller (header information) from the sis file. + if(mainTree->IsDepTreeEmpty()) + { + packageInfo = CPackageInfo::NewL(); + packageInfo->iPackageUid = controller->Info().Uid().Uid().iUid; + packageInfo->iVendor = controller->Info().UniqueVendorName().Data().AllocL(); + packageInfo->iVersion = TVersion(controller->Info().Version().Major(), + controller->Info().Version().Minor(), + controller->Info().Version().Build()); + SetLanguageSpecificNamesL(controller, packageInfo); + + packageInfo->iPackageStatus = EPackageRootToBeInstalled; + //TODO: HACK - ADM expects to use iPackageName as a filename, SIS file contains only UIDs + packageInfo->iSisPackageName = aFileName.AllocL(); + //TODO: end HACK + mainTree->AddPackageInfo(packageInfo); + } + + //Get dependencies + const RPointerArray &deps(controller->Prerequisites().Dependencies()); + for(TInt i=0;iUid().Uid().iUid; + CPackageInfo *dependentPackage = mainTree->LocatePackageInDepTree(uid); + if(dependentPackage == NULL) + { + dependentPackage = CPackageInfo::NewLC(); + dependentPackage->iPackageUid = dep->Uid().Uid().iUid; + //TODO: HACK - ADM expects to use iPackageName as a filename, SIS file contains only UIDs + TBuf<8> uidBuf; + uidBuf.Num(dependentPackage->iPackageUid, EHex); + dependentPackage->iPackageName = uidBuf.AllocL(); + //TODO: end HACK + packageInfo->AddEdgeL(dependentPackage); + mainTree->AddPackageInfo(dependentPackage); + CleanupStack::Pop(dependentPackage); + } + //embedded and outer sis may depend on different version of the same package - in this case, use the higher version number + const Sis::CVersion& ver = dep->VersionRange()->From(); + if(dependentPackage->iVersion.iMajor < ver.Major() || + (dependentPackage->iVersion.iMajor == ver.Major() && dependentPackage->iVersion.iMinor < ver.Minor()) || + (dependentPackage->iVersion.iMajor == ver.Major() && dependentPackage->iVersion.iMinor == ver.Minor() && dependentPackage->iVersion.iBuild < ver.Build())) + { + dependentPackage->iVersion = TVersion(ver.Major(), + ver.Minor(), + ver.Build()); + } + //also available : dependency names (localised list) + } + + //Get embedded SIS files' dependencies too + const RPointerArray &embedded = controller->InstallBlock().EmbeddedControllers(); + for(TInt i=0;iSupportedLanguages(); + TLocale locale; + TInt langIdx = KErrNotFound; + // find the language index, so we can access the proper localised + // names in the sis package + for (TInt downgradeIdx = -1; downgradeIdx < 3; downgradeIdx++) + { + // Go through the language downgrade path + // See the documentation of TLocale::LanguageDowngrade() + const TLanguage language = (downgradeIdx == -1) + ? User::Language() + : locale.LanguageDowngrade(downgradeIdx); + if (language == ELangNone) + break; + for (TInt i = 0; i < lang.Count(); i++) + { + if (lang[i] == language) + { + langIdx = i; + break; + } + } + } + const RPointerArray& names = aController->Info().Names(); + // also available: VendorNames() + + // Set localised name for the package + // Sis package didn't contain localised name, use the default + if (langIdx != KErrNotFound) + { + aPackageInfo->iPackageName = names[langIdx]->Data().AllocL(); + } + else if (names.Count() > 0) + { + aPackageInfo->iPackageName = names[0]->Data().AllocL(); + } + else + { + aPackageInfo->iPackageName = KNullDesC().AllocL(); + } + }