ncdengine/provider/deviceinteraction/src/ncdinstallationserviceimpl.cpp
branchRCL_3
changeset 66 8b7f4e561641
parent 65 7333d7932ef7
child 70 e8965914fac7
--- a/ncdengine/provider/deviceinteraction/src/ncdinstallationserviceimpl.cpp	Tue Aug 31 15:21:33 2010 +0300
+++ b/ncdengine/provider/deviceinteraction/src/ncdinstallationserviceimpl.cpp	Wed Sep 01 12:22:02 2010 +0100
@@ -32,6 +32,16 @@
 #include <e32property.h>
 #include <sacls.h>
 
+#ifdef USE_OLD_JAVA_API
+    #include <mjavaregistry.h>
+    #include <swi/minstalledappsregistry.h>
+#else
+    #include <javaregistry.h>
+    #include <javaregistrypackageentry.h>
+
+    using namespace Java;
+#endif
+
 #include "ncdinstallationserviceobserver.h"
 #include "ncdactiveoperationobserver.h"
 #include "ncdsilentinstallactiveobserver.h"
@@ -45,7 +55,21 @@
 
 const TUint KFileOpenFlags = EFileShareReadersOrWriters;
 
-//const TInt KWidgetBundleIdLength = KMaxFileName + 1; 
+#ifdef __SERIES60_31__
+
+    const TInt32 KPSUidJavaLatestInstallation = KUidJmiLatestInstallation;
+
+#else
+
+    // Defined originally in /mw/java/inc/javauids.h
+    // This should become available at some point in javadomainpskeys.h
+    //const TInt32 KPSUidJavaLatestInstallation = 0x10282567;
+    #include <javadomainpskeys.h>
+
+#endif
+
+// length taken from WidgetRegistryData.h
+const TInt KWidgetBundleIdLength = KWidgetRegistryVal + 1;    
 
 // ======== CALLBACK FUNCTION ========
  
@@ -107,13 +131,10 @@
     delete iInstallationCompleteCallback;
     delete iJadFileName;
     delete iRecognizedMime;
-    
-    delete iResults;
-    delete iArguments;
-    
+#ifdef USE_OLD_JAVA_API    
+    iMIDletUids.Close();
+#endif    
     iApaLs.Close();
-    
-    
     if( iThemes )
         {
         iThemes->ResetAndDestroy();
@@ -124,7 +145,17 @@
     CancelInstall(); 
     iRomUids.Close();
     
-    iScrSession.Close();
+    if ( iWidgetRegistry.Handle() )
+        {
+        // decreases widget server's refcount but this cannot be called
+        // if Connect has not been called or we'll get a KERN-EXEC 0
+        iWidgetRegistry.Disconnect();
+        }
+    else
+        {
+        iWidgetRegistry.Close();
+        }
+    iInstalledWidgets.ResetAndDestroy();
     iInstalledWidgetsInfos.ResetAndDestroy();
     }
 
@@ -143,18 +174,13 @@
 void CNcdInstallationService::ConstructL()
     {
     DLTRACEIN((""));
-    
-    iResults = 0;
-    iArguments = 0;
-    
     iDocHandler = CDocumentHandler::NewL();
     iDocHandler->SetExitObserver( this );
     
     User::LeaveIfError( iFs.Connect() );
     User::LeaveIfError( iFs.ShareProtected() );
     User::LeaveIfError( iRegistrySession.Connect() );
-    User::LeaveIfError( iAknsSrv.Connect() );
-    User::LeaveIfError( iScrSession.Connect());
+    User::LeaveIfError( iAknsSrv.Connect() ); 
 
     iInstallationCompleteCallback = new(ELeave) CAsyncCallBack( 
         TCallBack( InstallationCompleteCallback, this ),
@@ -233,7 +259,7 @@
 void CNcdInstallationService::SilentInstallL( RFile& aFile,
                                         const TDesC& aMimeType,
                                         const TNcdItemPurpose& aPurpose,
-                                        const Usif::COpaqueNamedParams* aInstallOptionsPckg )
+                                        const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg )
     {
     DLTRACEIN((""));
 
@@ -243,7 +269,7 @@
         iSilentInstallActiveObserver = CNcdSilentInstallActiveObserver::NewL( *this );        
         }
 
-    InstallL( aFile, aMimeType, aPurpose, aInstallOptionsPckg );
+    InstallL( aFile, aMimeType, aPurpose, &aInstallOptionsPckg );
 
     DLTRACEOUT(("")); 
     }
@@ -256,7 +282,7 @@
 void CNcdInstallationService::SilentInstallJavaL( RFile& aFile,
                                             const TDesC& aMimeType,
                                             const TDesC8& aDescriptorData,
-                                            const Usif::COpaqueNamedParams* aInstallOptionsPckg )
+                                            const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg )
     {
     DLTRACEIN((""));
 
@@ -266,7 +292,7 @@
         iSilentInstallActiveObserver = CNcdSilentInstallActiveObserver::NewL( *this );        
         }
 
-    InstallJavaL( aFile, aMimeType, aDescriptorData, aInstallOptionsPckg );
+    InstallJavaL( aFile, aMimeType, aDescriptorData, &aInstallOptionsPckg );
 
     DLTRACEOUT((""));
     }
@@ -276,7 +302,7 @@
 // ---------------------------------------------------------------------------
 //
 void CNcdInstallationService::SilentInstallWidgetL( RFile& aFile,
-                                                    const Usif::COpaqueNamedParams* aInstallOptionsPckg )
+                                                    const SwiUI::TInstallOptionsPckg& aInstallOptionsPckg )
     {
     DLTRACEIN((""));
     
@@ -286,7 +312,7 @@
         iSilentInstallActiveObserver = CNcdSilentInstallActiveObserver::NewL( *this );        
         }
 
-    InstallWidgetL( aFile, aInstallOptionsPckg );
+    InstallWidgetL( aFile, &aInstallOptionsPckg );
     
     DLTRACEOUT((""));
     }
@@ -349,6 +375,11 @@
             iJadFileName = NULL;
             }
         
+#ifdef USE_OLD_JAVA_API        
+        // Clean the array.
+        iMIDletUids.Reset();
+#endif        
+
         // Reset information flags.            
         InstallationFinishedSetup( aError );
         }
@@ -479,54 +510,47 @@
 //
 // ---------------------------------------------------------------------------
 //
+#ifdef USE_OLD_JAVA_API
 
 TBool CNcdInstallationService::JavaAppExistsL( 
     const TUid& aUid )
     {
     DLTRACEIN((""));
 
-    TBool retVal = EFalse;
-    Usif::TComponentId compId = 0;
-        
-    // Get component id
-    TRAPD( ret, compId = iScrSession.GetComponentIdForAppL( aUid ) ); 
-    if ( ret == KErrNotFound )
-        {
-        return EFalse;
-        }
-    else if  (ret != KErrNone )
-        {
-        User::Leave( ret );
-        }
-         
-    Usif::CComponentEntry* entry = Usif::CComponentEntry::NewLC();
-    TRAPD(err, iScrSession.GetComponentL(compId, *entry));
+    MJavaRegistry* javaRegistry = MJavaRegistry::CreateL();
+    CleanupReleasePushL( *javaRegistry );
     
-    if ( err == KErrNotFound )
+    TRAPD( err, 
         {
-        retVal = EFalse;
-        }
-    else if  (err != KErrNone )
-        {
-        User::Leave( err );
-        }
-    else
-        {
-        // type == Java ?
-        if ( entry->SoftwareType().Compare( Usif::KSoftwareTypeJava ) == 0 )
-            {
-            retVal = ETrue;
-            }
-        else
-            {
-            retVal = EFalse;
-            }
-        }
-    CleanupStack::PopAndDestroy(entry);
-    return retVal;
+        // Leaves with KErrNotFound if not found
+        MJavaRegistryMIDletEntry* midletEntry = javaRegistry->MIDletEntryL(
+            aUid );    
+        midletEntry->Release();
+        });
+    
+    LeaveIfNotErrorL( err, KErrNotFound );
     
+    CleanupStack::PopAndDestroy( javaRegistry );
+    return err == KErrNone;
     }
 
+#else
+
+TBool CNcdInstallationService::JavaAppExistsL( 
+    const TUid& aUid )
+    {
+    DLTRACEIN((""));
+
+    CJavaRegistry* javaRegistry = CJavaRegistry::NewLC();    
+
+    TBool exists = javaRegistry->RegistryEntryExistsL( aUid );
+    
+    CleanupStack::PopAndDestroy( javaRegistry );
+    return exists;
+    }
+
+#endif
+
 // Check via widget registry API
 TNcdApplicationStatus CNcdInstallationService::IsWidgetInstalledL(const TDesC& aIdentifier, const TCatalogsVersion& aVersion)
     {
@@ -900,7 +924,7 @@
     
     iInstaller.Close();
     
-    if ( aError == KErrCancel ) 
+    if ( aError == SwiUI::KSWInstErrUserCancel ) 
         {
         DLTRACE(("User cancelled, converting error to KErrAbort" ) );
         aError = KErrAbort;        
@@ -949,7 +973,9 @@
         if ( iInstallError != KErrNone ) 
             {        
             DLTRACE(("Notify install error"));
-
+#ifdef USE_OLD_JAVA_API            
+            iMIDletUids.Reset();
+#endif            
             iObserver->InstallationCompleteL( KNullDesC, TUid(), iInstallError );       
             return; 
             }
@@ -1289,7 +1315,7 @@
 void CNcdInstallationService::InstallL( RFile& aFile,
                                         const TDesC& aMimeType,
                                         const TNcdItemPurpose& aPurpose,
-                                        const Usif::COpaqueNamedParams* aSilentInstallOptions )
+                                        const SwiUI::TInstallOptionsPckg* aSilentInstallOptionsPckg )
     {
     DLTRACEIN(( _L("iBusy=%d, MIME: %S"),iBusy, &aMimeType ));    
     DASSERT( iObserver );
@@ -1335,7 +1361,7 @@
             aFile, 
             *iRecognizedMime, 
             KNullDesC8, 
-            aSilentInstallOptions );
+            aSilentInstallOptionsPckg );
         return;
         }
     else if ( MatchWidget( aFile, aMimeType ) )
@@ -1343,7 +1369,7 @@
         DLTRACE(("Widget"));
         InstallWidgetL( 
             aFile,
-            aSilentInstallOptions );
+            aSilentInstallOptionsPckg );
         return;
         }
     
@@ -1385,25 +1411,13 @@
         // Start application installation.
         DLINFO(( "Calling doc handler Open" ));
 
-        if ( !aSilentInstallOptions )
+        if ( !aSilentInstallOptionsPckg )
             {
             DLINFO(("Normal install"));
             InitializeInstallerL();
-            //iCancelCode = SwiUI::ERequestInstallHandle;
+            iCancelCode = SwiUI::ERequestInstallHandle;
             
-            if ( !iArguments )
-                {
-                iArguments = Usif::COpaqueNamedParams::NewL();
-                }
-            if ( !iResults )
-               {
-               iResults = Usif::COpaqueNamedParams::NewL();
-               }
-            
-            iArguments->AddIntL( Usif::KSifInParam_InstallSilently, EFalse );
-            
-            iInstaller.Install( aFile, *iArguments, *iResults, iInstallStatusObserver->iStatus ); 
-            //iInstaller.Install( iInstallStatusObserver->iStatus, aFile );
+            iInstaller.Install( iInstallStatusObserver->iStatus, aFile );
             iInstallStatusObserver->StartToObserve();            
             }
         else
@@ -1413,7 +1427,7 @@
             // of the silent install and it will forward the information for the callback
             // function of this class object.
             iSilentInstallActiveObserver->StartToObserveL( aFile,
-                                                           aSilentInstallOptions );
+                                                           *aSilentInstallOptionsPckg );
             }
             
         iBusy = ETrue;
@@ -1484,7 +1498,7 @@
 void CNcdInstallationService::InstallJavaL( RFile& aFile,
                                             const TDesC& /*aMimeType*/,
                                             const TDesC8& aDescriptorData,
-                                            const Usif::COpaqueNamedParams* aSilentInstallOptions )
+                                            const SwiUI::TInstallOptionsPckg* aSilentInstallOptionsPckg )
     {
     DLTRACEIN((_L("iBusy=%d, descriptor=%d"),iBusy, aDescriptorData.Length() ));
     DASSERT( iObserver );
@@ -1498,6 +1512,15 @@
 
     iInstallError = KErrNone;
     
+#ifdef USE_OLD_JAVA_API
+    // Store installed java app uids before installation to see
+    // which one is a new java app later.
+    MJavaRegistry* javaRegistry = MJavaRegistry::CreateL();
+    CleanupReleasePushL( *javaRegistry );
+    iMIDletUids.Reset();
+    javaRegistry->InstalledMIDletUidsL( iMIDletUids );
+    CleanupStack::PopAndDestroy( javaRegistry );
+#endif
     
     // In platform security systems JAR and JAD has to be in same folder
     // to get the installation process work correctly.
@@ -1519,7 +1542,7 @@
     iInstallType = EJavaInstall;
     TDataType dataType;    
             
-    if ( aSilentInstallOptions == NULL )
+    if ( aSilentInstallOptionsPckg == NULL )
         {
         DLINFO(("Normal install"));
         InitializeInstallerL();
@@ -1527,40 +1550,15 @@
             {
             DLTRACE(("Installing JAD+JAR"));
             // JAD+JAR install
-            //iCancelCode = SwiUI::ERequestInstall;
-            if ( !iArguments )
-                {
-                iArguments = Usif::COpaqueNamedParams::NewL();
-                }
-            if ( !iResults )
-                {
-                iResults = Usif::COpaqueNamedParams::NewL();
-                }
-             
-             iArguments->AddIntL( Usif::KSifInParam_InstallSilently, EFalse );
-                        
-            iInstaller.Install( *iJadFileName, *iArguments, *iResults, iInstallStatusObserver->iStatus ); 
-            //iInstaller.Install( iInstallStatusObserver->iStatus, *iJadFileName );
+            iCancelCode = SwiUI::ERequestInstall;
+            iInstaller.Install( iInstallStatusObserver->iStatus, *iJadFileName );
             }
         else
             {
             DLTRACE(("Installing JAR"));
             // JAR install
-            //iCancelCode = SwiUI::ERequestInstallHandle;
-            if ( !iArguments )
-                {
-                iArguments = Usif::COpaqueNamedParams::NewL();
-                }
-            if ( !iResults )
-               {
-               iResults = Usif::COpaqueNamedParams::NewL();
-               }
-            
-             iArguments->AddIntL( Usif::KSifInParam_InstallSilently, EFalse );
-             
-             iInstaller.Install( aFile, *iArguments, *iResults, iInstallStatusObserver->iStatus ); 
-            
-            //iInstaller.Install( iInstallStatusObserver->iStatus, aFile );
+            iCancelCode = SwiUI::ERequestInstallHandle;
+            iInstaller.Install( iInstallStatusObserver->iStatus, aFile );
             }
         
         iInstallStatusObserver->StartToObserve();
@@ -1576,7 +1574,7 @@
             // of the silent install and it will forward the information for the callback
             // function of this class object.
             iSilentInstallActiveObserver->StartToObserveL( *iJadFileName,
-                                                           aSilentInstallOptions );
+                                                           *aSilentInstallOptionsPckg );
             }
         else
             {
@@ -1586,7 +1584,7 @@
             // of the silent install and it will forward the information for the callback
             // function of this class object.
             iSilentInstallActiveObserver->StartToObserveL( aFile,
-                                                           aSilentInstallOptions );
+                                                           *aSilentInstallOptionsPckg );
             }        
         }
 
@@ -1602,7 +1600,7 @@
 //
 void CNcdInstallationService::InstallWidgetL( 
     RFile& aFile,
-    const Usif::COpaqueNamedParams* aSilentInstallOptions )
+    const SwiUI::TInstallOptionsPckg* aSilentInstallOptionsPckg )
     {
     DLTRACEIN((""));    
     
@@ -1616,24 +1614,13 @@
     // Start application installation.
     DLINFO(( "Calling doc handler Open" ));
 
-    if ( !aSilentInstallOptions )
+    if ( !aSilentInstallOptionsPckg )
         {
         DLINFO(("Normal install"));
         InitializeInstallerL();
-        //iCancelCode = SwiUI::ERequestInstallHandle;
-        if ( !iArguments )
-            {
-            iArguments = Usif::COpaqueNamedParams::NewL();
-            }
-        if ( !iResults )
-           {
-           iResults = Usif::COpaqueNamedParams::NewL();
-           }
-                    
-        iArguments->AddIntL( Usif::KSifInParam_InstallSilently, EFalse );
-        iInstaller.Install(aFile, *iArguments, *iResults, iInstallStatusObserver->iStatus  );
-         
-        //iInstaller.Install( iInstallStatusObserver->iStatus, aFile );
+        iCancelCode = SwiUI::ERequestInstallHandle;
+        
+        iInstaller.Install( iInstallStatusObserver->iStatus, aFile );
         iInstallStatusObserver->StartToObserve();            
         }
     else
@@ -1643,7 +1630,7 @@
         // of the silent install and it will forward the information for the callback
         // function of this class object.
         iSilentInstallActiveObserver->StartToObserveL( aFile,
-                                                       aSilentInstallOptions );
+                                                       *aSilentInstallOptionsPckg );
         }
         
     iBusy = ETrue;
@@ -1660,13 +1647,10 @@
     DeletePtr( iInstallStatusObserver );
     iInstallStatusObserver = CNcdActiveOperationObserver::NewL( *this );
     
-    User::LeaveIfError( iInstaller.Connect() );
-    /*
     if ( !iInstaller.Handle() ) 
         {
         User::LeaveIfError( iInstaller.Connect() );
         }
-    */
     }
     
 
@@ -1677,13 +1661,11 @@
 void CNcdInstallationService::CancelInstall()
     {
     DLTRACEIN((""));
-    //if ( iInstallStatusObserver &&
-    //     iInstaller.Handle() ) 
-    if ( iInstallStatusObserver )
+    if ( iInstallStatusObserver &&
+         iInstaller.Handle() ) 
         {
         DLTRACE(("Cancelling installation"));
-        iInstaller.CancelOperation();
-        //iInstaller.CancelAsyncRequest( iCancelCode );
+        iInstaller.CancelAsyncRequest( iCancelCode );
         }
     
     DeletePtr( iInstallStatusObserver );
@@ -1840,7 +1822,7 @@
     {
     DLTRACEIN((""));
         
-/*    TApaAppInfo info;
+    TApaAppInfo info;
     ConnectApaLsL();    
     User::LeaveIfError( iApaLs.GetAllApps() );
     
@@ -1868,8 +1850,7 @@
         {       
         appErr = iApaLs.GetNextApp( info );
         if ( appErr == KErrNone )
-            {
-            DLTRACE(("After GetNextApp"));
+            {            
             // App is considered a ROM app if its not found either
             // in SIS registry or midlet registry
             // Note: ROM apps can be in SIS registry also but that doesn't
@@ -1912,7 +1893,7 @@
     while( appErr == KErrNone && retryCount >= 0 );
         
     iApaLs.Close();
-    CleanupStack::PopAndDestroy( &midletUids );*/    
+    CleanupStack::PopAndDestroy( &midletUids );    
     
     DLTRACEOUT(("ROM apps: %d", iRomUids.Count() ));
     }
@@ -1922,39 +1903,30 @@
 // Gets a list of installed midlet UIDs
 // ---------------------------------------------------------------------------
 //
+#ifdef USE_OLD_JAVA_API
 
 void CNcdInstallationService::MidletUidsL( RArray<TUid>& aUids )
     {
+    DLTRACEIN((""));
+    MJavaRegistry* javaRegistry = MJavaRegistry::CreateL();
+    CleanupReleasePushL( *javaRegistry );
+    javaRegistry->InstalledMIDletUidsL( aUids );
+    CleanupStack::PopAndDestroy( javaRegistry );    
+    }
 
-    // Get ids of all java components in scr
-    RArray<Usif::TComponentId> javaComponentIdList;
-    CleanupClosePushL( javaComponentIdList );
-    
-    Usif::CComponentFilter *pJavaSwTypeFilter = Usif::CComponentFilter::NewLC();
-    pJavaSwTypeFilter->SetSoftwareTypeL( Usif::KSoftwareTypeJava );
-    iScrSession.GetComponentIdsL( javaComponentIdList, pJavaSwTypeFilter );
-    CleanupStack::PopAndDestroy( pJavaSwTypeFilter );
+#else
 
-    
-    // Get components
-    TInt aUidIndex = 0;
-    for ( TInt i = 0; i < javaComponentIdList.Count(); ++i )
-        {
-        RArray<TUid> midletUids;
-        CleanupClosePushL( midletUids );
-        iScrSession.GetAppUidsForComponentL( javaComponentIdList[i], midletUids );
-        for ( TInt j = 0; j < midletUids.Count(); ++j )
-            {
-            aUids[aUidIndex] = aUids[j];
-            aUidIndex++;
-            }
-        CleanupStack::PopAndDestroy(); // midletUids
-        }
-    
-    CleanupStack::PopAndDestroy(); // javaComponentIdList
-    
+void CNcdInstallationService::MidletUidsL( RArray<TUid>& aUids )
+    {
+    DLTRACEIN((""));
+    CJavaRegistry* javaRegistry = CJavaRegistry::NewLC();
+    javaRegistry->GetRegistryEntryUidsL( aUids );          
+    CleanupStack::PopAndDestroy( javaRegistry );    
     }
 
+#endif
+
+
 // ---------------------------------------------------------------------------
 // Checks if the application is in ROM
 // ---------------------------------------------------------------------------
@@ -1965,6 +1937,122 @@
     return iRomUids.Find( aUid ) != KErrNotFound;    
     }
 
+
+// ---------------------------------------------------------------------------
+// Returns the UID of the latest installed midlet, NULL UID if none have
+// been installed since the last device restart
+// ---------------------------------------------------------------------------
+//
+#ifdef USE_OLD_JAVA_API
+
+TUid CNcdInstallationService::LatestMidletUidL( 
+    MJavaRegistry& aJavaRegistry ) const
+    {
+    DLTRACEIN((""));
+    TInt suiteUid = 0;            
+    
+    // Get UID for the latest installed Midlet suite
+    // KPSUidJavaLatestInstallation = 0x10282567
+    // Ignoring error in case the key or read policy change so that client
+    // doesn't behave strangely
+    RProperty::Get( KUidSystemCategory, 
+        KPSUidJavaLatestInstallation, suiteUid );
+    
+    DLTRACE(("JMI UID: %x", suiteUid ));
+
+    if ( !suiteUid )  
+        {
+        return KNullUid;
+        }
+    
+    // Get entry for the installed suite
+    MJavaRegistrySuiteEntry* suite = aJavaRegistry.SuiteEntryL( 
+        TUid::Uid( suiteUid ) );
+    CleanupReleasePushL( *suite );        
+    RArray<TUid> suiteUids;
+    CleanupClosePushL( suiteUids );
+
+    TUid midletUid = KNullUid; 
+    suite->MIDletUidsL( suiteUids );
+    
+    // Take first midlet UID from the suite
+    if ( suiteUids.Count() ) 
+        {
+        midletUid = suiteUids[0];
+        }
+    DLTRACE(("Midlets in suite: %d", suite->NumberOfMIDletsL() ));
+    CleanupStack::PopAndDestroy( &suiteUids );
+    DLTRACE(("InstalledAppsEntryUid: %x", midletUid.iUid ));
+
+    CleanupStack::PopAndDestroy( suite );    
+    return midletUid;
+    }
+
+#else
+
+TUid CNcdInstallationService::LatestMidletUidL( 
+    CJavaRegistry& aJavaRegistry ) const
+    {
+    DLTRACEIN((""));
+    TInt suiteUid = 0;            
+    
+    // Get UID for the latest installed Midlet suite
+    // KPSUidJavaLatestInstallation = 0x10282567
+    // Ignoring error in case the key or read policy change so that client
+    // doesn't behave strangely
+    RProperty::Get( KUidSystemCategory, 
+        KPSUidJavaLatestInstallation, suiteUid );
+    
+    DLTRACE(("JMI UID: %x", suiteUid ));
+
+    if ( !suiteUid )  
+        {
+        return KNullUid;
+        }
+    
+    // Get entry for the installed suite
+    CJavaRegistryEntry* suite = aJavaRegistry.RegistryEntryL( 
+        TUid::Uid( suiteUid ) );
+    
+    if ( !suite )
+        {
+        return KNullUid;
+        }
+    
+    CleanupStack::PushL( suite );        
+    
+    DASSERT( suite->Type() < EGeneralApplication && 
+             suite->Type() >= EGeneralPackage );
+    
+    CJavaRegistryPackageEntry* entry = 
+        static_cast<CJavaRegistryPackageEntry*>( suite );
+    
+    TUid midletUid = KNullUid;
+    TInt count = entry->NumberOfEmbeddedEntries(); 
+    TBool appFound = EFalse;
+    TInt index = 0;
+    
+    // Find the first application from the suite
+    while ( index < count && !appFound )
+        {
+        CJavaRegistryEntry* app = entry->EmbeddedEntryByNumberL( index );
+        if ( app->Type() >= EGeneralApplication ) 
+            {
+            midletUid = app->Uid();
+            appFound = ETrue;
+            DLTRACE(( "Found app: %x", midletUid.iUid ));
+            }
+        delete app;
+        ++index;
+        }
+    
+    CleanupStack::PopAndDestroy( suite );    
+    return midletUid;
+    }
+
+
+#endif
+
 // ---------------------------------------------------------------------------
 // Returns true if the MIME type matches a Java application or descriptor
 // ---------------------------------------------------------------------------
@@ -1977,35 +2065,75 @@
     }
 
 
-
+#ifdef USE_OLD_JAVA_API
 
 TUid CNcdInstallationService::InstalledMidletUidL()
     {
-
-    //Usif::COpaqueNamedParams* iResults = 0; // to be removed
+    DLTRACEIN((""));
+    RArray<TUid> MIDletUids;
+    CleanupClosePushL( MIDletUids );
     
-    RArray<TUid> appUids;
-    TUid midletUid = KNullUid;
-    TInt compId = 0;
-    
-    // Get component id
-    TRAPD ( err, iResults->IntByNameL( Usif::KSifOutParam_ComponentId ));
-    if ( err == KErrNotFound )
+    MJavaRegistry* javaRegistry = MJavaRegistry::CreateL();
+    CleanupReleasePushL( *javaRegistry );
+    javaRegistry->InstalledMIDletUidsL( MIDletUids );
+    TUid MIDletUid = KNullUid;
+    // Search for new uids in Java registry.
+    for ( TInt i = 0 ; i < MIDletUids.Count() ; i++ )
         {
-        return midletUid;
+        if ( iMIDletUids.Find( MIDletUids[i] ) == KErrNotFound )
+            {
+            // A new uid found, this is the installed midlet's uid
+            MIDletUid = MIDletUids[i];
+            break;
+            }
+        }
+
+    // We didn't get any new UID so we have to check Java installer's
+    // P&S key for the installed suite UID and the get the midlet UID
+    // from that. This happens when a midlet with predefined UID, 
+    // eg. WidSets, is reinstalled. Midlet UIDs are predefined with
+    // the attribute Nokia-MIDlet-UID-<n> in a JAD or JAR manifest
+    if ( MIDletUid == KNullUid ) 
+        {
+        MIDletUid = LatestMidletUidL( *javaRegistry );
         }
     
-    // Get components
-    CleanupClosePushL( appUids );
-    iScrSession.GetAppUidsForComponentL( compId, appUids );
+    CleanupStack::PopAndDestroy( javaRegistry );
+    CleanupStack::PopAndDestroy( &MIDletUids );
+
+    iMIDletUids.Reset();
+    return MIDletUid;
+    }
+
+#else // USE_OLD_JAVA_API
+
+TUid CNcdInstallationService::InstalledMidletUidL()
+    {
+    DLTRACEIN((""));
+    CJavaRegistry* registry = CJavaRegistry::NewLC();
+    TUid midletUid = LatestMidletUidL( *registry );
+    CleanupStack::PopAndDestroy( registry );
+    return midletUid;
+    }
+
+#endif // USE_OLD_JAVA_API
+
+
+// ---------------------------------------------------------------------------
+// Populates the list of installed widgets
+// ---------------------------------------------------------------------------
+//
+void CNcdInstallationService::PopulateInstalledWidgetUidsL() 
+    {
+    DLTRACEIN((""));
+
+    if ( !iWidgetRegistry.Handle() )
+        {
+        User::LeaveIfError( iWidgetRegistry.Connect() );
+        }
     
-    // return first midlet uid, if exists
-    if ( appUids.Count() != 0 )
-        {
-        midletUid = appUids[0];
-        }
-    CleanupStack::PopAndDestroy(); // appUids 
-    return midletUid;
+    iInstalledWidgets.ResetAndDestroy();
+    User::LeaveIfError( iWidgetRegistry.InstalledWidgetsL( iInstalledWidgets ) );    
     }
 
 // ---------------------------------------------------------------------------
@@ -2017,44 +2145,38 @@
     {
     DLTRACEIN((""));
     
-    // Get ids of all widget components in scr
-    RArray<Usif::TComponentId> widgetComponentIdList;
-    Usif::CComponentFilter *pWidgetSwTypeFilter = Usif::CComponentFilter::NewLC();
-    pWidgetSwTypeFilter->SetSoftwareTypeL(Usif::KSoftwareTypeWidget);
-
-    iScrSession.GetComponentIdsL(widgetComponentIdList, pWidgetSwTypeFilter);
+    // Get the list of installed widget uids 
+    PopulateInstalledWidgetUidsL();
     
-    CleanupStack::PopAndDestroy(pWidgetSwTypeFilter);
-    CleanupClosePushL(widgetComponentIdList);
+    const TInt count = iInstalledWidgets.Count();
     
-    const TInt count = widgetComponentIdList.Count();
-    
-    // Create array with id & version infos
+    // Create array with UID & Version infos
     for ( TInt i = 0; i < count; ++i )
         {
         CExtendedWidgetInfo* tempInfo = new ( ELeave ) CExtendedWidgetInfo();
         CleanupStack::PushL( tempInfo );
         
-        // Get widget
-        Usif::TComponentId compId = widgetComponentIdList[i];
-        Usif::CComponentEntry* entry = Usif::CComponentEntry::NewLC();
-        iScrSession.GetComponentL(compId, *entry);
+        CWidgetInfo* widgetInfo = iInstalledWidgets[i];
         
-        // Fill id & version
-        tempInfo->iUid.iUid= compId;
-        *(tempInfo->iVersion) = entry->Version();
+        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(entry);
+
+        CleanupStack::PopAndDestroy( version );
         CleanupStack::Pop( tempInfo );
         }
-    
-    
-    CleanupStack::PopAndDestroy(); // widgetComponentIdList
    
-    DLTRACEOUT((""));
+        DLTRACEOUT((""));
 
     }
 
@@ -2062,13 +2184,26 @@
 // Gets the name of widget that was installed last
 // ---------------------------------------------------------------------------
 //
-
 HBufC* CNcdInstallationService::InstalledWidgetNameLC()
     {
     DLTRACEIN((""));
     
-    // Not currently suported
-    return NULL;
+    TUid widgetUid = InstalledWidgetUidL();
+    
+    if ( widgetUid == KNullUid )
+        {
+        DLERROR(("No widget uid"));
+        // No new UID was found, so we assume user canceled the installation.
+        // Installer does not give any error code in that case.
+        return NULL;
+        }
+
+    HBufC* bundleId = HBufC::NewLC( KWidgetBundleIdLength );
+    TPtr des( bundleId->Des() );
+    iWidgetRegistry.GetWidgetBundleId( widgetUid, des );            
+
+    DLTRACEOUT(( _L("Widget bundle id: %S"), bundleId ));
+    return bundleId;
     }
     
 
@@ -2178,48 +2313,30 @@
 
 
 // ---------------------------------------------------------------------------
-//Calling widget registry API to check if a widget with given uid is installed 
-//already
+//   
 // ---------------------------------------------------------------------------
 //
 TBool CNcdInstallationService::WidgetExistsL( const TUid& aUid )
     {
     DLTRACEIN((""));
-    
-    TBool retVal = EFalse;
-        
-    // Get entry 
-    Usif::TComponentId compId = aUid.iUid;
-    Usif::CComponentEntry* entry = Usif::CComponentEntry::NewLC();
-    TRAPD(err, iScrSession.GetComponentL(compId, *entry));
-    
-    if ( err == KErrNotFound || !retVal )
-        {
-        retVal = EFalse;
-        }
-    else if  (err != KErrNone )
+
+    if ( !iWidgetRegistry.Handle() )
         {
-        User::Leave( err );
+        User::LeaveIfError( iWidgetRegistry.Connect() );
         }
-    else
+    
+    if ( iWidgetRegistry.IsWidget( aUid ) )
         {
-        // widget ??
-        if ( entry->SoftwareType().Compare( Usif::KSoftwareTypeWidget ) == 0 )
-            {
-            retVal = ETrue;
-            }
-        else
-            {
-            retVal = EFalse;
-            }
+        TBuf<KWidgetBundleIdLength> id;
+        iWidgetRegistry.GetWidgetBundleId( aUid, id );
+        return iWidgetRegistry.WidgetExistsL( id );
         }
-    CleanupStack::PopAndDestroy(entry);
-    return retVal;
+    return EFalse;         
     }
 
 // ---------------------------------------------------------------------------
 //Calling widget registry API to check if a widget with given uid is installed 
-//already. Returns the version of the installed widget.
+//already
 // ---------------------------------------------------------------------------
 //
 TBool CNcdInstallationService::WidgetExistsL( 
@@ -2227,40 +2344,33 @@
     {
     DLTRACEIN((""));
     
-    TBool retVal = EFalse;
+    if ( !iWidgetRegistry.Handle() )
+        {
+        User::LeaveIfError( iWidgetRegistry.Connect() );
+        }
     
-    // Get entry 
-    Usif::TComponentId compId = aUid.iUid;
-    Usif::CComponentEntry* entry = Usif::CComponentEntry::NewLC();
-    TRAPD(err, retVal= iScrSession.GetComponentL(compId, *entry));
-    
-    if ( err == KErrNotFound || !retVal )
-        {
-        retVal = EFalse;
-        }
-    else if  (err != KErrNone )
+    if ( iWidgetRegistry.IsWidget( aUid ) )
         {
-        User::Leave( err );
-        }
-    else
-        {
-        // widget ??
-        if ( entry->SoftwareType().Compare( Usif::KSoftwareTypeWidget ) == 0 )
+        TBuf<KWidgetBundleIdLength> id;
+        iWidgetRegistry.GetWidgetBundleId( aUid, id );
+        if (iWidgetRegistry.WidgetExistsL( id ))
             {
-            retVal = ETrue;
-        
             // Get version
-            TPtrC entryVersion = entry->Version();
-            TCatalogsVersion::ConvertL( aVersion, entryVersion );
+            CWidgetPropertyValue* version = 
+                iWidgetRegistry.GetWidgetPropertyValueL(aUid, EBundleVersion );
+            CleanupStack::PushL( version );
+            TCatalogsVersion::ConvertL( aVersion, *(version->iValue.s) );
+            CleanupStack::PopAndDestroy( version ); 
+            return (ETrue);
             }
         else
             {
-            retVal = EFalse;
+            return (EFalse);
             }
         }
-    CleanupStack::PopAndDestroy(entry);
-    return retVal;
-    
+    else
+       return(EFalse);
+
     }
     
 // ---------------------------------------------------------------------------
@@ -2273,44 +2383,44 @@
     {
     DLTRACEIN((""));
     
-    TBool retVal = EFalse;
-    Usif::TComponentId compId = 0;
-    
-    // Get widget component id by identifier
-    TRAPD( err, compId = 
-           iScrSession.GetComponentIdL( aIdentifier, Usif::KSoftwareTypeWidget ));
+    if ( !iWidgetRegistry.Handle() )
+          {
+          User::LeaveIfError( iWidgetRegistry.Connect() );
+          }
+
+    RPointerArray<CWidgetInfo> widgetInfoArr;
     
-    if ( err == KErrNotFound )
-        {
-        retVal = EFalse;
-        }
-    else if  (err != KErrNone )
-        {
-        User::Leave( err );
-        }
-    else
+    CleanupResetAndDestroyPushL( widgetInfoArr );
+    TInt err = iWidgetRegistry.InstalledWidgetsL(widgetInfoArr);
+    
+    for( TInt i( widgetInfoArr.Count() - 1 ); i >= 0; --i ) 
         {
-        // Widget found
-        retVal = ETrue;
+        CWidgetInfo* widgetInfo( widgetInfoArr[i] );                  
+        CWidgetPropertyValue* bundleId = 
+            iWidgetRegistry.GetWidgetPropertyValueL
+                (widgetInfo->iUid, EBundleIdentifier );
+        CleanupStack::PushL( bundleId );
         
-        // Get entry 
-        Usif::CComponentEntry* entry = Usif::CComponentEntry::NewLC();
-        retVal = iScrSession.GetComponentL(compId, *entry);
-        
-        // Get version
-        if ( retVal )
+        if( aIdentifier.Compare( *(bundleId->iValue.s) )== 0 )
             {
-            TPtrC entryVersion = entry->Version();
-            TCatalogsVersion::ConvertL( aVersion, entryVersion );
+            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(entry);
+        CleanupStack::PopAndDestroy( bundleId );
         }
-    
-    return retVal;
+    CleanupStack::PopAndDestroy( &widgetInfoArr );
+    return EFalse;
     }
 
-
 // ---------------------------------------------------------------------------
 //  Calling widget registry API to return the Uid of the widget
 //  with given identifier.
@@ -2322,13 +2432,15 @@
     
     TUid id = TUid::Uid(0);
     
-    Usif::TComponentId compId = iScrSession.GetComponentIdL(aIdentifier, Usif::KSoftwareTypeNative);
+   if ( !iWidgetRegistry.Handle() )
+          {
+          User::LeaveIfError( iWidgetRegistry.Connect() );
+          }
     
-    id.iUid = compId;
-    
+    id.iUid = iWidgetRegistry.GetWidgetUidL( aIdentifier);
+
     return id;
     
-    
     }