diff -r 000000000000 -r 8466d47a6819 emailservices/emailserver/cmailhandlerplugin/src/cmaildriveobserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmaildriveobserver.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,202 @@ +/* +* Copyright (c) 2000-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: Drive observer implementation. +* +*/ + +// INCLUDE FILES +#include +#include +#include "cmaildriveobserver.h" + + +// --------------------------------------------------------- +// CDriveWatcher::NewL +// Second phase constructor +// --------------------------------------------------------- +// +CDriveObserver* CDriveObserver::NewL( MDriveObserver& aDriveObserver ) + { + CDriveObserver* self = CDriveObserver::NewLC( aDriveObserver ); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------- +// CDriveWatcher::NewLC +// Second phase constructor +// --------------------------------------------------------- +// +CDriveObserver* CDriveObserver::NewLC( MDriveObserver& aDriveObserver ) + { + CDriveObserver* self = new(ELeave) CDriveObserver( aDriveObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// --------------------------------------------------------- +// CDriveWatcher::~CDriveWatcher +// Destructor +// --------------------------------------------------------- +// +CDriveObserver::~CDriveObserver() + { + + delete iDriveLetter; + Cancel(); + + iFs.Close(); + + } + +// --------------------------------------------------------- +// CDriveWatcher::CDriveWatcher +// Default constructor +// --------------------------------------------------------- +// +CDriveObserver::CDriveObserver( MDriveObserver& aDriveObserver ) + : CActive( CActive::EPriorityStandard ), + iDriveObserver( aDriveObserver ) + { + } + +// --------------------------------------------------------- +// CDriveWatcher::ConstructL +// default Symbian OS constructor +// --------------------------------------------------------- +// +void CDriveObserver::ConstructL() + { + CActiveScheduler::Add(this); + User::LeaveIfError( iFs.Connect() ); + } + + +// --------------------------------------------------------- +// CDriveWatcher::WaitForChangeL() +// Request notification for disk change +// --------------------------------------------------------- +// +void CDriveObserver::WaitForChange() + { + if ( !IsActive() ) + { + iFs.NotifyChange( ENotifyEntry, iStatus, *iDriveLetter ); + SetActive(); + } + } + +// --------------------------------------------------------- +// CDriveWatcher::MediaPresentL() +// Call scanning if the memory card exists +// --------------------------------------------------------- +// +void CDriveObserver::MediaPresentL() + { + TVolumeInfo volumeInfo; + // Returns KErrNone, if drive exists + TInt err=iFs.Volume( volumeInfo, iDrive ); + + if ( err == KErrNone ) + { + iDriveObserver.DriveStateChangedL( ETrue ); + } + else + { + iDriveObserver.DriveStateChangedL( EFalse ); + } + } + +// --------------------------------------------------------- +// Return true if drive is present and false otherwise. + // --------------------------------------------------------- + // +TBool CDriveObserver::IsDrivePresent() + { + TVolumeInfo volumeInfo; + // Returns KErrNone, if drive exists + TInt err=iFs.Volume( volumeInfo, iDrive ); + + return ( KErrNone == err ); + } + +// --------------------------------------------------------- +// CDriveWatcher::DoCancel() +// Derived from CActive, cancel request +// --------------------------------------------------------- +// +void CDriveObserver::DoCancel() + { + iFs.NotifyChangeCancel(); + } + +// --------------------------------------------------------- +// CDriveWatcher::RunL() +// Derived from CActive, called when notification received +// Check if media is present and call new notification request +// --------------------------------------------------------- +// +void CDriveObserver::RunL() + { + if ( iStatus.Int() != KErrCancel ) + { + WaitForChange(); + MediaPresentL(); + } + } + +// --------------------------------------------------------- +// CDriveWatcher::RunError() +// --------------------------------------------------------- +// + +TInt CDriveObserver::RunError(TInt /*aError*/) + { + return KErrNone; + } + +// --------------------------------------------------------- +// CDriveObserver::SetDriveL() +// --------------------------------------------------------- +// +void CDriveObserver::SetDriveL( TDriveNumber aDrive ) + { + if (iDrive == aDrive) + { + //if drives are the same don't need to do nothing + return; + } + else if ( IsActive() ) + { + //cancel request if drive to monitor changed + Cancel(); + } + + const TUint KDriveBufSize = 2; + + iDrive = aDrive; + + TChar driveAsChar = 0; + RFs::DriveToChar( iDrive, driveAsChar ); + + delete iDriveLetter; + iDriveLetter = NULL; + iDriveLetter = HBufC::NewL( KDriveBufSize ); + + iDriveLetter->Des().Append( driveAsChar ); + iDriveLetter->Des().Append(':'); + } +//EOF +