/*
* 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(®istrySession);
}
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