commonservices/PlatformEnv/disknotifyhandler/src/disknotifyhandlerimpl.cpp
changeset 0 4e1aa6a622a0
child 83 11da52d4c847
--- /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 <e32std.h>
+#include <f32file.h>
+#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