diff -r 7333d7932ef7 -r 8b7f4e561641 installationservices/swi/source/daemon/daemon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/installationservices/swi/source/daemon/daemon.cpp Wed Sep 01 12:22:02 2010 +0100 @@ -0,0 +1,167 @@ +/* +* 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 the License "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 "daemon.h" +#include "drivewatcher.h" +#include "log.h" +#include "securitypolicy.h" + +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK +#include +#include +#include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "stsrecovery.h" +#endif //SYMBIAN_ENABLE_SPLIT_HEADERS +#include "swiobserverclient.h" +#else +#include "sisregistrysession.h" +#endif + + +namespace Swi +{ +// CDaemon + +/*static*/ CDaemon* CDaemon::NewL(MDaemonBehaviour& aBehaviour) + { + CDaemon* self=NewLC(aBehaviour); + CleanupStack::Pop(self); + return self; + } + +/*static*/ CDaemon* CDaemon::NewLC(MDaemonBehaviour& aBehaviour) + { + CDaemon* self=new(ELeave) CDaemon(aBehaviour); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CDaemon::~CDaemon() + { + iPolicyLockFile.Close(); + iWatchers.ResetAndDestroy(); + iFs.Close(); + } + +CDaemon::CDaemon(MDaemonBehaviour& aBehaviour) + : iBehaviour(aBehaviour) + { + } + +void CDaemon::ConstructL() + { + User::LeaveIfError(iFs.Connect()); + LockSensitiveFiles(); + StartRecoveryL(); + iBehaviour.StartupL(); + StartWatchersL(); + } + +void CDaemon::StartWatchersL() + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + User::LeaveIfError(fs.ShareProtected()); + + TDriveList driveList; + + User::LeaveIfError(fs.DriveList(driveList)); + + for (TInt drive=0; drive < KMaxDrives; ++drive) + { + if (driveList[drive] == 0) + { + continue; + } + TDriveInfo info; + + // Ignore errors since the next drive might work + if (KErrNone != fs.Drive(info, drive)) + { + DEBUG_PRINTF2(_L8("SWI Daemon - Not watching drive '%d', could not retrieve drive info."), + drive); + continue; + } + + if (info.iDriveAtt & KDriveAttRemovable) + { + DEBUG_PRINTF2(_L8("SWI Daemon - Watching removable drive '%d'"), drive); + CDriveWatcher* driveWatcher=CDriveWatcher::NewLC(iFs, drive, iBehaviour); + User::LeaveIfError(iWatchers.Append(driveWatcher)); + CleanupStack::Pop(driveWatcher); + } + } + CleanupStack::PopAndDestroy(&fs); + } // StartWatchersL() + +void CDaemon::LockSensitiveFiles() + { + TInt error = iPolicyLockFile.Open(iFs, KSwisPolicyFile, EFileShareReadersOnly | EFileRead); + if (error != KErrNone) + { + DEBUG_PRINTF2(_L8("SWI Daemon - Could not open SWI policy file with error %d!"), error); + } + } + +#ifdef SYMBIAN_UNIVERSAL_INSTALL_FRAMEWORK +void CDaemon::StartRecoveryL() + { + DEBUG_PRINTF(_L("CDaemon::StartRecoveryL()")); + + // Check to see if a backup is in progress... + TInt backup = 0; + User::LeaveIfError(RProperty::Get(KUidSystemCategory,conn::KUidBackupRestoreKey,backup)); + + if(backup == conn::EBURUnset || (backup == (conn::EBURNormal | conn::ENoBackup))) //no backup or restore is in progress + { + //no recovery attempt is made during backup/restore as recovery may seriously affect the file system, which might impact backup/restore + //recovery will be made at next bootup + Usif::RStsRecoverySession stsRecoverySession; + // A recovery failure should not affect Daemon start up. + TRAPD(err, stsRecoverySession.RollbackAllPendingL()); + if(err != KErrNone) + { + DEBUG_PRINTF2(_L("CDaemon::StartRecoveryL() - STS server failed to recover transactions. Error code: %d"), err); + } + //Start SWI Observer so that it can process the log files left from the previous session. + RSwiObserverSession swiObserver; + swiObserver.ProcessLogsL(iFs); + swiObserver.Close(); + } + } +#else +void CDaemon::StartRecoveryL() + { + DEBUG_PRINTF(_L8("SWI Daemon - Check to see if a recovery is needed")); + RSisRegistrySession registrySession; + User::LeaveIfError(registrySession.Connect()); + CleanupClosePushL(registrySession); + + // A recovery failure should not affect SWI Daemon start up. + TRAP_IGNORE(registrySession.RecoverL()); + + CleanupStack::PopAndDestroy(®istrySession); + DEBUG_PRINTF(_L8("SWI Daemon - Recovery check finished")); + } +#endif + +} // namespace Swi