diff -r 000000000000 -r 8e480a14352b messagingfw/msgsrvnstore/server/src/diskchange.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/msgsrvnstore/server/src/diskchange.cpp Mon Jan 18 20:36:02 2010 +0200 @@ -0,0 +1,104 @@ +// Copyright (c) 1999-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 "diskchange.h" +#include "MSVPANIC.H" + +CMsvNotifyDiskChange::CMsvNotifyDiskChange(RFs& aFs, MMsvDiskChangeObserver& aObserver) +: CMsgActive(EPriorityHigh), iFs(aFs), iObserver(aObserver) + { + CActiveScheduler::Add(this); + } + +CMsvNotifyDiskChange::~CMsvNotifyDiskChange() + { + Cancel(); + } + +TInt CMsvNotifyDiskChange::Start(const TDriveUnit& aDrive, TUint aUniqueId) +// +// aDrive - The drive for which we want notifications +// aUniqueId - The id we expect the drive to have +// + { + __ASSERT_DEBUG(!IsActive(), PanicServer(EMsvDiskChangeNotiferActive)); + + iUniqueId = aUniqueId; + + // Check if the drive is removable + TDriveInfo drive; + TInt error = iFs.Drive(drive, TInt(aDrive)); + if (error != KErrNone) + return error; + + iDrive = TInt(aDrive); + + // Setup file system notification + iFs.NotifyChange(ENotifyDisk, iStatus); + SetActive(); + + // See if the disk is currently available + TVolumeInfo volume; + iDiskRemoved = iFs.Volume(volume, TInt(iDrive)) != KErrNone || iDiskMissing; + + return KErrNone; + } + +void CMsvNotifyDiskChange::DoCancel() + { + iFs.NotifyChangeCancel(); + } + +void CMsvNotifyDiskChange::DoRunL() + { + // Flag to indicate we should continue to notify of disk changes + TBool keepGoing = ETrue; + + // Get disk details - If this fails assume it's missing + TVolumeInfo volume; + if (iFs.Volume(volume, TInt(iDrive)) != KErrNone || iDiskMissing) + { + if (!iDiskRemoved) + { + // The disk has been removed + keepGoing = iObserver.DiskRemoved(iDrive); + } + + iDiskRemoved = ETrue; + } + else if (iDiskRemoved) + { + if (iUniqueId != volume.iUniqueID || iWrongId) + { + // The incorrect disk is being used + keepGoing = iObserver.DiskChanged(iDrive, volume.iUniqueID); + } + else + { + // The correct disk has been inserted + keepGoing = iObserver.DiskInserted(iDrive); + } + + iDiskRemoved = EFalse; + } + + // Setup file system notification + if (keepGoing) + { + iFs.NotifyChange(ENotifyDisk, iStatus); + SetActive(); + } + } +