appinstaller/AppinstUi/Daemon/Src/daemonbehaviour.cpp
changeset 0 ba25891c3a9e
child 1 c42dffbd5b4f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstaller/AppinstUi/Daemon/Src/daemonbehaviour.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: 
+*
+*/
+
+#include "daemonbehaviour.h"
+#include "swispubsubdefs.h"
+#include "recsisx.h"
+#include "sisregistrywritablesession.h"
+#include "SWInstDebug.h"
+#include "sisregistryentry.h"
+
+
+namespace Swi
+	{
+	// For uninstaller
+	CDaemonBehaviour* CDaemonBehaviour::NewL( CProgramStatus& aMainStatus )
+		{
+		CDaemonBehaviour* self = NewLC( aMainStatus );
+		CleanupStack::Pop(self);
+		return self;
+		}
+	
+	CDaemonBehaviour* CDaemonBehaviour::NewLC( CProgramStatus& aMainStatus )
+		{
+		CDaemonBehaviour* self = new (ELeave) CDaemonBehaviour;
+		CleanupStack::PushL(self);
+		self->ConstructL( aMainStatus );
+		return self;	
+		}
+		
+	void CDaemonBehaviour::ConstructL( CProgramStatus& aMainStatus )
+		{
+		User::LeaveIfError(iFs.Connect());
+		User::LeaveIfError(iFs.ShareProtected());
+
+		// For uninstaller
+		iSisInstaller = CSisInstaller::NewL( this, aMainStatus );
+		// Create plugin
+		TRAP_IGNORE( iSwiDaemonPlugin = CSwiDaemonPlugin::NewL() );		
+		}
+	
+	CDaemonBehaviour::~CDaemonBehaviour()
+		{
+	    if ( iSwiDaemonPlugin )
+	        {
+	        delete iSwiDaemonPlugin;
+	        REComSession::FinalClose();
+	        }		
+		delete iSisInstaller;
+		iSisInstaller = NULL;
+		iFs.Close();	
+
+		
+#ifdef RD_MULTIPLE_DRIVE 		
+		iDriveArray.Close();
+#endif				
+		}
+		
+	// from MDaemonBehaviour
+	TBool CDaemonBehaviour::StartupL()
+		{
+		// Return state of Startup
+		return ETrue;
+		}
+
+    void CDaemonBehaviour::MediaChangeL(TInt aDrive, TChangeType aChangeType)
+		{
+        FLOG_1( _L("Daemon: Media change %d"), aDrive );
+        RSisRegistryWritableSession registrySession;
+        
+        User::LeaveIfError(registrySession.Connect());
+        CleanupClosePushL(registrySession);
+        
+        if (aChangeType==EMediaInserted)
+            {
+            FLOG( _L("Daemon: Media inserted") );                        
+            // Scan directory on the card and run pre-installed through SWIS
+            ProcessPreinstalledFilesL(aDrive);
+            
+            // notify IAR
+            registrySession.AddDriveL(aDrive);
+			
+#ifdef RD_MULTIPLE_DRIVE   
+            // Add inserted media drive to drive array.                     
+            if ( iDriveArray.Find(aDrive) == KErrNotFound )
+                {                
+                iDriveArray.AppendL(aDrive); 
+                }      
+#endif			
+            }
+        else if (aChangeType==EMediaRemoved)
+            {
+            FLOG( _L("Daemon: Media removed") ); 
+            
+#ifdef RD_MULTIPLE_DRIVE     
+            // Get Installer state.                   
+            TBool installerRunning = iSisInstaller->IsInstalling();                        
+#endif 
+            
+#ifndef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK                                           
+            // notify IAR
+            registrySession.RemoveDriveL(aDrive);
+#endif //SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK
+            
+            // Cancel all requests for install
+            iSisInstaller->Cancel();
+            
+#ifdef RD_MULTIPLE_DRIVE
+// Notify plugin
+        if(iSwiDaemonPlugin)
+            {
+            TInt index = iDriveArray.Find(aDrive);
+            iSwiDaemonPlugin->MediaRemoved(index);
+            }
+#else
+// Notify plugin
+        if(iSwiDaemonPlugin)
+            {
+            iSwiDaemonPlugin->MediaRemoved(aDrive);
+            }
+#endif //RD_MULTIPLE_DRIVE            
+
+#ifdef RD_MULTIPLE_DRIVE
+            // Get index of removed drive from array
+            TInt index = iDriveArray.Find(aDrive);
+            
+            if ( index > KErrNotFound )
+                {
+                iDriveArray.Remove(index); 
+                iDriveArray.Compress();   
+                }
+            
+            // Continue installing from other drives if needed.
+            if ( installerRunning )
+                {			    			    	                
+                // Get count of inserted drives.
+                TInt count = iDriveArray.Count();
+                                
+                if ( count )            
+                    {                             
+                    for(index = 0; index < count; index++ )
+                        {                                        
+                        ProcessPreinstalledFilesL(iDriveArray[index]);
+                        iSisInstaller->StartInstallingL();                
+                        }
+                    }                
+                }           
+#endif						
+			}
+		CleanupStack::PopAndDestroy(&registrySession);
+		}
+	
+    void CDaemonBehaviour::ProcessPreinstalledFilesL(TInt aDrive)
+		{
+		_LIT(KDaemonPrivatePath,":\\private\\10202dce\\");
+		
+#ifndef RD_MULTIPLE_DRIVE
+		iSisInstaller->Cancel();
+#endif			
+		// For uninstaller
+        // Set on installing mode.
+        iGeneralProcessStatus = EStateInstalling; 
+        FLOG_1( _L("[CDaemonBehaviour] iGeneralProcessStatus = %d"), 
+                iGeneralProcessStatus );
+		
+		ProcessPreinstalledFilesL(aDrive, KDaemonPrivatePath);
+        iStartNotified = EFalse;
+        iDrive = aDrive;		
+		iSisInstaller->StartInstallingL();
+		}
+		
+	void CDaemonBehaviour::ProcessPreinstalledFilesL(TInt aDrive, const TDesC& aDirectory)
+        {
+        FLOG( _L("Daemon: ProcessPreInstalledFilesL") );
+        TPath preInstalledPath;
+        TChar drive;
+        RFs::DriveToChar(aDrive, drive);
+        preInstalledPath.Append(drive);
+        preInstalledPath.Append(aDirectory);
+        
+        FLOG_1( _L("Daemon: ProcessPreInstalledFilesL Getting dir %S"), &preInstalledPath );
+        CDir* dir = NULL;
+        TInt err = iFs.GetDir(preInstalledPath, KEntryAttNormal, ESortNone, dir);	
+        if (err != KErrNone && err != KErrPathNotFound)
+            {
+            FLOG_1( _L("Daemon: ProcessPreInstalledFilesL GetDir with error %d"), err );
+            User::Leave(err);
+            }
+        if(dir)
+            {
+            // dir will only exist if GetDir succeeded
+            CleanupStack::PushL(dir);
+            for(TInt i = 0; i < dir->Count(); i++)
+                {
+                const TEntry &entry = (*dir)[i];
+                if(!entry.IsDir())
+                    {
+                    TFileName fileName(preInstalledPath);
+                    fileName.Append(entry.iName);
+                    iSisInstaller->AddFileToInstallL(fileName);
+                    }
+                }
+            CleanupStack::PopAndDestroy(dir);
+            }
+        }
+
+	// For uninstaller
+    TInt& CDaemonBehaviour::GetProcessStatus()
+        {
+        return iGeneralProcessStatus;
+        }
+
+    // For uninstaller
+    void CDaemonBehaviour::SetProcessStatus( TInt aStatus )
+        {
+        iGeneralProcessStatus = aStatus;
+        }   	
+	
+    // For plugin support
+    void CDaemonBehaviour::DoNotifyMediaProcessingComplete()
+        {
+        if ( iSwiDaemonPlugin && iStartNotified )
+            {
+            iSwiDaemonPlugin->MediaProcessingComplete();
+            }
+        }
+    
+    // For plugin support
+    TBool CDaemonBehaviour::IsPlugin()
+        {        
+        if ( iSwiDaemonPlugin )
+            {
+            return ETrue;
+            }        
+        return EFalse;
+        }
+    
+    // For plugin support
+    void CDaemonBehaviour::NotifyPlugin()
+        {
+        FLOG( _L("Daemon: NotifyPlugin"));
+        if ( !iStartNotified )
+             {
+             FLOG_1( _L("Daemon: MediaProcessingStart for drive = %d"), iDrive );
+             iSwiDaemonPlugin->MediaProcessingStart( iDrive );
+             iStartNotified = ETrue;
+             }    
+        }
+    
+    // For plugin support
+    void CDaemonBehaviour::RequestPluginInstall( TDesC& aSisFile )
+        {
+        // Note We will open file in here but that is only because
+        // plug-in interface has been designed this way. Original
+        // Symbian SWI daemon did use RApaLsSession for installing
+        // and thus RFile was open already. 
+        // Since current SWI Daemon does use SWI API it doesn't 
+        // open files and thus we need to open the file in here.        
+        FLOG( _L("Daemon: RequestPluginInstall "));
+                
+        RFile file;
+        User::LeaveIfError( file.Open( 
+                iFs, aSisFile, EFileRead | EFileShareReadersOnly ) );
+        CleanupClosePushL( file );
+        
+        iSwiDaemonPlugin->RequestInstall( file );
+        
+        // close file, original SWI Daemon do not leave file open.
+        CleanupStack::PopAndDestroy( &file ); 
+        }
+                                        
+	} // namespace Swi
+//EOF