diff -r 000000000000 -r 4e1aa6a622a0 commonservices/PlatformEnv/disknotifyhandler/src/disknotifyhandlerimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonservices/PlatformEnv/disknotifyhandler/src/disknotifyhandlerimpl.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,550 @@ +/* +* Copyright (c) 2007-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: Wrapper implementation for file server notification handling. +* +*/ + + + +// INCLUDES +#include +#include +#include "disknotifyhandler.h" +#include "disknotifyhandlerimpl.h" +#include "diskwatcher.h" +#include "dismountwatcher.h" +#include "diskspacewatcher.h" +#include "entrywatcher.h" +#include "starteddismountwatcher.h" +#include "disknotifyhandlerdebug.h" + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CDiskNotifyHandlerImpl +// --------------------------------------------------------------------------- +// +CDiskNotifyHandlerImpl::CDiskNotifyHandlerImpl( + MDiskNotifyHandlerCallback& aCallback, + RFs& aFs ) : + iCallback( aCallback ), + iFs( aFs ) + { + FUNC_LOG + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::NewL +// --------------------------------------------------------------------------- +// +CDiskNotifyHandlerImpl* CDiskNotifyHandlerImpl::NewL( + MDiskNotifyHandlerCallback& aCallback, + RFs& aFs ) + { + FUNC_LOG + + return new ( ELeave ) CDiskNotifyHandlerImpl( aCallback, aFs ); + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::~CDiskNotifyHandlerImpl +// --------------------------------------------------------------------------- +// +CDiskNotifyHandlerImpl::~CDiskNotifyHandlerImpl() + { + FUNC_LOG + + delete iDiskWatcher; + + iDismountWatcherList.ResetAndDestroy(); + iDismountWatcherList.Close(); + + iDiskSpaceWatcherList.ResetAndDestroy(); + iDiskSpaceWatcherList.Close(); + + iEntryWatcherList.ResetAndDestroy(); + iEntryWatcherList.Close(); + + iStartedDismountWatcherList.ResetAndDestroy(); + iStartedDismountWatcherList.Close(); + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::NotifyDisk +// --------------------------------------------------------------------------- +// +TInt CDiskNotifyHandlerImpl::NotifyDisk() + { + FUNC_LOG + + if ( iDiskWatcher ) + { + if ( iDiskWatcher->IsActive() ) + { + ERROR_LOG1( "CDiskNotifyHandlerImpl::NotifyDisk-ret1=%d", + KErrAlreadyExists ) + return KErrAlreadyExists; + } + iDiskWatcher->Activate(); + return KErrNone; + } + + TRAPD( ret, iDiskWatcher = CDiskWatcher::NewL( iCallback, iFs ) ); + LOG_IF_ERROR1( ret, "CDiskNotifyHandlerImpl::NotifyDisk-ret2=%d", ret ) + return ret; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyDisk +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyDisk() + { + FUNC_LOG + + // Delete disk watcher instance to stop receiving pending + // callback notifications + delete iDiskWatcher; + iDiskWatcher = NULL; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::NotifyDismount +// --------------------------------------------------------------------------- +// +TInt CDiskNotifyHandlerImpl::NotifyDismount( TInt aDrive ) + { + FUNC_LOG + + CDismountWatcher* watcher = NULL; + TInt i( iDismountWatcherList.FindInOrder( + aDrive, CDismountWatcher::CompareFind ) ); + if ( i >= 0 && i < iDismountWatcherList.Count() ) + { + watcher = iDismountWatcherList[ i ]; + if ( watcher->IsActive() ) + { + ERROR_LOG2( + "CDiskNotifyHandlerImpl::NotifyDismount-aDrive=%d,ret1=%d", + aDrive, KErrAlreadyExists ) + return KErrAlreadyExists; + } + watcher->Activate(); + return KErrNone; + } + + TRAPD( ret, watcher = CDismountWatcher::NewL( + iCallback, iFs, iDismountWatcherList, aDrive ) ); + if ( ret != KErrNone ) + { + ERROR_LOG2( + "CDiskNotifyHandlerImpl::NotifyDismount-aDrive=%d,ret2=%d", + aDrive, ret ) + return ret; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::NotifyDismount-count=%d", + iDismountWatcherList.Count() ) + + return ret; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyDismount +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyDismount( TInt aDrive ) + { + FUNC_LOG + + TInt i( iDismountWatcherList.FindInOrder( + aDrive, CDismountWatcher::CompareFind ) ); + if ( i >= 0 && i < iDismountWatcherList.Count() ) + { + INFO_LOG2( + "CDiskNotifyHandlerImpl::CancelNotifyDismount-aDrive=%d,i=%d", + aDrive, i ) + CDismountWatcher* watcher = iDismountWatcherList[ i ]; + iDismountWatcherList.Remove( i ); + delete watcher; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyDismount-count=%d", + iDismountWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyDismount +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyDismount() + { + FUNC_LOG + + iDismountWatcherList.ResetAndDestroy(); + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyDismount-count=%d", + iDismountWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::AllowDismount +// --------------------------------------------------------------------------- +// +TInt CDiskNotifyHandlerImpl::AllowDismount( TInt aDrive ) + { + FUNC_LOG + + TInt i( iDismountWatcherList.FindInOrder( + aDrive, CDismountWatcher::CompareFind ) ); + if ( i >= 0 && i < iDismountWatcherList.Count() ) + { + return iDismountWatcherList[ i ]->AllowDismount(); + } + + // Suppress not found error + ERROR_LOG1( "CDiskNotifyHandlerImpl::AllowDismount-aDrive=%d,NOT FOUND", + aDrive ) + + return KErrNone; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::NotifyDiskSpace +// --------------------------------------------------------------------------- +// +TInt CDiskNotifyHandlerImpl::NotifyDiskSpace( + const TInt64& aThreshold, TInt aDrive ) + { + FUNC_LOG + + CDiskSpaceWatcher::TFindData data; + data.iDrive = aDrive; + data.iThreshold = aThreshold; + CDiskSpaceWatcher* watcher = NULL; + TInt i( iDiskSpaceWatcherList.FindInOrder( + data, CDiskSpaceWatcher::CompareFindData ) ); + if ( i >= 0 && i < iDiskSpaceWatcherList.Count() ) + { + watcher = iDiskSpaceWatcherList[ i ]; + if ( watcher->IsActive() ) + { + ERROR_LOG3( + "CDiskNotifyHandlerImpl::NotifyDiskSpace-aThreshold=%Ld,aDrive=%d,ret1=%d", + aThreshold, aDrive, KErrAlreadyExists ) + return KErrAlreadyExists; + } + watcher->Activate(); + return KErrNone; + } + + TRAPD( ret, watcher = CDiskSpaceWatcher::NewL( + iCallback, iFs, iDiskSpaceWatcherList, aDrive, aThreshold ) ); + if ( ret != KErrNone ) + { + ERROR_LOG3( + "CDiskNotifyHandlerImpl::NotifyDiskSpace-aThreshold=%Ld,aDrive=%d,ret2=%d", + aThreshold, aDrive, ret ) + return ret; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::NotifyDiskSpace-count=%d", + iDiskSpaceWatcherList.Count() ) + + return ret; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyDiskSpace +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyDiskSpace( + const TInt64& aThreshold, TInt aDrive ) + { + FUNC_LOG + + CDiskSpaceWatcher::TFindData data; + data.iDrive = aDrive; + data.iThreshold = aThreshold; + TInt i( iDiskSpaceWatcherList.FindInOrder( + data, CDiskSpaceWatcher::CompareFindData ) ); + if ( i >= 0 && i < iDiskSpaceWatcherList.Count() ) + { + INFO_LOG3( + "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-aThreshold=%Ld,aDrive=%d,i=%d", + aThreshold, aDrive, i ) + CDiskSpaceWatcher* watcher = iDiskSpaceWatcherList[ i ]; + iDiskSpaceWatcherList.Remove( i ); + delete watcher; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-count=%d", + iDiskSpaceWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyDiskSpace +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyDiskSpace( TInt aDrive ) + { + FUNC_LOG + + for( ;; ) + { + TInt i( iDiskSpaceWatcherList.FindInOrder( + aDrive, CDiskSpaceWatcher::CompareFind ) ); + if ( i >= 0 && i < iDiskSpaceWatcherList.Count() ) + { + INFO_LOG2( + "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-aDrive=%d,i=%d", + aDrive, i ) + CDiskSpaceWatcher* watcher = iDiskSpaceWatcherList[ i ]; + iDiskSpaceWatcherList.Remove( i ); + delete watcher; + } + else + { + break; // No matching watchers left + } + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-count=%d", + iDiskSpaceWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyDiskSpace +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyDiskSpace() + { + FUNC_LOG + + iDiskSpaceWatcherList.ResetAndDestroy(); + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-count=%d", + iDiskSpaceWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::NotifyEntry +// --------------------------------------------------------------------------- +// +TInt CDiskNotifyHandlerImpl::NotifyEntry( + TNotifyType aType, const TDesC& aEntry ) + { + FUNC_LOG + + CEntryWatcher::TFindData data; + data.iEntry.Set( aEntry ); + data.iType = aType; + CEntryWatcher* watcher = NULL; + TInt i( iEntryWatcherList.FindInOrder( + data, CEntryWatcher::CompareFindData ) ); + if ( i >= 0 && i < iEntryWatcherList.Count() ) + { + watcher = iEntryWatcherList[ i ]; + if ( watcher->IsActive() ) + { + ERROR_LOG3( + "CDiskNotifyHandlerImpl::NotifyEntry-aType=%d,aEntry=%S,ret1=%d", + aType, &aEntry, KErrAlreadyExists ) + return KErrAlreadyExists; + } + watcher->Activate(); + return KErrNone; + } + + TRAPD( ret, watcher = CEntryWatcher::NewL( + iCallback, iFs, iEntryWatcherList, aEntry, aType ) ); + if ( ret != KErrNone ) + { + ERROR_LOG3( + "CDiskNotifyHandlerImpl::NotifyEntry-aType=%d,aEntry=%S,ret2=%d", + aType, &aEntry, ret ) + return ret; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::NotifyEntry-count=%d", + iEntryWatcherList.Count() ) + + return ret; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyEntry +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyEntry( + TNotifyType aType, const TDesC& aEntry ) + { + FUNC_LOG + + CEntryWatcher::TFindData data; + data.iEntry.Set( aEntry ); + data.iType = aType; + TInt i( iEntryWatcherList.FindInOrder( + data, CEntryWatcher::CompareFindData ) ); + if ( i >= 0 && i < iEntryWatcherList.Count() ) + { + INFO_LOG3( + "CDiskNotifyHandlerImpl::CancelNotifyEntry-aType=%d,aEntry=%S,i=%d", + aType, &aEntry, i ) + CEntryWatcher* watcher = iEntryWatcherList[ i ]; + iEntryWatcherList.Remove( i ); + delete watcher; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyEntry-count=%d", + iEntryWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyEntry +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyEntry( const TDesC& aEntry ) + { + FUNC_LOG + + for( ;; ) + { + TInt i( iEntryWatcherList.FindInOrder( + aEntry, CEntryWatcher::CompareFind ) ); + if ( i >= 0 && i < iEntryWatcherList.Count() ) + { + INFO_LOG2( + "CDiskNotifyHandlerImpl::CancelNotifyEntry-aEntry=%S,i=%d", + &aEntry, i ) + CEntryWatcher* watcher = iEntryWatcherList[ i ]; + iEntryWatcherList.Remove( i ); + delete watcher; + } + else + { + break; // No matching watchers left + } + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyEntry-count=%d", + iEntryWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelNotifyEntry +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelNotifyEntry() + { + FUNC_LOG + + iEntryWatcherList.ResetAndDestroy(); + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelNotifyEntry-count=%d", + iEntryWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::StartDismount +// --------------------------------------------------------------------------- +// +TInt CDiskNotifyHandlerImpl::StartDismount( + TInt aDrive, TTimeIntervalMicroSeconds32 aForcedTimeout ) + { + FUNC_LOG + + CStartedDismountWatcher* watcher = NULL; + TInt i( iStartedDismountWatcherList.FindInOrder( + aDrive, CStartedDismountWatcher::CompareFind ) ); + if ( i >= 0 && i < iStartedDismountWatcherList.Count() ) + { + watcher = iStartedDismountWatcherList[ i ]; + if ( watcher->IsActive() ) + { + ERROR_LOG2( + "CDiskNotifyHandlerImpl::StartDismount-aDrive=%d,ret1=%d", + aDrive, KErrAlreadyExists ) + return KErrAlreadyExists; + } + watcher->Activate( aForcedTimeout ); + return KErrNone; + } + + TRAPD( ret, watcher = CStartedDismountWatcher::NewL( + iCallback, iFs, iStartedDismountWatcherList, aDrive, aForcedTimeout ) ); + if ( ret != KErrNone ) + { + ERROR_LOG2( + "CDiskNotifyHandlerImpl::StartDismount-aDrive=%d,ret2=%d", + aDrive, ret ) + return ret; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::StartDismount-count=%d", + iStartedDismountWatcherList.Count() ) + + return ret; + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelStartedDismount +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelStartedDismount( TInt aDrive ) + { + FUNC_LOG + + TInt i( iStartedDismountWatcherList.FindInOrder( + aDrive, CStartedDismountWatcher::CompareFind ) ); + if ( i >= 0 && i < iStartedDismountWatcherList.Count() ) + { + INFO_LOG2( + "CDiskNotifyHandlerImpl::CancelStartedDismount-aDrive=%d,i=%d", + aDrive, i ) + CStartedDismountWatcher* watcher = iStartedDismountWatcherList[ i ]; + iStartedDismountWatcherList.Remove( i ); + delete watcher; + } + + INFO_LOG1( + "CDiskNotifyHandlerImpl::CancelStartedDismount-count=%d", + iStartedDismountWatcherList.Count() ) + } + +// --------------------------------------------------------------------------- +// CDiskNotifyHandlerImpl::CancelStartedDismount +// --------------------------------------------------------------------------- +// +void CDiskNotifyHandlerImpl::CancelStartedDismount() + { + FUNC_LOG + + iStartedDismountWatcherList.ResetAndDestroy(); + } + +// End of File