# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1268401394 -7200 # Node ID 3ba40be8e484d25b01a98ec8bf135d8a476acab2 # Parent 51c0f5edf5ef526e2042c730d0862cc486afee94 Revision: 201007 Kit: 201008 diff -r 51c0f5edf5ef -r 3ba40be8e484 appinstaller/AppMngr2/Sisx/src/appmngr2sisxappinfo.cpp --- a/appinstaller/AppMngr2/Sisx/src/appmngr2sisxappinfo.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/appinstaller/AppMngr2/Sisx/src/appmngr2sisxappinfo.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -294,11 +294,13 @@ iIsDRMProtected = TAppMngr2DRMUtils::IsDRMProtected( *fileName ); if( iIsDRMProtected ) { - FLOG( "CAppMngr2SisxAppInfo::ConstructL, protected file %S", fileName ); + FLOG( "CAppMngr2SisxAppInfo::ConstructL, iProtectedFile %S", fileName ); iProtectedFile = fileName; // takes ownership files.Remove( fileIndex ); iIsRightsObjectMissingOrExpired = TAppMngr2DRMUtils::IsDRMRightsObjectExpiredOrMissingL( *fileName ); + FLOG( "CAppMngr2SisxAppInfo::ConstructL, iIsRightsObjectMissingOrExpired %d", + iIsRightsObjectMissingOrExpired ); } } CleanupStack::PopAndDestroy( &files ); @@ -326,12 +328,21 @@ FLOG( "CAppMngr2SisxAppInfo::ShowDetailsL, isDRM %d, noRightsObj %d, CertCount %d", iIsDRMProtected, iIsRightsObjectMissingOrExpired, iCertificates.Count() ); + RFile fileHandle; + TInt fileOpenError = KErrNone; if( iIsDRMProtected && !iIsRightsObjectMissingOrExpired ) { - RFile fileHandle; - TInt err = fileHandle.Open( iFs, *iProtectedFile, EFileShareReadersOnly | EFileRead ); - CleanupClosePushL( fileHandle ); + FLOG( "CAppMngr2SisxAppInfo::ShowDetailsL, iProtecteFile %S", iProtectedFile ); + fileOpenError = fileHandle.Open( iFs, *iProtectedFile, EFileShareReadersOnly | EFileRead ); + FLOG( "CAppMngr2SisxAppInfo::ShowDetailsL, fileOpenError %d", fileOpenError ); + if( !fileOpenError ) + { + CleanupClosePushL( fileHandle ); + } + } + if( iIsDRMProtected && !iIsRightsObjectMissingOrExpired && !fileOpenError ) + { if( iCertificates.Count() ) { details->ExecuteLD( *iterator, iCertificates, fileHandle ); @@ -340,8 +351,6 @@ { details->ExecuteLD( *iterator, fileHandle ); } - - CleanupStack::PopAndDestroy( &fileHandle ); } else { @@ -355,6 +364,11 @@ } } + if( !fileOpenError ) + { + CleanupStack::PopAndDestroy( &fileHandle ); + } + CleanupStack::PopAndDestroy( iterator ); } diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/bwins/iaupdateengineu.def --- a/iaupdate/IAD/engine/bwins/iaupdateengineu.def Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/bwins/iaupdateengineu.def Fri Mar 12 15:43:14 2010 +0200 @@ -87,4 +87,5 @@ ?InternalizeL@TIAUpdateVersion@@QAEXABVTDesC16@@@Z @ 86 NONAME ; void TIAUpdateVersion::InternalizeL(class TDesC16 const &) ?SetToFloor@TIAUpdateVersion@@QAEXXZ @ 87 NONAME ; void TIAUpdateVersion::SetToFloor(void) ?SetToRoof@TIAUpdateVersion@@QAEXXZ @ 88 NONAME ; void TIAUpdateVersion::SetToRoof(void) + ?IsWidgetInstalledL@IAUpdateUtils@@YAHABVTDesC16@@AAVTIAUpdateVersion@@@Z @ 89 NONAME ; int IAUpdateUtils::IsWidgetInstalledL(class TDesC16 const &, class TIAUpdateVersion &) diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/inc/iaupdatebasenodeimpl.h --- a/iaupdate/IAD/engine/controller/inc/iaupdatebasenodeimpl.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/inc/iaupdatebasenodeimpl.h Fri Mar 12 15:43:14 2010 +0200 @@ -64,6 +64,11 @@ * @see MIAUpdateBaseNode::Uid **/ virtual const TUid& Uid() const; + + /** + * @see MIAUpdateBaseNode::Identifier + **/ + virtual const TDesC& Identifier() const; /** * @see MIAUpdateBaseNode::Name @@ -136,6 +141,11 @@ virtual void SetInstallStatusToPurchaseHistoryL( TInt aErrorCode, TBool aForceVisibleInHistory ); + /** + * @see MIAUpdateBaseNode::Mime + */ + virtual const TDesC& Mime() const; + public: // ** New functions @@ -277,6 +287,7 @@ HBufC* iDescription; HBufC* iMime; TUid iUid; + HBufC* iIdentifier; TIAUpdateVersion iVersion; CIAUpdateNodeDetails* iDetails; TBool iSelected; diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/inc/iaupdatectrlconsts.h --- a/iaupdate/IAD/engine/controller/inc/iaupdatectrlconsts.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/inc/iaupdatectrlconsts.h Fri Mar 12 15:43:14 2010 +0200 @@ -55,7 +55,7 @@ * * @since S60 v3.2 */ - _LIT( KSoftwareVersion, "2.0.8" ); + _LIT( KSoftwareVersion, "2.1.0" ); /** * Product code value that is used when emulator is used. diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/inc/iaupdatenodecontainer.h --- a/iaupdate/IAD/engine/controller/inc/iaupdatenodecontainer.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/inc/iaupdatenodecontainer.h Fri Mar 12 15:43:14 2010 +0200 @@ -200,6 +200,9 @@ // If same version of the node is installed, makes it hidden. TBool InstallCheckL( CIAUpdateNode& aNode ) const; + // Checks if the head node ids / identifers are equal + TBool NodeExists( const CIAUpdateNode& aNode, + const CIAUpdateNode& tmpNode ) const; private: // data diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/inc/iaupdateprotocolconsts.h --- a/iaupdate/IAD/engine/controller/inc/iaupdateprotocolconsts.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/inc/iaupdateprotocolconsts.h Fri Mar 12 15:43:14 2010 +0200 @@ -199,6 +199,11 @@ * MIME for FOTA DP2 firmware update. */ _LIT( KMimeFotiNsu, "application/x-nokia-foti-nsu" ); + + /** + * MIME for widgets + */ + _LIT( KMimeWidget, "application/x-nokia-widget" ); } diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/src/iaupdatebasenodeimpl.cpp --- a/iaupdate/IAD/engine/controller/src/iaupdatebasenodeimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/src/iaupdatebasenodeimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -33,8 +33,11 @@ #include "iaupdatecontentoperationmanager.h" #include "iaupdateutils.h" #include "iaupdatectrlnodeconsts.h" +#include "iaupdateprotocolconsts.h" #include "iaupdatedebug.h" -#include "iaupdateprotocolconsts.h" + + + // ----------------------------------------------------------------------------- @@ -102,7 +105,20 @@ { iMime = contentInfo->MimeType().AllocL(); iVersion.InternalizeL( contentInfo->Version() ); - iUid = contentInfo->Uid(); + + //Initialize iUid or iIdentifier according to the mime-type + iUid = KNullUid; + + if ( iMime->Compare( IAUpdateProtocolConsts::KMimeWidget ) == 0 ) + { + iIdentifier = contentInfo->Identifier().AllocL(); + } + else + { + iUid = contentInfo->Uid(); + iIdentifier = KNullDesC().AllocL(); + } + // Release content info. // So, we can later check if it still exists and then get // new one if it exists. @@ -144,6 +160,7 @@ delete iName; delete iDescription; delete iMime; + delete iIdentifier; delete iDetails; IAUPDATE_TRACE("[IAUPDATE] CIAUpdateBaseNode::~CIAUpdateBaseNode() end"); @@ -191,7 +208,17 @@ IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateBaseNode::Uid() = %x", iUid); return iUid; } - + + +// --------------------------------------------------------------------------- +// CIAUpdateBaseNode::Identifier +// +// --------------------------------------------------------------------------- +// +const TDesC& CIAUpdateBaseNode::Identifier() const + { + return *iIdentifier; + } // --------------------------------------------------------------------------- // CIAUpdateBaseNode::Name @@ -370,6 +397,17 @@ return; } +// --------------------------------------------------------------------------- +// CIAUpdateBaseNode::Mime +// +// --------------------------------------------------------------------------- +// +const TDesC& CIAUpdateBaseNode::Mime() const + { + return *iMime; + } + + // --------------------------------------------------------------------------- // Public functions @@ -435,18 +473,29 @@ // TBool CIAUpdateBaseNode::Equals( const CIAUpdateBaseNode& aNode ) const { - if ( aNode.MetaNamespace() == MetaNamespace() - && aNode.MetaId() == MetaId() - || ( aNode.Uid() == Uid() - && aNode.Version() == Version() - && aNode.iMime->Match( IAUpdateProtocolConsts::KMimeServicePackPattern()) == KErrNotFound ) ) + TBool equals = EFalse; + if ( iMime->Compare( IAUpdateProtocolConsts::KMimeWidget ) == 0 ) { - return ETrue; + if ( aNode.MetaNamespace() == MetaNamespace() + && aNode.MetaId() == MetaId() + || ( aNode.Identifier() == Identifier() + && aNode.Version() == Version() ) ) + { + equals = ETrue; + } } - else + else { - return EFalse; + if ( aNode.MetaNamespace() == MetaNamespace() + && aNode.MetaId() == MetaId() + || ( aNode.Uid() == Uid() + && aNode.Version() == Version() + && aNode.iMime->Match( IAUpdateProtocolConsts::KMimeServicePackPattern()) == KErrNotFound ) ) + { + equals = ETrue; + } } + return equals; } diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/src/iaupdatenodecontainer.cpp --- a/iaupdate/IAD/engine/controller/src/iaupdatenodecontainer.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/src/iaupdatenodecontainer.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -32,6 +32,11 @@ #include "iaupdatedebug.h" +#include "ncdnodecontentinfo.h" +#include "ncdnode.h" +#include "iaupdateprotocolconsts.h" + + // Constant that is used to inform that dependency node // was not found when dependencies were checked. const TInt KDependencyNotFound( -1 ); @@ -665,8 +670,10 @@ for ( TInt i = 0; i < iHeadNodes.Count(); ++i ) { - CIAUpdateNode& tmpNode( *iHeadNodes[ i ] ); - if( aNode.Uid() == tmpNode.Uid() && aNode.Type() != MIAUpdateNode::EPackageTypeServicePack ) + CIAUpdateNode& tmpNode( *iHeadNodes[ i ] ); + + if( NodeExists( aNode, tmpNode ) && + aNode.Type() != MIAUpdateNode::EPackageTypeServicePack ) { IAUPDATE_TRACE("[IAUPDATE] Head node already in the list."); @@ -726,7 +733,8 @@ { IAUPDATE_TRACE("[IAUPDATE] CIAUpdateNodeContainer::ReplaceRecommendedL() begin"); - if ( aCurrentNode.Uid() != aNewNode.Uid() ) + + if ( !NodeExists( aCurrentNode, aNewNode ) ) { IAUPDATE_TRACE("[IAUPDATE] LEAVE: Nodes do not match."); User::Leave( KErrArgument ); @@ -766,10 +774,11 @@ IAUPDATE_TRACE("[IAUPDATE] CIAUpdateNodeContainer::PackageTypeAcceptedL() begin"); if ( aNode.Type() == MIAUpdateNode::EPackageTypeServicePack - || aNode.Type() == MIAUpdateNode::EPackageTypeSA ) + || aNode.Type() == MIAUpdateNode::EPackageTypeSA + || aNode.Type() == MIAUpdateNode::EPackageTypeWidget ) { - // Service packs and SA type always accepted. - IAUPDATE_TRACE("[IAUPDATE] Upgrade packet type SA or node is service pack"); + // Service packs, SA types and Widgets are always accepted. + IAUPDATE_TRACE("[IAUPDATE] Upgrade packet type SA, service pack or widget"); IAUPDATE_TRACE("[IAUPDATE] CIAUpdateNodeContainer::PackageTypeAcceptedL() end: ETrue"); return ETrue; } @@ -1053,9 +1062,17 @@ { IAUPDATE_TRACE("[IAUPDATE] Not a service pack"); + TIAUpdateVersion installedVersion; - TBool installed( - IAUpdateUtils::IsAppInstalledL( aNode.Uid(), installedVersion ) ); + TBool installed = EFalse; + if ( aNode.Mime().Compare( IAUpdateProtocolConsts::KMimeWidget ) == 0 ) + { + installed = IAUpdateUtils::IsWidgetInstalledL( aNode.Identifier(), installedVersion ); + } + else + { + installed = IAUpdateUtils::IsAppInstalledL( aNode.Uid(), installedVersion ); + } // Notice that here we let the check pass also if node has the same version // as the installed content. By accepting same version, the dependency chains // will contain the currently installed node dependency information. Then, @@ -1087,3 +1104,33 @@ return checkPassed; } + +// Checks if the head node ids / identifers are equal +TBool CIAUpdateNodeContainer::NodeExists( const CIAUpdateNode& aNode, + const CIAUpdateNode& tmpNode )const + { + IAUPDATE_TRACE("[IAUPDATE] CIAUpdateNodeContainer::NodeExists begin"); + + TBool exists = EFalse; + + if ( aNode.Mime().Compare( IAUpdateProtocolConsts::KMimeWidget ) == 0 ) + { + if ( aNode.Identifier() == tmpNode.Identifier() ) + { + exists = ETrue; + } + } + else + { + if ( aNode.Uid() == tmpNode.Uid() ) + { + exists = ETrue; + } + } + + + IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateNodeContainer::NodeExists end: %d", + exists); + + return exists; + } diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/src/iaupdatenodeimpl.cpp --- a/iaupdate/IAD/engine/controller/src/iaupdatenodeimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/src/iaupdatenodeimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -20,6 +20,7 @@ #include #include #include +#include #include "iaupdatenodeimpl.h" #include "iaupdatenodeobserver.h" @@ -28,9 +29,11 @@ #include "iaupdatecontrollerimpl.h" #include "iaupdateutils.h" #include "iaupdatecontentoperationmanager.h" +#include "iaupdateprotocolconsts.h" #include "iaupdatedebug.h" + // ----------------------------------------------------------------------------- // CIAUpdateNode::NewLC // Two-phased constructor. @@ -150,9 +153,18 @@ // MIAUpdateNode::TPackageType CIAUpdateNode::Type() const { + MIAUpdateNode::TPackageType packageType; + if ( Mime().Compare( IAUpdateProtocolConsts::KMimeWidget ) == 0 ) + { + packageType = MIAUpdateNode::EPackageTypeWidget; + } + else + { + packageType = Details().ContentType(); + } IAUPDATE_TRACE_1("[IAUPDATE] CIAUpdateNode::Type() = %d", - Details().ContentType()); - return Details().ContentType(); + packageType ); + return packageType; } @@ -758,14 +770,26 @@ void CIAUpdateNode::AddDependantL( CIAUpdateNode& aDependantNode ) { IAUPDATE_TRACE("[IAUPDATE] CIAUpdateNode::AddDependantL() begin"); + for ( TInt i = 0; i < iDependants.Count(); ++i ) { CIAUpdateNode* node( iDependants[ i ] ); - if ( node->Uid() == aDependantNode.Uid() ) + if ( node->Mime().Compare( IAUpdateProtocolConsts::KMimeWidget) == 0 ) { - // Corresponding node is already in the array. - return; + if ( node->Identifier() == aDependantNode.Identifier() ) + { + // Corresponding node is already in the array. + return; + } + } + else + { + if ( node->Uid() == aDependantNode.Uid() ) + { + // Corresponding node is already in the array. + return; + } } } @@ -898,7 +922,18 @@ IAUPDATE_TRACE("[IAUPDATE] CIAUpdateNode::IsInstalledL() begin"); TIAUpdateVersion installedVersion; - TBool installed( IAUpdateUtils::IsAppInstalledL( Uid(), installedVersion ) ); + + TBool installed = EFalse; + + if ( Mime().Compare( IAUpdateProtocolConsts::KMimeWidget ) == 0 ) + { + installed = IAUpdateUtils::IsWidgetInstalledL( Identifier(), installedVersion ); + } + else + { + installed = IAUpdateUtils::IsAppInstalledL( Uid(), installedVersion ); + } + IAUPDATE_TRACE_3("CIAUpdateNode::IsInstalledL() Installed version %d.%d.%d", installedVersion.iMajor, installedVersion.iMinor, diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/controller/src/iaupdateutils.cpp --- a/iaupdate/IAD/engine/controller/src/iaupdateutils.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/controller/src/iaupdateutils.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -37,7 +37,7 @@ #include #include - +#include //Constants const TInt KSpaceMarginal( 100 * 1024 ); @@ -292,6 +292,53 @@ } } +// ----------------------------------------------------------------------------- +// IAUpdateUtils::IsWidgetInstalledL +// Check existance of widget and request the version info if the widget has been installed +// The Widget registry API is used here. +// ----------------------------------------------------------------------------- + +EXPORT_C TBool IAUpdateUtils::IsWidgetInstalledL(const TDesC& aIdentifier, TIAUpdateVersion& aVersion ) + { + RWidgetRegistryClientSession widgetRegistry; + + User::LeaveIfError( widgetRegistry.Connect() ); + + CleanupClosePushL( widgetRegistry ); + + RPointerArray widgetInfoArr; + CleanupResetAndDestroyPushL( widgetInfoArr ); + TInt err = widgetRegistry.InstalledWidgetsL(widgetInfoArr); + + for( TInt i( widgetInfoArr.Count() - 1 ); i >= 0; --i ) + { + CWidgetInfo* widgetInfo( widgetInfoArr[i] ); + + CWidgetPropertyValue* BundleId = widgetRegistry.GetWidgetPropertyValueL(widgetInfo->iUid, EBundleIdentifier ); + CleanupStack::PushL( BundleId ); + + if( aIdentifier.Compare( *(BundleId->iValue.s) )== 0 ) + { + CWidgetPropertyValue* version = widgetRegistry.GetWidgetPropertyValueL(widgetInfo->iUid, EBundleVersion ); + CleanupStack::PushL( version ); + + DesToVersionL(*(version->iValue.s), aVersion.iMajor, aVersion.iMinor, aVersion.iBuild ); + + CleanupStack::PopAndDestroy( version ); + CleanupStack::PopAndDestroy( BundleId ); + CleanupStack::PopAndDestroy( &widgetInfoArr ); + CleanupStack::PopAndDestroy( &widgetRegistry); + return ETrue; + } + CleanupStack::PopAndDestroy( BundleId ); + } + + CleanupStack::PopAndDestroy( &widgetInfoArr ); + CleanupStack::PopAndDestroy( &widgetRegistry); + return EFalse; + + + } // ----------------------------------------------------------------------------- // IAUpdateUtils::SpaceAvailableInInternalDrivesL diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/eabi/iaupdateengineu.def --- a/iaupdate/IAD/engine/eabi/iaupdateengineu.def Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/eabi/iaupdateengineu.def Fri Mar 12 15:43:14 2010 +0200 @@ -217,4 +217,5 @@ _ZThn4_N21CIAUpdateXmlSubParser22OnIgnorableWhiteSpaceLERK6TDesC8i @ 216 NONAME ; ## _ZThn4_N21CIAUpdateXmlSubParser24OnProcessingInstructionLERK6TDesC8S2_i @ 217 NONAME ; ## _ZThn4_N21CIAUpdateXmlSubParser7OnErrorEi @ 218 NONAME ; ## + _ZN13IAUpdateUtils18IsWidgetInstalledLERK7TDesC16R16TIAUpdateVersion @ 219 NONAME diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/group/iaupdateengine.mmp --- a/iaupdate/IAD/engine/group/iaupdateengine.mmp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/group/iaupdateengine.mmp Fri Mar 12 15:43:14 2010 +0200 @@ -124,6 +124,9 @@ // Updater files dll LIBRARY iaupdaterfiles.lib +// widget registry API library +LIBRARY widgetregistryclient.lib + // NCD Engine LIBRARY ncdengine_20019119.lib LIBRARY ncdutils_20019119.lib diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/inc/iaupdatebasenode.h --- a/iaupdate/IAD/engine/inc/iaupdatebasenode.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/inc/iaupdatebasenode.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-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" @@ -63,7 +63,13 @@ * @return const TUid& Uid of this node **/ virtual const TUid& Uid() const = 0; - + + /* + * This returns the identifier of widget. Normally it is a string --> "com.yiibu.hue" + * This is the unique identifier of widget before installing on top of Symbian platform. + */ + virtual const TDesC& Identifier() const = 0; + /** * @return const TDesC& The name of this node **/ @@ -161,6 +167,11 @@ */ virtual void SetInstallStatusToPurchaseHistoryL( TInt aErrorCode, TBool aForceVisibleInHistory ) = 0; + + /** + * @return const TDesC& The mime type of this node + **/ + virtual const TDesC& Mime() const = 0; protected: diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/inc/iaupdatenode.h --- a/iaupdate/IAD/engine/inc/iaupdatenode.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/inc/iaupdatenode.h Fri Mar 12 15:43:14 2010 +0200 @@ -69,8 +69,13 @@ * So, its content is given as separate packages * that are included in this service pack. */ - EPackageTypeServicePack - + EPackageTypeServicePack, + + /** + * The node content is widget. + */ + EPackageTypeWidget + }; diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/engine/inc/iaupdateutils.h --- a/iaupdate/IAD/engine/inc/iaupdateutils.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/engine/inc/iaupdateutils.h Fri Mar 12 15:43:14 2010 +0200 @@ -96,6 +96,11 @@ **/ IMPORT_C TBool IsAppInstalledL( const TUid& aUid, TIAUpdateVersion &aVersion ); +/** + * This function is added to check whether certain widget with given identifier are installed + * the function calls widget registry API + **/ +IMPORT_C TBool IsWidgetInstalledL( const TDesC& aIdentifier, TIAUpdateVersion &aVersion ); IMPORT_C TBool SpaceAvailableInInternalDrivesL( RPointerArray& aNodes ); diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/group/iaupdate.mmp --- a/iaupdate/IAD/ui/group/iaupdate.mmp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/group/iaupdate.mmp Fri Mar 12 15:43:14 2010 +0200 @@ -69,6 +69,7 @@ SOURCE iaupdateinstallationlistener.cpp SOURCE iaupdatedeputils.cpp SOURCE iaupdateuitimer.cpp +SOURCE iaupdatenodeid.cpp USERINCLUDE ../inc USERINCLUDE ../../tools/inc diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/group/iaupdate.rss --- a/iaupdate/IAD/ui/group/iaupdate.rss Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/group/iaupdate.rss Fri Mar 12 15:43:14 2010 +0200 @@ -698,6 +698,11 @@ buf = qtn_swupdate_cannot_omit; } +RESOURCE TBUF r_iaupdate_main_device_fw + { + buf = qtn_swupdate_main_device_fw; + } + //background check strings RESOURCE LBUF r_iaupdate_update_available diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/inc/iaupdatenodeid.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/ui/inc/iaupdatenodeid.h Fri Mar 12 15:43:14 2010 +0200 @@ -0,0 +1,80 @@ +/* +* Copyright (c) 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: This module contains the header file of CIAUpdateNodeId +* class. +*/ + + + + +#ifndef IAUPDATENODEID_H +#define IAUPDATENODEID_H + +//INCLUDES +#include + +#include "iaupdateanynode.h" + + +/** + * + */ +class CIAUpdateNodeId : public CBase + { + +public: + + static CIAUpdateNodeId* NewL(); + + static CIAUpdateNodeId* NewLC(); + + + virtual ~CIAUpdateNodeId(); + + const TDesC& Id() const; + void SetIdL( const TDesC& aId ); + + const TDesC& Namespace() const; + void SetNamespaceL( const TDesC& aNamespace ); + + MIAUpdateAnyNode::TNodeType NodeType() const; + void SetNodeType( MIAUpdateAnyNode::TNodeType aNodeType ); + + TBool Selected() const; + void SetSelected( TInt aSelected ); + + +private: + + // Prevent these if not implemented + CIAUpdateNodeId( const CIAUpdateNodeId& aObject ); + CIAUpdateNodeId& operator =( const CIAUpdateNodeId& aObject ); + + + CIAUpdateNodeId(); + + void ConstructL(); + + +private: // data + + HBufC* iId; + HBufC* iNamespace; + MIAUpdateAnyNode::TNodeType iNodeType; + TBool iSelected; + + }; + +#endif // IAUPDATENODEID_H + diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/inc/iaupdateuicontroller.h --- a/iaupdate/IAD/ui/inc/iaupdateuicontroller.h Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/inc/iaupdateuicontroller.h Fri Mar 12 15:43:14 2010 +0200 @@ -47,15 +47,7 @@ class MIAUpdateUiControllerObserver; class MIAUpdateHistory; class MIAUpdateFwNode; - - -struct SIAUpdateNodeId - { - MIAUpdateAnyNode::TNodeType iNodeType; - TUid iPackageUid; - TIAUpdateVersion iVersion; - TBool iSelected; - }; +class CIAUpdateNodeId; // CLASS DECLARATION @@ -559,7 +551,7 @@ RPointerArray< MIAUpdateFwNode > iFwNodes; - CArrayFix* iPreviousSelections; + RPointerArray iPreviousSelections; RPointerArray iServicePackNodes; diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/src/iaupdatedetailsdialog.cpp --- a/iaupdate/IAD/ui/src/iaupdatedetailsdialog.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/src/iaupdatedetailsdialog.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -143,13 +143,13 @@ TPtr ptr = iBuf->Des(); - //TPtrC name = iParam->iNode->Base().Name(); + TPtrC name = iParam->iNode->Base().Name(); TPtrC description = iParam->iNode->Base().Description(); TIAUpdateVersion version = iParam->iNode->Base().Version(); TInt contentSize = iParam->iNode->Base().ContentSizeL(); - /*HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_APP_NAME ); + HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_APP_NAME ); ptr.Append( KOpeningBoldTag ); ptr.Append( *hBuf ); ptr.Append( KClosingBoldTag ); @@ -158,9 +158,9 @@ ptr.Append( KNewLine ); ptr.Append( name ); ptr.Append( KNewLine ); - ptr.Append( KNewLine );*/ - - HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_DESCRIPTION ); + ptr.Append( KNewLine ); + + hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_DESCRIPTION ); ptr.Append( KOpeningBoldTag ); ptr.Append( *hBuf ); ptr.Append( KClosingBoldTag ); @@ -211,9 +211,9 @@ { ConstructTextL(); - //HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_TITLE ); - IAUpdateDialogUtil::ShowMessageQueryL( iParam->iNode->Base().Name(), *iBuf ); - //CleanupStack::PopAndDestroy( hBuf ); + HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_TITLE ); + IAUpdateDialogUtil::ShowMessageQueryL( *hBuf, *iBuf ); + CleanupStack::PopAndDestroy( hBuf ); return ETrue; } diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/src/iaupdatefwdetailsdialog.cpp --- a/iaupdate/IAD/ui/src/iaupdatefwdetailsdialog.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/src/iaupdatefwdetailsdialog.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -35,6 +35,8 @@ const TInt KMegaByte = 1024 * 1024; const TInt KMaxShownInKiloBytes = 10 * KMegaByte; +_LIT( KSpace, " "); + /******************************************************************************* * class CIAUpdateDetailsDialog @@ -139,8 +141,29 @@ TInt contentSize = iFwNode->Base().ContentSizeL(); + HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_APP_NAME ); + ptr.Append( KOpeningBoldTag ); + ptr.Append( *hBuf ); + ptr.Append( KClosingBoldTag ); + CleanupStack::PopAndDestroy( hBuf ); - HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_DESCRIPTION ); + HBufC* firmwareHeader = StringLoader::LoadLC(R_IAUPDATE_MAIN_DEVICE_FW); + HBufC* firmwarename = HBufC::NewLC( iFwNode->Base().Name().Length() + + KSpace.iTypeLength + + firmwareHeader->Length() ); + firmwarename->Des() = iFwNode->Base().Name(); + firmwarename->Des() += KSpace(); + firmwarename->Des() += *firmwareHeader; + + ptr.Append( KNewLine ); + ptr.Append( *firmwarename ); + CleanupStack::PopAndDestroy( firmwarename ); + CleanupStack::PopAndDestroy( firmwareHeader ); + ptr.Append( KNewLine ); + ptr.Append( KNewLine ); + + + hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_DESCRIPTION ); ptr.Append( KOpeningBoldTag ); ptr.Append( *hBuf ); ptr.Append( KClosingBoldTag ); @@ -195,13 +218,12 @@ TBool CIAUpdateFwDetailsDialog::ShowDialogL() { ConstructTextL(); - HBufC* firmwarename = iFwNode->Base().Name().AllocLC(); - IAUpdateDialogUtil::ShowMessageQueryL( *firmwarename, *iBuf ); - CleanupStack::PopAndDestroy( firmwarename ); + HBufC* hBuf = StringLoader::LoadLC( R_IAUPDATE_DETAILS_DIALOG_TITLE ); + IAUpdateDialogUtil::ShowMessageQueryL( *hBuf, *iBuf ); + CleanupStack::PopAndDestroy( hBuf ); return ETrue; } - // ----------------------------------------------------------------------------- // CIAUpdateFwDetailsDialog::FileSizeTextLC // diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/src/iaupdatemaincontainer.cpp --- a/iaupdate/IAD/ui/src/iaupdatemaincontainer.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/src/iaupdatemaincontainer.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-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" @@ -426,19 +426,17 @@ CleanupStack::PopAndDestroy( buffer ); CleanupStack::PopAndDestroy( name ); } - if ( node->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) { - MIAUpdateFwNode* fwnode = static_cast( node ); + HBufC* firmwareHeader = StringLoader::LoadLC(R_IAUPDATE_MAIN_DEVICE_FW); HBufC* firmwarename = HBufC::NewLC( node->Base().Name().Length() + - KSpace.iTypeLength + - fwnode->FwVersion1().Length() ); + KSpace.iTypeLength + + firmwareHeader->Length() ); firmwarename->Des() = node->Base().Name(); firmwarename->Des() += KSpace(); - firmwarename->Des() += fwnode->FwVersion1(); - - + firmwarename->Des() += *firmwareHeader; + HBufC* buffer = HBufC::NewLC( KOne.iTypeLength + KTabulator.iTypeLength + firmwarename->Length() + @@ -457,6 +455,7 @@ iItemTextArray->AppendL( *buffer ); CleanupStack::PopAndDestroy( buffer ); CleanupStack::PopAndDestroy( firmwarename ); + CleanupStack::PopAndDestroy( firmwareHeader ); } CleanupStack::PopAndDestroy( importanceDescription ); diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/src/iaupdatenodeid.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iaupdate/IAD/ui/src/iaupdatenodeid.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -0,0 +1,179 @@ +/* +* Copyright (c) 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: This module contains the implementation of CIAUpdateNodeId +* class member functions. +*/ + + + + +#include "iaupdatenodeid.h" + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::NewL +// +// ----------------------------------------------------------------------------- +// +CIAUpdateNodeId* CIAUpdateNodeId::NewL() + { + CIAUpdateNodeId* self = + CIAUpdateNodeId::NewLC(); + CleanupStack::Pop( self ); + return self; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::NewLC +// +// ----------------------------------------------------------------------------- +// +CIAUpdateNodeId* CIAUpdateNodeId::NewLC() + { + CIAUpdateNodeId* self = + new( ELeave) CIAUpdateNodeId(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::CIAUpdateNodeId +// +// ----------------------------------------------------------------------------- +// +CIAUpdateNodeId::CIAUpdateNodeId() + { + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::ConstructL +// +// ----------------------------------------------------------------------------- +// +void CIAUpdateNodeId::ConstructL() + { + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::~CIAUpdateNodeId +// +// ----------------------------------------------------------------------------- +// +CIAUpdateNodeId::~CIAUpdateNodeId() + { + delete iId; + delete iNamespace; + } + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::Id +// +// ----------------------------------------------------------------------------- +// +const TDesC& CIAUpdateNodeId::Id() const + { + if ( !iId ) + { + return KNullDesC; + } + + return *iId; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::SetIdL +// +// ----------------------------------------------------------------------------- +// +void CIAUpdateNodeId::SetIdL( const TDesC& aId ) + { + HBufC* tmp( aId.AllocL() ); + delete iId; + iId = tmp; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::Namespace +// +// ----------------------------------------------------------------------------- +// +const TDesC& CIAUpdateNodeId::Namespace() const + { + if ( !iNamespace ) + { + return KNullDesC; + } + + return *iNamespace; + } + + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::SetNamespaceL +// +// ----------------------------------------------------------------------------- +// +void CIAUpdateNodeId::SetNamespaceL( const TDesC& aNamespace ) + { + HBufC* tmp( aNamespace.AllocL() ); + delete iNamespace; + iNamespace = tmp; + } + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::NodeType +// +// ----------------------------------------------------------------------------- +// +MIAUpdateAnyNode::TNodeType CIAUpdateNodeId::NodeType() const + { + return iNodeType; + } + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::SetNodeType +// +// ----------------------------------------------------------------------------- +// +void CIAUpdateNodeId::SetNodeType( MIAUpdateAnyNode::TNodeType aNodeType ) + { + iNodeType = aNodeType; + } + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::Selected +// +// ----------------------------------------------------------------------------- +// +TBool CIAUpdateNodeId::Selected() const + { + return iSelected; + } + +// ----------------------------------------------------------------------------- +// CIAUpdateNodeId::SetSelected +// +// ----------------------------------------------------------------------------- +// +void CIAUpdateNodeId::SetSelected( TInt aSelected ) + { + iSelected = aSelected; + } diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/IAD/ui/src/iaupdateuicontroller.cpp --- a/iaupdate/IAD/ui/src/iaupdateuicontroller.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/IAD/ui/src/iaupdateuicontroller.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -63,6 +63,7 @@ #include "iaupdatefileconsts.h" #include "iaupdatefirsttimeinfo.h" #include "iaupdaterefreshhandler.h" +#include "iaupdatenodeid.h" #include "iaupdatedebug.h" @@ -256,6 +257,7 @@ iFwNodes.Reset(); iSelectedNodesArray.Reset(); iServicePackNodes.Reset(); + iPreviousSelections.Reset(); delete iFilter; delete iControllerFile; delete iIdle; @@ -264,7 +266,6 @@ delete iRoamingHandler; delete iParams; delete iRefreshHandler; - delete iPreviousSelections; // If dialogs have not been released yet, release them now. // ProcessFinishedL() should normally be used for dialogs but @@ -1576,29 +1577,32 @@ if ( appUi->UiRefreshAllowed() ) { iState = EUiRefreshing; - // store node identification (package UID and version) of currently selected nodes + // store node identification (Id and namespace) of currently selected nodes // to restore selections after refresh - delete iPreviousSelections; - iPreviousSelections = NULL; - iPreviousSelections = new( ELeave ) CArrayFixFlat( iNodes.Count() + 1 ); - for ( TInt i = 0; i < iNodes.Count(); ++i ) + iPreviousSelections.Reset(); + for ( TInt i = 0; i < iNodes.Count(); ++i ) { MIAUpdateNode* node( iNodes[ i ] ); - SIAUpdateNodeId nodeId; - nodeId.iNodeType = MIAUpdateAnyNode::ENodeTypeNormal; - nodeId.iPackageUid = node->Base().Uid(); - nodeId.iVersion = node->Base().Version(); - nodeId.iSelected = node->Base().IsSelected(); - iPreviousSelections->AppendL( nodeId ); + CIAUpdateNodeId* nodeId = CIAUpdateNodeId::NewLC(); + nodeId->SetIdL( node->Base().MetaId() ); + nodeId->SetNamespaceL( node->Base().MetaNamespace() ); + nodeId->SetNodeType( MIAUpdateAnyNode::ENodeTypeNormal ); + nodeId->SetSelected( node->Base().IsSelected() ); + iPreviousSelections.AppendL( nodeId ); + CleanupStack::Pop( nodeId ); + } if ( iFwNodes.Count() > 0 ) - { + { MIAUpdateFwNode* fwNode( iFwNodes[ 0 ] ); - SIAUpdateNodeId nodeId; - nodeId.iNodeType = MIAUpdateAnyNode::ENodeTypeFw; - nodeId.iSelected = fwNode->Base().IsSelected(); - iPreviousSelections->AppendL( nodeId ); + CIAUpdateNodeId* nodeId = CIAUpdateNodeId::NewLC(); + nodeId->SetIdL( fwNode->Base().MetaId() ); + nodeId->SetNamespaceL( fwNode->Base().MetaNamespace() ); + nodeId->SetNodeType( MIAUpdateAnyNode::ENodeTypeFw ); + nodeId->SetSelected( fwNode->Base().IsSelected() ); + iPreviousSelections.AppendL( nodeId ); + CleanupStack::Pop( nodeId ); } iController->StartRefreshL( EFalse ); @@ -1717,10 +1721,10 @@ // Find out if there was umarked firmware update in old selections, // that case needs special handling TBool unmarkedFw = EFalse; - for ( TInt i = 0; i < iPreviousSelections->Count(); ++i ) + for ( TInt i = 0; i < iPreviousSelections.Count(); ++i ) { - SIAUpdateNodeId prevNodeId = iPreviousSelections->At( i ); - if ( prevNodeId.iNodeType == MIAUpdateAnyNode::ENodeTypeFw && !prevNodeId.iSelected ) + CIAUpdateNodeId* prevNodeId( iPreviousSelections[ i ] ); + if ( prevNodeId->NodeType() == MIAUpdateAnyNode::ENodeTypeFw && !prevNodeId->Selected() ) { unmarkedFw = ETrue; } @@ -1763,13 +1767,13 @@ for ( TInt i = 0; i < iNodes.Count(); ++i ) { MIAUpdateNode* node( iNodes[ i ] ); - for ( TInt j = 0; j < iPreviousSelections->Count(); ++j ) + for ( TInt j = 0; j < iPreviousSelections.Count(); ++j ) { - SIAUpdateNodeId prevNodeId = iPreviousSelections->At(j); - if ( node->Base().Uid() == prevNodeId.iPackageUid && - node->Base().Version() == prevNodeId.iVersion ) - { - node->Base().SetSelected( prevNodeId.iSelected ); + CIAUpdateNodeId* prevNodeId( iPreviousSelections[ j ] ); + if ( node->Base().MetaId() == prevNodeId->Id() && + node->Base().MetaNamespace() == prevNodeId->Namespace() ) + { + node->Base().SetSelected( prevNodeId->Selected() ); } } } @@ -1788,12 +1792,12 @@ for ( TInt i = 0; i < iFwNodes.Count(); ++i ) { MIAUpdateFwNode* fwNode( iFwNodes[ i ] ); - for ( TInt j = 0; j < iPreviousSelections->Count(); ++j ) + for ( TInt j = 0; j < iPreviousSelections.Count(); ++j ) { - SIAUpdateNodeId prevNodeId = iPreviousSelections->At(j); - if ( prevNodeId.iNodeType == MIAUpdateAnyNode::ENodeTypeFw ) + CIAUpdateNodeId* prevNodeId( iPreviousSelections[ j ] ); + if ( prevNodeId->NodeType() == MIAUpdateAnyNode::ENodeTypeFw ) { - fwNode->Base().SetSelected( prevNodeId.iSelected ); + fwNode->Base().SetSelected( prevNodeId->Selected() ); } } if ( fwNode->Base().IsSelected() ) diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/group/bld.inf --- a/iaupdate/group/bld.inf Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/group/bld.inf Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -15,8 +15,6 @@ * */ -#ifdef FF_IAUPDATE - #include PRJ_PLATFORMS @@ -38,6 +36,5 @@ ../rom/iaupdate.iby CORE_MW_LAYER_IBY_EXPORT_PATH( iaupdate.iby ) ../rom/iaupdateresources.iby LANGUAGE_MW_LAYER_IBY_EXPORT_PATH( iaupdateresources.iby ) -#endif //FF_IAUPDATE diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/rom/iaupdate_stub.SIS Binary file iaupdate/rom/iaupdate_stub.SIS has changed diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdate/rom/iaupdate_stub.pkg --- a/iaupdate/rom/iaupdate_stub.pkg Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdate/rom/iaupdate_stub.pkg Fri Mar 12 15:43:14 2010 +0200 @@ -16,7 +16,7 @@ &EN ;Header -#{"Software update"}, (0x2000f85a), 2, 0, 8, TYPE=SA +#{"Application update"}, (0x2000f85a), 2, 1, 0, TYPE=SA ;Localised Vendor Name %{"Nokia"} diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdateapi_stub/group/bld.inf --- a/iaupdateapi_stub/group/bld.inf Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdateapi_stub/group/bld.inf Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -28,12 +28,9 @@ ../rom/iaupdateapi.iby CORE_MW_LAYER_IBY_EXPORT_PATH( iaupdateapi.iby ) -#ifndef FF_IAUPDATE -../sis/iaupdate_stub.sis /epoc32/data/z/system/install/iaupdate_stub.sis -#endif //FF_IAUPDATE +../sis/iaupdate_stub.sis /epoc32/data/z/system/install/stub_iaupdate_stub.sis PRJ_MMPFILES -#ifndef FF_IAUPDATE iaupdateapi.mmp -#endif //FF_IAUPDATE + diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdateapi_stub/group/iaupdateapi.mmp --- a/iaupdateapi_stub/group/iaupdateapi.mmp Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdateapi_stub/group/iaupdateapi.mmp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008-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" @@ -21,14 +21,10 @@ CAPABILITY CAP_GENERAL_DLL -#if defined(WINS) || defined(WINSCW) -TARGET iaupdateapi.dll -#else TARGET iaupdateapi_stub.dll -#endif LINKAS iaupdateapi.dll -EXPORTLIBRARY iaupdateapi.lib +EXPORTLIBRARY iaupdateapi_stub.lib TARGETTYPE dll UID 0x1000008d 0x2000F85C diff -r 51c0f5edf5ef -r 3ba40be8e484 iaupdateapi_stub/rom/iaupdateapi.iby --- a/iaupdateapi_stub/rom/iaupdateapi.iby Fri Feb 19 22:57:02 2010 +0200 +++ b/iaupdateapi_stub/rom/iaupdateapi.iby Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -23,7 +23,7 @@ #ifndef FF_IAUPDATE file=ABI_DIR\BUILD_DIR\iaupdateapi_stub.dll SHARED_LIB_DIR\iaupdateapi.dll -data=ZSYSTEM\install\iaupdate_stub.sis System\Install\iaupdate_stub.sis +data=ZSYSTEM\install\stub_iaupdate_stub.sis System\Install\iaupdate_stub.sis #endif //FF_IAUPDATE diff -r 51c0f5edf5ef -r 3ba40be8e484 installationservices/swi/inc/switextshell.iby --- a/installationservices/swi/inc/switextshell.iby Fri Feb 19 22:57:02 2010 +0200 +++ b/installationservices/swi/inc/switextshell.iby Fri Mar 12 15:43:14 2010 +0200 @@ -95,9 +95,6 @@ file=ABI_DIR\BUILD_DIR\cafdataprovider.dll sys\bin\cafdataprovider.dll file=ABI_DIR\BUILD_DIR\pkgremover.dll sys\bin\pkgremover.dll -// OMX IL component common(Temp Fix to Build navi text shell images) -file=ABI_DIR\BUILD_DIR\omxilcomponentcommon.dll System\Libs\omxilcomponentcommon.dll - // Core SWI - 9.5 REM Including swiplugin.iby instead explicitly mentioning the files to avoid duplicate includes #include "swiplugin.iby" diff -r 51c0f5edf5ef -r 3ba40be8e484 installationservices/swi/source/securitymanager/certchainconstraints.cpp --- a/installationservices/swi/source/securitymanager/certchainconstraints.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/installationservices/swi/source/securitymanager/certchainconstraints.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -26,7 +26,6 @@ #include "certchainconstraints.h" #include "x509constraintext.h" #include -#include //#include "log.h" using namespace Swi; @@ -88,21 +87,17 @@ { return iValidCapabilities.HasCapabilities(aRequestCapabilities); } - + EXPORT_C TBool CCertChainConstraints::DeviceIDIsValid(const HBufC* aRequestDeviceID) const { TBool ret=EFalse; if (iDeviceIDsAreConstrained) { TInt deviceIDCount=iValidDeviceIDs.Count(); - - TCollationMethod m = *Mem::CollationMethodByIndex(0); // get the standard method - m.iFlags |= TCollationMethod::EFoldCase; // Convert to lowercase and compare. - //Check if request Device ID is in the valid device ID list for(TInt i=0; iCompareC(*aRequestDeviceID, 0, &m) ==0) + if (iValidDeviceIDs[i]->CompareF(*aRequestDeviceID)==0) { ret=ETrue; break; diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/engine/group/config.xml --- a/ncdengine/engine/group/config.xml Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/engine/group/config.xml Fri Mar 12 15:43:14 2010 +0200 @@ -5,7 +5,7 @@ vanilla - 5.1.920 + 9.2.1006 diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/engine/transport/inc/catalogshttpdownload.h --- a/ncdengine/engine/transport/inc/catalogshttpdownload.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/engine/transport/inc/catalogshttpdownload.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -480,6 +480,11 @@ void UpdateExtensionL(); /** + * Replace current extension at aName with extension given (eExt). + */ + void CCatalogsHttpDownload::ReplaceExtension( TDes& aName, const TDesC& aExt ); + + /** * Checks the preset content-type and forces HEAD request if * content is OMA DD, JAD or some DRM file */ diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/engine/transport/src/catalogshttpdownload.cpp --- a/ncdengine/engine/transport/src/catalogshttpdownload.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/engine/transport/src/catalogshttpdownload.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -1044,7 +1044,8 @@ // was >=, DL manager should give us proper errors but it doesn't always if ( ( statusCode == KHttpErrorStatus || - globalErrorId == KGenericSymbianHttpError ) && + globalErrorId == KGenericSymbianHttpError || + globalErrorId == KErrDisMounted) && aEvent.iDownloadState != EHttpDlFailed ) { DLTRACE(("Setting download as failed because received a response >= 400" )); @@ -2422,7 +2423,16 @@ TFileName filename = iConfig->Filename(); TDataType type( ContentType() ); - iOwner.DocumentHandler().CheckFileNameExtension( filename, type ); + + // Doc handler does not yet support Widget extension change + TFileName mimeType; + mimeType.Copy(type.Des8()); + if ( mimeType.Compare(KMimeTypeMatchWidget) == 0 ) + { + ReplaceExtension( filename, KWidgetExtension ); + } + else + iOwner.DocumentHandler().CheckFileNameExtension( filename, type ); iConfig->SetFilenameL( filename ); } @@ -2650,3 +2660,18 @@ return *iEncodedUri; } +// --------------------------------------------------------- +// CCatalogsHttpDownload::ReplaceExtension() +// Replace current extension at aName with extension given (eExt). +// --------------------------------------------------------- +// +void CCatalogsHttpDownload::ReplaceExtension( TDes& aName, const TDesC& aExt ) + { + + TInt dotPos = aName.LocateReverse( '.' ); + if ( dotPos != KErrNotFound ) + { + aName.Delete( dotPos, aName.Length()- dotPos ); + aName.Append( aExt ); + } + } diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/group/bld.inf --- a/ncdengine/group/bld.inf Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/group/bld.inf Fri Mar 12 15:43:14 2010 +0200 @@ -41,7 +41,7 @@ // This allows eclipsing the ROM base installation with normal SIS //**************************************************************************** -altair-engine-stub.SIS /epoc32/data/z/system/install/altair-engine-stub.SIS +../rom/altair-engine-stub.SIS /epoc32/data/z/system/install/altair-engine-stub.SIS //altair-pcd-adapter-stub.SIS /epoc32/data/z/system/install/altair-pcd-adapter-stub.SIS //**************************************************************************** diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/inc/catalogsconstants.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/inc/catalogsconstants.h Fri Mar 12 15:43:14 2010 +0200 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2006-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: Constants and definitions. +* +*/ + + +#ifndef CATALOGS_CONSTANTS_H +#define CATALOGS_CONSTANTS_H + +#include +#include + +#include "catalogsuids.h" + +// Replaced with USE_BUILD_SCRIPT when using build script +#define DUMMY_DEFINE + + +/** + * Catalogs engine mutex name. All engine object instances have a handle to the mutex. + * This can be used to determine if there are engine objects in use. + */ +#ifdef USE_BUILD_SCRIPT +_LIT( KCatalogsEngineMutex, "ncd-engine-mutex_APP_NAME_POSTFIX" ); +#else +_LIT( KCatalogsEngineMutex, "ncd-engine-mutex_20019119" ); +#endif // USE_BUILD_SCRIPT + +/** + * Note on RProperty usage. + * RProperty is defined by category and key. + * + * The engine server side process defines RProperty that is defined + * to have category value equal to SID of the process. + * Two kinds of info are published using RProperty. + * - general settings (currently only maintenance lock status) + * - client specific connection activity indicator + * + * Connection activity uses RProperty with key that is same as client SID. + * Because both information are published within the same category, we must ensure + * that there are no conflicts in key values. To ensure this, following assumptions + * about keys are used: + * - all settings values (such as maintenance lock) must be from protected UID + * range class 0 (0x00000000 - 0x0FFFFFFF) + * - all engine clients must use UIDs from class 2 (0x20000000 - 0x2FFFFFFF) + */ + +/** Catalogs engine property category */ +const TUid KCatalogsEnginePropertyCategory = { KCatalogsServerUid }; + +/** + * Catalogs engine maintenance lock property key. Written when locking/releasing + * (0 = released). + */ +const TUint KCatalogsEnginePropertyKeyMaintenanceLock = 1; + +/** + * Catalogs update message queue name format string. Global message queue with this + * name is created + */ +_LIT( KCatalogsUpdateQueueNameFormat, "CatalogsUpdate-%08x" ); + +/** Catalogs OTA update message queue message size */ +const TInt KCatalogsUpdateQueueMessageSize = RMsgQueueBase::KMaxLength; +const TInt KCatalogsUpdateQueueSlotCount = 32; + +/** Catalogs engine ECom implementation uid */ +const TUid KCCatalogsEngineImplUid = { KCatalogsEngineImplementationUid }; + +/** Catalogs OTA update information maximum field sizes */ +const TInt KCatalogsUpdateInformationMaxSize = 3*1024; +const TInt KCatalogsUpdateTargetMaxSize = 256; +const TInt KCatalogsUpdateIdMaxSize = 1024; +const TInt KCatalogsUpdateVersionMaxSize = 256; +const TInt KCatalogsUpdateUriMaxSize = 1024; + + +/** + * Mime type match strings. + */ + +_LIT( KMimeTypeMatchSymbianInstall, "application/vnd.symbian.install" ); +_LIT( KMimeTypeMatch1JavaApplication, "*java?archive" ); +_LIT( KMimeTypeMatch2JavaApplication, "application/java-archive" ); +_LIT( KMimeTypeMatchRealMedia, "application/vnd.rn-realmedia" ); +_LIT( KMimeTypeMatchApplicationStream,"application/octet-stream" ); +_LIT( KMimeTypeMatchApplication, "application/*" ); + +_LIT( KMimeTypeMatchSis, "x-epoc/x-app268436505" ); +_LIT( KMimeTypeMatchSisx, "x-epoc/x-sisx-app" ); + + +_LIT( KMimeTypeMatchHtml, "text/html" ); +_LIT( KMimeTypeMatchTxt, "text/plain" ); +_LIT( KMimeTypeMatchCod, "text/x-co-desc" ); +_LIT8( KMimeTypeXml, "text/xml" ); + +_LIT( KMimeTypeMatchDrmMessage, "application/vnd.oma.drm.message" ); +_LIT( KMimeTypeMatchDrmRightsXml, "application/vnd.oma.drm.rights+xml" ); +_LIT( KMimeTypeMatchDrmRightsWbxml, "application/vnd.oma.drm.rights+wbxml" ); +_LIT8( KMimeTypeMatchDrmRightsXml8, "application/vnd.oma.drm.rights+xml" ); +_LIT8( KMimeTypeMatchDrmRightsWbxml8, "application/vnd.oma.drm.rights+wbxml" ); +_LIT( KMimeTypeMatchDrmContent, "application/vnd.oma.drm.content" ); +_LIT8( KMimeTypeMatchDrm8, "application/vnd.oma.drm.*" ); + +_LIT( KMimeTypeMatchOdd, "application/vnd.oma.dd*" ); +_LIT8( KMimeTypeMatchOdd8, "application/vnd.oma.dd*" ); + +_LIT( KMimeTypeMatchWidget, "application/x-nokia-widget" ); + +_LIT( KHttpMatchString, "http://*" ); + +// Descriptor types +_LIT( KDescriptorTypeOdd, "dd" ); +_LIT( KDescriptorTypeJad, "jad" ); + +_LIT( KMimeTypeMatchJad, "text/vnd.sun.j2me.app-descriptor" ); +_LIT8( KMimeTypeMatchJad8, "text/vnd.sun.j2me.app-descriptor" ); + +_LIT( KDirectorySeparator, "\\" ); + +// List granularity used in initializing various lists and arrays. +const TInt KListGranularity( 8 ); + +// CBufFlat expansion size, should not be very small for good +// performance. +const TInt KBufExpandSize( 256 ); + +// Granularity for CCatalogsStringManager's string arrays +const TInt KStringArrayGranularity( 256 ); + + +// Query id for payment method query. +_LIT( KQueryIdPaymentMethod, "deadbeef" ); + + +// Engine configuration file +_LIT( KCatalogsConfigFile, "config.xml" ); + +// Download manager root dir +_LIT( KCatalogsDownloadMgrPath, "C:\\system\\dmgr\\%S\\downloads\\*.*" ); + +// Number of attempts before we give up on connecting to download manager +const TInt KCatalogsDlMgrConnectRetryAttempts = 5; + +// tenth of a second, the time between download manager connect attemps +const TInt KCatalogsDlMgrConnectRetryInterval = 100000; + +// File extension for widget +_LIT( KWidgetExtension, ".wgz" ); + +// Default widget version number +_LIT( KDefVersion, "000" ); + +#endif // CATALOGS_CONSTANTS_H diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/inc/ncdnodecontentinfo.h --- a/ncdengine/inc/ncdnodecontentinfo.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/inc/ncdnodecontentinfo.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -78,7 +78,6 @@ */ virtual TUid Uid() const = 0; - /** * Different versions of the content items may exist. Thus, * a version identifier may be defined for the item. When installing @@ -102,6 +101,15 @@ */ virtual TInt Size() const = 0; + /** + * This function is the indicative Identifier for the + * contents that are widgets. This can be used e.g. for checking + * if the widget has already been installed to the phone. + * + * @return The Identifer of the application item. + */ + virtual const TDesC& Identifier() const = 0; + protected: diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/client/inc/ncdnodecontentinfoproxy.h --- a/ncdengine/provider/client/inc/ncdnodecontentinfoproxy.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/client/inc/ncdnodecontentinfoproxy.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -122,6 +122,11 @@ */ virtual TInt Size() const; + /** + * @see MNcdNodeContent::Identifier + */ + const TDesC& Identifier() const; + protected: /** @@ -171,6 +176,7 @@ TUint iPurpose; HBufC* iMimeType; + HBufC* iIdentifier; TUid iUid; HBufC* iVersion; TInt iSize; diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/client/src/ncdnodecontentinfoproxy.cpp --- a/ncdengine/provider/client/src/ncdnodecontentinfoproxy.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/client/src/ncdnodecontentinfoproxy.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -27,6 +27,7 @@ #include "catalogsutils.h" #include "catalogsdebug.h" #include "ncderrors.h" +#include "catalogsconstants.h" // ======== PUBLIC MEMBER FUNCTIONS ======== @@ -86,7 +87,10 @@ delete iMimeType; iMimeType = NULL; - + + delete iIdentifier; + iIdentifier = NULL; + delete iVersion; iVersion = NULL; } @@ -166,6 +170,11 @@ return *iMimeType; } +const TDesC& CNcdNodeContentInfoProxy::Identifier() const + { + return *iIdentifier; + } + TUid CNcdNodeContentInfoProxy::Uid() const { return iUid; @@ -209,9 +218,19 @@ InternalizeDesL( iMimeType, aStream ); DLINFO(( _L("Mime: %S"), iMimeType )); - iUid.iUid = aStream.ReadInt32L(); - DLINFO(( "Uid: %x", iUid.iUid )); - + //The Internalization here must be consistant with the externalization in CNcdNodeContentInfo + if ( iMimeType->Compare( KMimeTypeMatchWidget ) == 0 ) + { + //widget + InternalizeDesL( iIdentifier, aStream ); + } + else + { + //sis + iUid.iUid = aStream.ReadInt32L(); + DLINFO(( "Uid: %x", iUid.iUid )); + } + InternalizeDesL( iVersion, aStream ); DLINFO(( _L("Version: %S"), iVersion )); diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/client/src/ncdsilentinstalloperationproxy.cpp --- a/ncdengine/provider/client/src/ncdsilentinstalloperationproxy.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/client/src/ncdsilentinstalloperationproxy.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -204,7 +204,18 @@ SilentInstallOptionsPackage() ); break; } - + + // Call the corresponding installing function according to the type value. + // MimeType info is missing here but SWI will figure out the mimetype via file handler + // and call the corresponding plugin. + case CNcdInstallInfo::ENcdInstallWidget: + { + Installer().SilentInstallWidgetL( + iFileHandle, + SilentInstallOptionsPackage() ); + + break; + } default: { diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/deviceinteraction/inc/ncdinstallationservice.h --- a/ncdengine/provider/deviceinteraction/inc/ncdinstallationservice.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/deviceinteraction/inc/ncdinstallationservice.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -135,6 +135,12 @@ const TDesC& aMimeType, const TDesC8& aDescriptorData, const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg ) = 0; + + /* + * Use SWI API to install widget silently. + */ + virtual void SilentInstallWidgetL(RFile& aFile, + const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg ) = 0; /** * Cancels the silent installation if it is going on. @@ -184,7 +190,20 @@ virtual TNcdApplicationStatus IsApplicationInstalledL( const TUid& aUid, const TCatalogsVersion& aVersion ) = 0; - + + /** + * Use widget registry API to check if certain widget with given identifier + * has been installed already. + */ + virtual TNcdApplicationStatus IsWidgetInstalledL( + const TDesC& aIdentifier, const TCatalogsVersion& aVersion) = 0; + + /** + * Calling widget registry API to return the Uid of the widget + * with given identifier. + */ + virtual TUid WidgetUidL( const TDesC& aIdentifier) = 0; + /** * Gets the first SID from the SIS registry package * by using application UID. diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/deviceinteraction/inc/ncdinstallationserviceimpl.h --- a/ncdengine/provider/deviceinteraction/inc/ncdinstallationserviceimpl.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/deviceinteraction/inc/ncdinstallationserviceimpl.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -34,6 +34,8 @@ #include "ncdasyncoperationobserver.h" #include "ncdasyncsilentinstallobserver.h" +#include "ncdwidgetregistrydata.h" + /** * New Java registry API was introduced in 3.2. We start using it @@ -148,6 +150,12 @@ const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg ); /** + * @see MNcdInstallationService::SilentInstallWidgetJavaL + */ + void SilentInstallWidgetL( RFile& aFile, + const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg ); + + /** * @see MNcdInstallationService::MNcdCancelSilentInstall */ void CancelSilentInstall( HBufC*& aFileName, @@ -178,6 +186,17 @@ const TUid& aUid, const TCatalogsVersion& aVersion ); /** + * @see MNcdInstallationService::IsWidgetInstalledL + */ + TNcdApplicationStatus IsWidgetInstalledL( + const TDesC& aIdentifier, const TCatalogsVersion& aVersion); + + /** + * @see MNcdInstallationService::WidgetUidL + */ + TUid WidgetUidL( const TDesC& aIdentifier); + + /** * @see MNcdInstallationService::SidFromSisRegistryL */ TUid SidFromSisRegistryL( const TUid& aUid ); @@ -386,6 +405,8 @@ void PopulateInstalledWidgetUidsL(); + void PopulateInstalledWidgetsL(RExtendedWidgetInfoArray& aWidgets); + TUid InstalledWidgetUidL(); HBufC* InstalledWidgetNameLC(); @@ -396,6 +417,10 @@ TBool WidgetExistsL( const TUid& aUid ); + TBool WidgetExistsL( const TDesC& aIdentifier, TCatalogsVersion& aVersion ); + + TBool WidgetExistsL( const TUid& aUid, TCatalogsVersion& aVersion ); + private: enum TInstallType @@ -468,7 +493,9 @@ RWidgetRegistryClientSession iWidgetRegistry; + RWidgetInfoArray iInstalledWidgets; + RPointerArray iInstalledWidgetsInfos; }; #endif // C_NCD_INSTALLATION_SERVICE_IMPL_H diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/deviceinteraction/inc/ncdwidgetregistrydata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/provider/deviceinteraction/inc/ncdwidgetregistrydata.h Fri Mar 12 15:43:14 2010 +0200 @@ -0,0 +1,65 @@ +/* +* Copyright (c) 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: Declaration of CExtendedWidgetInfo +* +*/ + +#ifndef NCDEXTENDEDWIDGETINFO_H +#define NCDEXTENDEDWIDGETINFO_H + +// INCLUDES +#include +#include +#include "catalogsutils.h" + +// CONSTANTS + +// MACROS + +// FORWARD DECLARATIONS + +// DATA TYPES + +// FUNCTION PROTOTYPES + +// CLASS DECLARATION + +class CExtendedWidgetInfo : public CBase + { + public: + /** + * Constructor + */ + inline CExtendedWidgetInfo() + { + iUid = TUid::Uid(0); + iVersion = HBufC::New( KWidgetRegistryVal + 1 ); + + } + /** + * Destructor. + */ + inline virtual ~CExtendedWidgetInfo() + { + delete iVersion; + } + + public: + TUid iUid; + HBufC* iVersion; + }; + +typedef RPointerArray RExtendedWidgetInfoArray; + +#endif //NCDEXTENDEDWIDGETINFO diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/deviceinteraction/src/ncdinstallationserviceimpl.cpp --- a/ncdengine/provider/deviceinteraction/src/ncdinstallationserviceimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/deviceinteraction/src/ncdinstallationserviceimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -71,8 +71,6 @@ // length taken from WidgetRegistryData.h const TInt KWidgetBundleIdLength = KWidgetRegistryVal + 1; -_LIT( KWidgetExtension, ".wgz" ); - // ======== CALLBACK FUNCTION ======== static TInt InstallationCompleteCallback( TAny* aData ) @@ -158,6 +156,7 @@ iWidgetRegistry.Close(); } iInstalledWidgets.ResetAndDestroy(); + iInstalledWidgetsInfos.ResetAndDestroy(); } // --------------------------------------------------------------------------- @@ -298,7 +297,25 @@ DLTRACEOUT(("")); } +// --------------------------------------------------------------------------- +// Installs widget silently. +// --------------------------------------------------------------------------- +// +void CNcdInstallationService::SilentInstallWidgetL( RFile& aFile, + const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg ) + { + DLTRACEIN(("")); + + if ( iSilentInstallActiveObserver == NULL ) + { + DLINFO(("Create active observer for silent install")); + iSilentInstallActiveObserver = CNcdSilentInstallActiveObserver::NewL( *this ); + } + InstallWidgetL( aFile, &aInstallOptionsPckg ); + + DLTRACEOUT(("")); + } // --------------------------------------------------------------------------- // Cancell silent install. // --------------------------------------------------------------------------- @@ -533,7 +550,55 @@ } #endif + +// Check via widget registry API +TNcdApplicationStatus CNcdInstallationService::IsWidgetInstalledL(const TDesC& aIdentifier, const TCatalogsVersion& aVersion) + { + DLTRACEIN(("")); + TNcdApplicationStatus status( ENcdApplicationNotInstalled ); + + if ( aIdentifier.Length() == 0 ) + { + DLTRACEOUT(("Null identifier")); + return status; + } + + + TCatalogsVersion installedVersion; + + //check widget existance and get version number if it is installed + if ( WidgetExistsL( aIdentifier, installedVersion ) ) + { + status = ENcdApplicationInstalled; + } + + //compare the version + if ( status == ENcdApplicationInstalled && + aVersion != TCatalogsVersion() ) + { + DLINFO(("Installed widget version: %d.%d.%d, comparing to: %d.%d.%d", + installedVersion.iMajor, + installedVersion.iMinor, + installedVersion.iBuild, + aVersion.iMajor, + aVersion.iMinor, + aVersion.iBuild )); + + if ( installedVersion > aVersion ) + { + status = ENcdApplicationNewerVersionInstalled; + } + else if ( !( installedVersion == aVersion ) ) + { + status = ENcdApplicationOlderVersionInstalled; + } + } + + DLTRACEOUT(("widget Status: %d", status)); + return status; + } + // --------------------------------------------------------------------------- // Checks the application status // --------------------------------------------------------------------------- @@ -580,9 +645,10 @@ // SIS app not found, try to get java if ( err == KErrNotFound && ( JavaAppExistsL( aUid ) || - WidgetExistsL( aUid ) ) ) + WidgetExistsL( aUid, installedVersion ) ) ) { status = ENcdApplicationInstalled; + err = KErrNone; } LeaveIfNotErrorL( err, KErrNotFound ); @@ -1540,10 +1606,10 @@ iInstallType = EWidgetInstall; - // Get the list of installed widget uids so that we can + // Get the list of installed widgets so that we can // get the uid of the new widget after installation - PopulateInstalledWidgetUidsL(); - + PopulateInstalledWidgetsL(iInstalledWidgetsInfos); + TDataType dataType; // Start application installation. DLINFO(( "Calling doc handler Open" )); @@ -1653,6 +1719,19 @@ aError = KErrCancel; } } + else if ( iInstallType == EWidgetInstall ) + { + // Set the midlet UID for the aAppUid variable. + aAppUid = InstalledWidgetUidL(); + + if ( aAppUid == KNullUid ) + { + DLINFO(("Installed widget was not found")); + // Because the new widget was not found, we can suppose that the + // application was not installed. So, set the error as KErrCancel. + aError = KErrCancel; + } + } else if ( iInstallType == ESisInstall ) { // Get theme name if such was installed @@ -2057,6 +2136,49 @@ User::LeaveIfError( iWidgetRegistry.InstalledWidgetsL( iInstalledWidgets ) ); } +// --------------------------------------------------------------------------- +// Populates the list of installed widgets +// --------------------------------------------------------------------------- +// +void CNcdInstallationService::PopulateInstalledWidgetsL + (RExtendedWidgetInfoArray& aWidgets) + { + DLTRACEIN(("")); + + // Get the list of installed widget uids + PopulateInstalledWidgetUidsL(); + + const TInt count = iInstalledWidgets.Count(); + + // Create array with UID & Version infos + for ( TInt i = 0; i < count; ++i ) + { + CExtendedWidgetInfo* tempInfo = new ( ELeave ) CExtendedWidgetInfo(); + CleanupStack::PushL( tempInfo ); + + CWidgetInfo* widgetInfo = iInstalledWidgets[i]; + + CWidgetPropertyValue* version = iWidgetRegistry.GetWidgetPropertyValueL + (widgetInfo->iUid, EBundleVersion ); + CleanupStack::PushL( version ); + + // Fill info + tempInfo->iUid = widgetInfo->iUid; + if (!version->iValue.s) + *(tempInfo->iVersion) = KDefVersion; + else + *(tempInfo->iVersion) = *(version->iValue.s); + + // Append to arrayt + aWidgets.AppendL( tempInfo ); + + CleanupStack::PopAndDestroy( version ); + CleanupStack::Pop( tempInfo ); + } + + DLTRACEOUT(("")); + + } // --------------------------------------------------------------------------- // Gets the name of widget that was installed last @@ -2093,25 +2215,33 @@ { DLTRACEIN(("")); - RWidgetInfoArray widgets; + RExtendedWidgetInfoArray widgets; + PopulateInstalledWidgetsL(widgets); CleanupResetAndDestroyPushL( widgets ); - User::LeaveIfError( iWidgetRegistry.InstalledWidgetsL( widgets ) ); + DLINFO(("widget count: %d", widgets.Count() )); TUid uid( KNullUid ); const TInt count = widgets.Count(); - const TInt installedCount = iInstalledWidgets.Count(); + const TInt installedCount = iInstalledWidgetsInfos.Count(); // Try to find a widget that was not installed earlier. for ( TInt i = 0; i < count; ++i ) { TBool wasInstalled = EFalse; - CWidgetInfo* widgetInfo = widgets[ i ]; + CExtendedWidgetInfo * widgetInfo = widgets[ i ]; for ( TInt j = 0; j < installedCount; j++ ) { - if ( iInstalledWidgets[ j ]->iUid == widgetInfo->iUid ) + + TCatalogsVersion versionBefore, versionAfter; + TCatalogsVersion::ConvertL + ( versionBefore, *(iInstalledWidgetsInfos[ j ]->iVersion) ); + TCatalogsVersion::ConvertL( versionAfter, *(widgetInfo->iVersion) ); + + if ( iInstalledWidgetsInfos[ j ]->iUid == widgetInfo->iUid && + versionBefore >= versionAfter) { wasInstalled = ETrue; break; @@ -2203,3 +2333,114 @@ } return EFalse; } + +// --------------------------------------------------------------------------- +//Calling widget registry API to check if a widget with given uid is installed +//already +// --------------------------------------------------------------------------- +// +TBool CNcdInstallationService::WidgetExistsL( + const TUid& aUid, TCatalogsVersion& aVersion ) + { + DLTRACEIN(("")); + + if ( !iWidgetRegistry.Handle() ) + { + User::LeaveIfError( iWidgetRegistry.Connect() ); + } + + if ( iWidgetRegistry.IsWidget( aUid ) ) + { + TBuf id; + iWidgetRegistry.GetWidgetBundleId( aUid, id ); + if (iWidgetRegistry.WidgetExistsL( id )) + { + // Get version + CWidgetPropertyValue* version = + iWidgetRegistry.GetWidgetPropertyValueL(aUid, EBundleVersion ); + CleanupStack::PushL( version ); + TCatalogsVersion::ConvertL( aVersion, *(version->iValue.s) ); + CleanupStack::PopAndDestroy( version ); + return (ETrue); + } + else + { + return (EFalse); + } + } + else + return(EFalse); + + } + +// --------------------------------------------------------------------------- +// Calling widget registry API to check if a widget with given identifier is +// installed already +// --------------------------------------------------------------------------- +// +TBool CNcdInstallationService::WidgetExistsL + ( const TDesC& aIdentifier, TCatalogsVersion& aVersion ) + { + DLTRACEIN(("")); + + if ( !iWidgetRegistry.Handle() ) + { + User::LeaveIfError( iWidgetRegistry.Connect() ); + } + + RPointerArray widgetInfoArr; + + CleanupResetAndDestroyPushL( widgetInfoArr ); + TInt err = iWidgetRegistry.InstalledWidgetsL(widgetInfoArr); + + for( TInt i( widgetInfoArr.Count() - 1 ); i >= 0; --i ) + { + CWidgetInfo* widgetInfo( widgetInfoArr[i] ); + CWidgetPropertyValue* bundleId = + iWidgetRegistry.GetWidgetPropertyValueL + (widgetInfo->iUid, EBundleIdentifier ); + CleanupStack::PushL( bundleId ); + + if( aIdentifier.Compare( *(bundleId->iValue.s) )== 0 ) + { + CWidgetPropertyValue* version = + iWidgetRegistry.GetWidgetPropertyValueL + (widgetInfo->iUid, EBundleVersion ); + CleanupStack::PushL( version ); + TCatalogsVersion::ConvertL( aVersion, *(version->iValue.s) ); + + CleanupStack::PopAndDestroy( version ); + CleanupStack::PopAndDestroy( bundleId ); + CleanupStack::PopAndDestroy( &widgetInfoArr ); + + return ETrue; + } + CleanupStack::PopAndDestroy( bundleId ); + } + CleanupStack::PopAndDestroy( &widgetInfoArr ); + return EFalse; + } + +// --------------------------------------------------------------------------- +// Calling widget registry API to return the Uid of the widget +// with given identifier. +// --------------------------------------------------------------------------- +// +TUid CNcdInstallationService::WidgetUidL( const TDesC& aIdentifier) + { + DLTRACEIN(("")); + + TUid id = TUid::Uid(0); + + if ( !iWidgetRegistry.Handle() ) + { + User::LeaveIfError( iWidgetRegistry.Connect() ); + } + + id.iUid = iWidgetRegistry.GetWidgetUidL( aIdentifier); + + return id; + + } + + diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/inc/ncdinstallinfo.h --- a/ncdengine/provider/server/inc/ncdinstallinfo.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/inc/ncdinstallinfo.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -48,7 +48,12 @@ /** * Jar install with a JAD descriptor */ - ENcdInstallJad + ENcdInstallJad, + + /** + * Widget install + */ + ENcdInstallWidget }; diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/inc/ncdnodecontentinfoimpl.h --- a/ncdengine/provider/server/inc/ncdnodecontentinfoimpl.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/inc/ncdnodecontentinfoimpl.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -128,7 +128,15 @@ * @return The UID of the application item. */ const TUid& Uid() const; - + + /** + * This function is the indicative identifier for the + * contents that are widgets. This can be used e.g. for checking + * if the widget has already been installed to the phone. + * + * @return The Identifier of the application item. + */ + const TDesC& Identifier() const; /** * Different versions of the content items may exist. Thus, @@ -261,7 +269,8 @@ TUint iPurpose; HBufC* iMimeType; - TUid iUid; + TUid iUid; // UID is an identifier for sis + HBufC* iIdentifier; // a string identifier for widget HBufC* iVersion; TInt iSize; diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/inc/ncdproviderutils.h --- a/ncdengine/provider/server/inc/ncdproviderutils.h Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/inc/ncdproviderutils.h Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -111,8 +111,15 @@ */ static TNcdApplicationStatus IsApplicationInstalledL( const TUid& aUid, const TDesC& aVersion ); - + + // check if a widget with given identifier is installed already + static TNcdApplicationStatus IsWidgetInstalledL( + const TDesC& aIdentifier, const TDesC& aVersion ); + + // Calling widget registry API to return the Uid of the widget with given identifier + static TUid WidgetUidL( const TDesC& aIdentifier); + /** * Compares version number strings * diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/src/ncdinstalloperationimpl.cpp --- a/ncdengine/provider/server/src/ncdinstalloperationimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/src/ncdinstalloperationimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -444,6 +444,13 @@ installType = CNcdInstallInfo::ENcdInstallJad; } + // compare with widget mimetype. If matching, assign ENcdInstallWidget to install type + // The type value will be checked later when installing starts. + else if( downloadInfo->ContentMimeType().MatchF( KMimeTypeMatchWidget ) != KErrNotFound ) + { + purpose = ENcdItemPurposeApplication; + installType = CNcdInstallInfo::ENcdInstallWidget; + } DLTRACE(("Creating fileinfo")); // Create file info for proxy-side installer diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/src/ncdnodecontentinfoimpl.cpp --- a/ncdengine/provider/server/src/ncdnodecontentinfoimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/src/ncdnodecontentinfoimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -33,6 +33,8 @@ #include "ncdpurchasedetails.h" #include "catalogsdebug.h" +#include "catalogsconstants.h" + CNcdNodeContentInfo::CNcdNodeContentInfo( NcdNodeClassIds::TNcdNodeClassId aClassId ) : CNcdCommunicable(), @@ -44,7 +46,7 @@ { iMimeType = KNullDesC().AllocL(); iVersion = KNullDesC().AllocL(); - + iIdentifier = KNullDesC().AllocL(); } @@ -76,6 +78,9 @@ delete iVersion; iVersion = NULL; + + delete iIdentifier; + iIdentifier = NULL; DLTRACEOUT(("")); } @@ -100,6 +105,11 @@ return iUid; } +const TDesC& CNcdNodeContentInfo::Identifier() const + { + return *iIdentifier; + } + const TDesC& CNcdNodeContentInfo::Version() const { return *iVersion; @@ -134,7 +144,11 @@ iMimeType = NULL; iUid = TUid::Null(); - + + delete iIdentifier; + iIdentifier = NULL; + iIdentifier = KNullDesC().AllocL(); + delete iVersion; iVersion = NULL; @@ -194,22 +208,31 @@ iPurpose |= ENcdItemPurposeUnknown; } } - iMimeType = aData.DownloadableContent()->Mime().AllocL(); if ( iPurpose & ENcdItemPurposeApplication ) { - TInt uid = 0; - TRAPD( err, uid = DesHexToIntL( aData.DownloadableContent()->Id() ) ); - if( err != KErrNone ) + if ( iMimeType->Compare(KMimeTypeMatchSisx) == 0 ) { - DLERROR(( _L("DownloadableContent()->Id() was not valid hex, using ZERO: %S"), - &aData.DownloadableContent()->Id() )); - iUid.iUid = 0; + // sis package, convert the string to uid + TInt uid = 0; + TRAPD( err, uid = DesHexToIntL( aData.DownloadableContent()->Id() ) ); + if( err != KErrNone ) + { + DLERROR(( _L("DownloadableContent()->Id() was not valid hex, using ZERO: %S"), + &aData.DownloadableContent()->Id() )); + iUid.iUid = 0; + } + else + { + iUid.iUid = uid; + } } - else + + if ( iMimeType->Compare( KMimeTypeMatchWidget ) == 0 ) { - iUid.iUid = uid; + // widget, save identifier + iIdentifier = aData.DownloadableContent()->Id().AllocL(); } } @@ -230,7 +253,17 @@ aStream.WriteUint16L( iPurpose ); ExternalizeDesL( *iMimeType, aStream ); - aStream.WriteInt32L( iUid.iUid ); + + // The code here must be sync with the Internalization code in CNcdNodeContentInfoProxy + if ( iMimeType->Compare( KMimeTypeMatchWidget ) == 0 ) + { + ExternalizeDesL( *iIdentifier, aStream ); + } + else + { + aStream.WriteInt32L( iUid.iUid ); + } + ExternalizeDesL( *iVersion, aStream ); aStream.WriteInt32L( iSize ); @@ -255,7 +288,18 @@ iPurpose = aStream.ReadUint16L(); InternalizeDesL( iMimeType, aStream ); - iUid.iUid = aStream.ReadInt32L(); + + // This Internalize function is called when the node is loaded from cache. RReadStream is a sign of that. + // So same logic here also. Check mimetype and then decide to save uid or identifier. + if ( iMimeType->Compare( KMimeTypeMatchWidget ) == 0 ) + { + InternalizeDesL( iIdentifier, aStream ); + } + else + { + iUid.iUid = aStream.ReadInt32L(); + } + InternalizeDesL( iVersion, aStream ); iSize = aStream.ReadInt32L(); diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/src/ncdnodeinstallimpl.cpp --- a/ncdengine/provider/server/src/ncdnodeinstallimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/src/ncdnodeinstallimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -344,9 +344,11 @@ } - if ( iInstalledContent ) + // Identifier might be Null + if ( iInstalledContent && iInstalledContent->ApplicationUid() != TUid::Null() ) { - DASSERT( iInstalledContent->ApplicationUid() != TUid::Null() ); + + DASSERT( iInstalledContent->ApplicationUid() != TUid::Null() ); // Disable launching if protocol says so. // By default apps defined in content info are launchable @@ -542,7 +544,6 @@ return ETrue; } - // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- @@ -561,13 +562,26 @@ TRAPD( err, info = &iMetadata.ContentInfoL() ); TBool installed = EFalse; - if ( err == KErrNone && info->Uid() != TUid::Null() ) + + // Either UID or Identifier exists, we can continue here + if ( err == KErrNone && ( info->Uid() != TUid::Null()|| info->Identifier().Length() != 0 ) ) { - DLINFO(("Uid: %x", info->Uid().iUid )); - TNcdApplicationStatus status = - CNcdProviderUtils::IsApplicationInstalledL( - info->Uid(), - info->Version() ); + TNcdApplicationStatus status = ENcdApplicationNotInstalled; + + if (info->MimeType().Compare( KMimeTypeMatchWidget ) == 0 && info->Identifier().Length() != 0 ) + { + status = CNcdProviderUtils::IsWidgetInstalledL( + info->Identifier(), + info->Version() ); + } + else if ( info->Uid() != TUid::Null() ) + { + DLINFO(("Uid: %x", info->Uid().iUid )); + status = + CNcdProviderUtils::IsApplicationInstalledL( + info->Uid(), + info->Version() ); + } // Application can be older version for it to be considered installed // Upgrade will be available for the user @@ -578,35 +592,43 @@ iInstalled = installed; iLaunchable = installed; - + if ( installed ) { DLTRACE(("Application installed")); CNcdExtendedInstallInfo* install = CNcdExtendedInstallInfo::NewLC(); - install->SetApplicationUid( info->Uid() ); + + if (info->MimeType().Compare( KMimeTypeMatchWidget ) == 0 ) + { + install->SetApplicationUid(CNcdProviderUtils::WidgetUidL(info->Identifier())); + } + else + { + install->SetApplicationUid( info->Uid() ); + } - // This ensures that CNcdInstalledApplication actually checks the - // application's version number when it checks if it's installed - // or not - install->SetUriExists( ETrue ); + // This ensures that CNcdInstalledApplication actually checks the + // application's version number when it checks if it's installed + // or not + install->SetUriExists( ETrue ); - // This will be used to determine whether the app is actually installed - // or not - install->SetApplicationVersionL( info->Version() ); - install->SetLaunchable( ETrue ); - - // don't set because it can mess upgrade handling in - // CNcdNodeMetadata::HandleContentUpgradeL - iContentVersion = TCatalogsVersion(); + // This will be used to determine whether the app is actually installed + // or not + install->SetApplicationVersionL( info->Version() ); + install->SetLaunchable( ETrue ); - iInstalledContent = install; - CleanupStack::Pop( install ); + // don't set because it can mess upgrade handling in + // CNcdNodeMetadata::HandleContentUpgradeL + iContentVersion = TCatalogsVersion(); + + iInstalledContent = install; + CleanupStack::Pop( install ); + } + } - } return installed; } - // --------------------------------------------------------------------------- // Content version getter // --------------------------------------------------------------------------- diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/src/ncdnodemetadataimpl.cpp --- a/ncdengine/provider/server/src/ncdnodemetadataimpl.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/src/ncdnodemetadataimpl.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -882,7 +882,9 @@ void CNcdNodeMetaData::InternalizeInstallFromContentInfoL() { DLTRACEIN(("")); - if ( iContentInfo && iContentInfo->Uid() != TUid::Null() ) + + // continue either UID or identifier exists. + if ( iContentInfo && (iContentInfo->Uid() != TUid::Null() || iContentInfo->Identifier().Length() != 0 ) ) { TBool create = !iInstall; if ( create ) @@ -1002,12 +1004,25 @@ DLTRACE(("Creating upgrade")); iUpgrade = CNcdNodeUpgrade::NewL( *this ); } - - // content is an upgrade - iUpgrade->SetContentUpgradesL( - ETrue, - iContentInfo->Uid(), - iContentInfo->Version() ); + + if ((iContentInfo->Uid() == KNullUid) && + (iContentInfo->MimeType().Compare( KMimeTypeMatchWidget ) == 0 )) + { + // Get widget Uid + iUpgrade->SetContentUpgradesL( + ETrue, + CNcdProviderUtils::WidgetUidL(iContentInfo->Identifier()), + iContentInfo->Version() ); + } + else + { + // content is an application upgrade + iUpgrade->SetContentUpgradesL( + ETrue, + iContentInfo->Uid(), + iContentInfo->Version() ); + } + return ETrue; } } @@ -1045,6 +1060,38 @@ return ETrue; } } + // Widget? + else if (iContentInfo->Identifier() != KNullDesC) + { + TNcdApplicationStatus contentVersion( + ENcdApplicationNotInstalled ); + + TRAPD( err, + contentVersion = CNcdProviderUtils::IsWidgetInstalledL( + iContentInfo->Identifier(), + iContentInfo->Version() ) ); + + // Ignore errors in version conversion + LeaveIfNotErrorL( err, KErrArgument, KErrGeneral ); + + if ( contentVersion == ENcdApplicationOlderVersionInstalled ) + { + if ( !iUpgrade ) + { + DLTRACE(("Creating upgrade")); + iUpgrade = CNcdNodeUpgrade::NewL( *this ); + } + + // Set upgrade data which will be available through the API + iUpgrade->SetContentUpgradesL( + ETrue, + CNcdProviderUtils::WidgetUidL(iContentInfo->Identifier()), + iContentInfo->Version() ); + + DLTRACEOUT(("Content upgrades")); + return ETrue; + } + } } if ( iUpgrade ) diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/provider/server/src/ncdproviderutils.cpp --- a/ncdengine/provider/server/src/ncdproviderutils.cpp Fri Feb 19 22:57:02 2010 +0200 +++ b/ncdengine/provider/server/src/ncdproviderutils.cpp Fri Mar 12 15:43:14 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2006-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" @@ -279,8 +279,30 @@ return InstallationServiceL().IsApplicationInstalledL( aUid, version ); } +// --------------------------------------------------------------------------- +// Checks if the widget with the given identifier is installed +// call CNcdInstallationService in deviceinteraction dll +// --------------------------------------------------------------------------- +// +TNcdApplicationStatus CNcdProviderUtils::IsWidgetInstalledL( + const TDesC& aIdentifier, const TDesC& aVersion ) + { + TCatalogsVersion version; + TRAPD( err, TCatalogsVersion::ConvertL( version, aVersion ) ); + LeaveIfNotErrorL( err, KErrArgument, KErrGeneral ); + + return InstallationServiceL().IsWidgetInstalledL( aIdentifier, version ); + } // --------------------------------------------------------------------------- +// Calling widget registry API to return the Uid of the widget with given ident +// --------------------------------------------------------------------------- +// +TUid CNcdProviderUtils::WidgetUidL( const TDesC& aIdentifier) + { + return InstallationServiceL().WidgetUidL( aIdentifier ); + } +// --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- // diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/rom/altair-engine-stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/rom/altair-engine-stub.pkg Fri Mar 12 15:43:14 2010 +0200 @@ -0,0 +1,85 @@ +; +; Copyright (c) 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: +; +;;***************************************************************************** +;; +;; NCD Altair Catalogs PKG, engine +;; PKG for creating ROM sis stub +;; +;;***************************************************************************** + +;Language - standard language definitions +&EN + +; standard SIS file header; +#{"Altair Engine"},(0x20019119),9,2,1006,TYPE=SA + + +;Localised Vendor name +%{"Nokia"} + +;Unique Vendor name +:"Nokia" + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Backup & restore +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; Backup & restore file for the engine side +"" - "z:\private\20019119\backup_registration.xml" + +;;***************************************************************************** +;; Server +;;***************************************************************************** + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Engine config +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +"" - "z:\private\20019119\config.xml" + +;; Client side dll +"" + -"z:\sys\bin\ncdengine_20019119.dll" + +;; Server exe +"" + -"z:\sys\bin\ncdserver_20019119.exe" + +;; Utils dll +"" + -"z:\sys\bin\ncdutils_20019119.dll" + +;; Device management dll +"" + -"z:\sys\bin\ncddevicemgmt_20019119.dll" + +;; Debug util dll +"" + -"z:\sys\bin\ncddebug_20019119.dll" + +;; Undertaker utility +"" + -"z:\sys\bin\ncdundertaker_20019119.exe" + +;; ECOM dll+rss +;; NEW NAMING to match the IBYs. Must be same on the stub sis +;; and the IBY to allow eclipsing. +"" + -"z:\sys\bin\ncdproxy_20019119.dll" +"" + -"z:\resource\plugins\ncdproxy_20019119.rsc" + + diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/rom/altair-engine-stub.sis Binary file ncdengine/rom/altair-engine-stub.sis has changed diff -r 51c0f5edf5ef -r 3ba40be8e484 ncdengine/rom/make_romstub.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ncdengine/rom/make_romstub.bat Fri Mar 12 15:43:14 2010 +0200 @@ -0,0 +1,1 @@ +makesis -s altair-engine-stub.pkg altair-engine-stub.sis