commonservices/PlatformEnv/disknotifyhandler/src/disknotifyhandlerimpl.cpp
changeset 0 4e1aa6a622a0
child 83 11da52d4c847
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Wrapper implementation for file server notification handling.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDES
       
    21 #include <e32std.h>
       
    22 #include <f32file.h>
       
    23 #include "disknotifyhandler.h"
       
    24 #include "disknotifyhandlerimpl.h"
       
    25 #include "diskwatcher.h"
       
    26 #include "dismountwatcher.h"
       
    27 #include "diskspacewatcher.h"
       
    28 #include "entrywatcher.h"
       
    29 #include "starteddismountwatcher.h"
       
    30 #include "disknotifyhandlerdebug.h"
       
    31 
       
    32 
       
    33 // ======== MEMBER FUNCTIONS ========
       
    34 
       
    35 // ---------------------------------------------------------------------------
       
    36 // CDiskNotifyHandlerImpl::CDiskNotifyHandlerImpl
       
    37 // ---------------------------------------------------------------------------
       
    38 //
       
    39 CDiskNotifyHandlerImpl::CDiskNotifyHandlerImpl(
       
    40         MDiskNotifyHandlerCallback& aCallback,
       
    41         RFs& aFs ) :
       
    42     iCallback( aCallback ),
       
    43     iFs( aFs )
       
    44     {
       
    45     FUNC_LOG
       
    46     }
       
    47 
       
    48 // ---------------------------------------------------------------------------
       
    49 // CDiskNotifyHandlerImpl::NewL
       
    50 // ---------------------------------------------------------------------------
       
    51 //
       
    52 CDiskNotifyHandlerImpl* CDiskNotifyHandlerImpl::NewL(
       
    53         MDiskNotifyHandlerCallback& aCallback,
       
    54         RFs& aFs )
       
    55     {
       
    56     FUNC_LOG
       
    57 
       
    58     return new ( ELeave ) CDiskNotifyHandlerImpl( aCallback, aFs );
       
    59     }
       
    60 
       
    61 // ---------------------------------------------------------------------------
       
    62 // CDiskNotifyHandlerImpl::~CDiskNotifyHandlerImpl
       
    63 // ---------------------------------------------------------------------------
       
    64 //
       
    65 CDiskNotifyHandlerImpl::~CDiskNotifyHandlerImpl()
       
    66     {
       
    67     FUNC_LOG
       
    68 
       
    69     delete iDiskWatcher;
       
    70 
       
    71     iDismountWatcherList.ResetAndDestroy();
       
    72     iDismountWatcherList.Close();
       
    73 
       
    74     iDiskSpaceWatcherList.ResetAndDestroy();
       
    75     iDiskSpaceWatcherList.Close();
       
    76 
       
    77     iEntryWatcherList.ResetAndDestroy();
       
    78     iEntryWatcherList.Close();
       
    79 
       
    80     iStartedDismountWatcherList.ResetAndDestroy();
       
    81     iStartedDismountWatcherList.Close();
       
    82     }
       
    83 
       
    84 // ---------------------------------------------------------------------------
       
    85 // CDiskNotifyHandlerImpl::NotifyDisk
       
    86 // ---------------------------------------------------------------------------
       
    87 //
       
    88 TInt CDiskNotifyHandlerImpl::NotifyDisk()
       
    89     {
       
    90     FUNC_LOG
       
    91 
       
    92     if ( iDiskWatcher )
       
    93         {
       
    94         if ( iDiskWatcher->IsActive() )
       
    95             {
       
    96             ERROR_LOG1( "CDiskNotifyHandlerImpl::NotifyDisk-ret1=%d",
       
    97                 KErrAlreadyExists )
       
    98             return KErrAlreadyExists;
       
    99             }
       
   100         iDiskWatcher->Activate();
       
   101         return KErrNone;
       
   102         }
       
   103 
       
   104     TRAPD( ret, iDiskWatcher = CDiskWatcher::NewL( iCallback, iFs ) );
       
   105     LOG_IF_ERROR1( ret, "CDiskNotifyHandlerImpl::NotifyDisk-ret2=%d", ret )
       
   106     return ret;
       
   107     }
       
   108 
       
   109 // ---------------------------------------------------------------------------
       
   110 // CDiskNotifyHandlerImpl::CancelNotifyDisk
       
   111 // ---------------------------------------------------------------------------
       
   112 //
       
   113 void CDiskNotifyHandlerImpl::CancelNotifyDisk()
       
   114     {
       
   115     FUNC_LOG
       
   116 
       
   117     // Delete disk watcher instance to stop receiving pending 
       
   118     // callback notifications
       
   119     delete iDiskWatcher;
       
   120     iDiskWatcher = NULL;
       
   121     }
       
   122 
       
   123 // ---------------------------------------------------------------------------
       
   124 // CDiskNotifyHandlerImpl::NotifyDismount
       
   125 // ---------------------------------------------------------------------------
       
   126 //
       
   127 TInt CDiskNotifyHandlerImpl::NotifyDismount( TInt aDrive )
       
   128     {
       
   129     FUNC_LOG
       
   130 
       
   131     CDismountWatcher* watcher = NULL;
       
   132     TInt i( iDismountWatcherList.FindInOrder(
       
   133         aDrive, CDismountWatcher::CompareFind ) );
       
   134     if ( i >= 0 && i < iDismountWatcherList.Count() )
       
   135         {
       
   136         watcher = iDismountWatcherList[ i ];
       
   137         if ( watcher->IsActive() )
       
   138             {
       
   139             ERROR_LOG2(
       
   140                 "CDiskNotifyHandlerImpl::NotifyDismount-aDrive=%d,ret1=%d",
       
   141                 aDrive, KErrAlreadyExists )
       
   142             return KErrAlreadyExists;
       
   143             }
       
   144         watcher->Activate();
       
   145         return KErrNone;
       
   146         }
       
   147 
       
   148     TRAPD( ret, watcher = CDismountWatcher::NewL(
       
   149         iCallback, iFs, iDismountWatcherList, aDrive ) );
       
   150     if ( ret != KErrNone )
       
   151         {
       
   152         ERROR_LOG2(
       
   153             "CDiskNotifyHandlerImpl::NotifyDismount-aDrive=%d,ret2=%d",
       
   154             aDrive, ret )
       
   155         return ret;
       
   156         }
       
   157 
       
   158     INFO_LOG1(
       
   159         "CDiskNotifyHandlerImpl::NotifyDismount-count=%d",
       
   160         iDismountWatcherList.Count() )
       
   161 
       
   162     return ret;
       
   163     }
       
   164 
       
   165 // ---------------------------------------------------------------------------
       
   166 // CDiskNotifyHandlerImpl::CancelNotifyDismount
       
   167 // ---------------------------------------------------------------------------
       
   168 //
       
   169 void CDiskNotifyHandlerImpl::CancelNotifyDismount( TInt aDrive )
       
   170     {
       
   171     FUNC_LOG
       
   172 
       
   173     TInt i( iDismountWatcherList.FindInOrder(
       
   174         aDrive, CDismountWatcher::CompareFind ) );
       
   175     if ( i >= 0 && i < iDismountWatcherList.Count() )
       
   176         {
       
   177         INFO_LOG2(
       
   178             "CDiskNotifyHandlerImpl::CancelNotifyDismount-aDrive=%d,i=%d",
       
   179             aDrive, i )
       
   180         CDismountWatcher* watcher = iDismountWatcherList[ i ];
       
   181         iDismountWatcherList.Remove( i );
       
   182         delete watcher;
       
   183         }
       
   184 
       
   185     INFO_LOG1(
       
   186         "CDiskNotifyHandlerImpl::CancelNotifyDismount-count=%d",
       
   187         iDismountWatcherList.Count() )
       
   188     }
       
   189 
       
   190 // ---------------------------------------------------------------------------
       
   191 // CDiskNotifyHandlerImpl::CancelNotifyDismount
       
   192 // ---------------------------------------------------------------------------
       
   193 //
       
   194 void CDiskNotifyHandlerImpl::CancelNotifyDismount()
       
   195     {
       
   196     FUNC_LOG
       
   197 
       
   198     iDismountWatcherList.ResetAndDestroy();
       
   199 
       
   200     INFO_LOG1(
       
   201         "CDiskNotifyHandlerImpl::CancelNotifyDismount-count=%d",
       
   202         iDismountWatcherList.Count() )
       
   203     }
       
   204 
       
   205 // ---------------------------------------------------------------------------
       
   206 // CDiskNotifyHandlerImpl::AllowDismount
       
   207 // ---------------------------------------------------------------------------
       
   208 //
       
   209 TInt CDiskNotifyHandlerImpl::AllowDismount( TInt aDrive )
       
   210     {
       
   211     FUNC_LOG
       
   212 
       
   213     TInt i( iDismountWatcherList.FindInOrder(
       
   214         aDrive, CDismountWatcher::CompareFind ) );
       
   215     if ( i >= 0 && i < iDismountWatcherList.Count() )
       
   216         {
       
   217         return iDismountWatcherList[ i ]->AllowDismount();
       
   218         }
       
   219 
       
   220     // Suppress not found error
       
   221     ERROR_LOG1( "CDiskNotifyHandlerImpl::AllowDismount-aDrive=%d,NOT FOUND",
       
   222         aDrive )
       
   223 
       
   224     return KErrNone;
       
   225     }
       
   226 
       
   227 // ---------------------------------------------------------------------------
       
   228 // CDiskNotifyHandlerImpl::NotifyDiskSpace
       
   229 // ---------------------------------------------------------------------------
       
   230 //
       
   231 TInt CDiskNotifyHandlerImpl::NotifyDiskSpace(
       
   232         const TInt64& aThreshold, TInt aDrive )
       
   233     {
       
   234     FUNC_LOG
       
   235 
       
   236     CDiskSpaceWatcher::TFindData data;
       
   237     data.iDrive = aDrive;
       
   238     data.iThreshold = aThreshold;
       
   239     CDiskSpaceWatcher* watcher = NULL;
       
   240     TInt i( iDiskSpaceWatcherList.FindInOrder(
       
   241             data, CDiskSpaceWatcher::CompareFindData ) );
       
   242     if ( i >= 0 && i < iDiskSpaceWatcherList.Count() )
       
   243         {
       
   244         watcher = iDiskSpaceWatcherList[ i ];
       
   245         if ( watcher->IsActive() )
       
   246             {
       
   247             ERROR_LOG3(
       
   248                 "CDiskNotifyHandlerImpl::NotifyDiskSpace-aThreshold=%Ld,aDrive=%d,ret1=%d",
       
   249                 aThreshold, aDrive, KErrAlreadyExists )
       
   250             return KErrAlreadyExists;
       
   251             }
       
   252         watcher->Activate();
       
   253         return KErrNone;
       
   254         }
       
   255 
       
   256     TRAPD( ret, watcher = CDiskSpaceWatcher::NewL(
       
   257         iCallback, iFs, iDiskSpaceWatcherList, aDrive, aThreshold ) );
       
   258     if ( ret != KErrNone )
       
   259         {
       
   260         ERROR_LOG3(
       
   261             "CDiskNotifyHandlerImpl::NotifyDiskSpace-aThreshold=%Ld,aDrive=%d,ret2=%d",
       
   262             aThreshold, aDrive, ret )
       
   263         return ret;
       
   264         }
       
   265 
       
   266     INFO_LOG1(
       
   267         "CDiskNotifyHandlerImpl::NotifyDiskSpace-count=%d",
       
   268         iDiskSpaceWatcherList.Count() )
       
   269 
       
   270     return ret;
       
   271     }
       
   272 
       
   273 // ---------------------------------------------------------------------------
       
   274 // CDiskNotifyHandlerImpl::CancelNotifyDiskSpace
       
   275 // ---------------------------------------------------------------------------
       
   276 //
       
   277 void CDiskNotifyHandlerImpl::CancelNotifyDiskSpace(
       
   278         const TInt64& aThreshold, TInt aDrive )
       
   279     {
       
   280     FUNC_LOG
       
   281 
       
   282     CDiskSpaceWatcher::TFindData data;
       
   283     data.iDrive = aDrive;
       
   284     data.iThreshold = aThreshold;
       
   285     TInt i( iDiskSpaceWatcherList.FindInOrder(
       
   286         data, CDiskSpaceWatcher::CompareFindData ) );
       
   287     if ( i >= 0 && i < iDiskSpaceWatcherList.Count() )
       
   288         {
       
   289         INFO_LOG3(
       
   290             "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-aThreshold=%Ld,aDrive=%d,i=%d",
       
   291             aThreshold, aDrive, i )
       
   292         CDiskSpaceWatcher* watcher = iDiskSpaceWatcherList[ i ];
       
   293         iDiskSpaceWatcherList.Remove( i );
       
   294         delete watcher;
       
   295         }
       
   296 
       
   297     INFO_LOG1(
       
   298         "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-count=%d",
       
   299         iDiskSpaceWatcherList.Count() )
       
   300     }
       
   301 
       
   302 // ---------------------------------------------------------------------------
       
   303 // CDiskNotifyHandlerImpl::CancelNotifyDiskSpace
       
   304 // ---------------------------------------------------------------------------
       
   305 //
       
   306 void CDiskNotifyHandlerImpl::CancelNotifyDiskSpace( TInt aDrive )
       
   307     {
       
   308     FUNC_LOG
       
   309 
       
   310     for( ;; )
       
   311         {
       
   312         TInt i( iDiskSpaceWatcherList.FindInOrder(
       
   313             aDrive, CDiskSpaceWatcher::CompareFind ) );
       
   314         if ( i >= 0 && i < iDiskSpaceWatcherList.Count() )
       
   315             {
       
   316             INFO_LOG2(
       
   317                 "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-aDrive=%d,i=%d",
       
   318                 aDrive, i )
       
   319             CDiskSpaceWatcher* watcher = iDiskSpaceWatcherList[ i ];
       
   320             iDiskSpaceWatcherList.Remove( i );
       
   321             delete watcher;
       
   322             }
       
   323         else
       
   324             {
       
   325             break; // No matching watchers left
       
   326             }
       
   327         }
       
   328 
       
   329     INFO_LOG1(
       
   330         "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-count=%d",
       
   331         iDiskSpaceWatcherList.Count() )
       
   332     }
       
   333 
       
   334 // ---------------------------------------------------------------------------
       
   335 // CDiskNotifyHandlerImpl::CancelNotifyDiskSpace
       
   336 // ---------------------------------------------------------------------------
       
   337 //
       
   338 void CDiskNotifyHandlerImpl::CancelNotifyDiskSpace()
       
   339     {
       
   340     FUNC_LOG
       
   341 
       
   342     iDiskSpaceWatcherList.ResetAndDestroy();
       
   343 
       
   344     INFO_LOG1(
       
   345         "CDiskNotifyHandlerImpl::CancelNotifyDiskSpace-count=%d",
       
   346         iDiskSpaceWatcherList.Count() )
       
   347     }
       
   348 
       
   349 // ---------------------------------------------------------------------------
       
   350 // CDiskNotifyHandlerImpl::NotifyEntry
       
   351 // ---------------------------------------------------------------------------
       
   352 //
       
   353 TInt CDiskNotifyHandlerImpl::NotifyEntry(
       
   354         TNotifyType aType, const TDesC& aEntry )
       
   355     {
       
   356     FUNC_LOG
       
   357 
       
   358     CEntryWatcher::TFindData data;
       
   359     data.iEntry.Set( aEntry );
       
   360     data.iType = aType;
       
   361     CEntryWatcher* watcher = NULL;
       
   362     TInt i( iEntryWatcherList.FindInOrder(
       
   363         data, CEntryWatcher::CompareFindData ) );
       
   364     if ( i >= 0 && i < iEntryWatcherList.Count() )
       
   365         {
       
   366         watcher = iEntryWatcherList[ i ];
       
   367         if ( watcher->IsActive() )
       
   368             {
       
   369             ERROR_LOG3(
       
   370                 "CDiskNotifyHandlerImpl::NotifyEntry-aType=%d,aEntry=%S,ret1=%d",
       
   371                 aType, &aEntry, KErrAlreadyExists )
       
   372             return KErrAlreadyExists;
       
   373             }
       
   374         watcher->Activate();
       
   375         return KErrNone;
       
   376         }
       
   377 
       
   378     TRAPD( ret, watcher = CEntryWatcher::NewL(
       
   379         iCallback, iFs, iEntryWatcherList, aEntry, aType ) );
       
   380     if ( ret != KErrNone )
       
   381         {
       
   382         ERROR_LOG3(
       
   383             "CDiskNotifyHandlerImpl::NotifyEntry-aType=%d,aEntry=%S,ret2=%d",
       
   384             aType, &aEntry, ret )
       
   385         return ret;
       
   386         }
       
   387 
       
   388     INFO_LOG1(
       
   389         "CDiskNotifyHandlerImpl::NotifyEntry-count=%d",
       
   390         iEntryWatcherList.Count() )
       
   391 
       
   392     return ret;
       
   393     }
       
   394 
       
   395 // ---------------------------------------------------------------------------
       
   396 // CDiskNotifyHandlerImpl::CancelNotifyEntry
       
   397 // ---------------------------------------------------------------------------
       
   398 //
       
   399 void CDiskNotifyHandlerImpl::CancelNotifyEntry(
       
   400         TNotifyType aType, const TDesC& aEntry )
       
   401     {
       
   402     FUNC_LOG
       
   403 
       
   404     CEntryWatcher::TFindData data;
       
   405     data.iEntry.Set( aEntry );
       
   406     data.iType = aType;
       
   407     TInt i( iEntryWatcherList.FindInOrder(
       
   408         data, CEntryWatcher::CompareFindData ) );
       
   409     if ( i >= 0 && i < iEntryWatcherList.Count() )
       
   410         {
       
   411         INFO_LOG3(
       
   412             "CDiskNotifyHandlerImpl::CancelNotifyEntry-aType=%d,aEntry=%S,i=%d",
       
   413             aType, &aEntry, i )
       
   414         CEntryWatcher* watcher = iEntryWatcherList[ i ];
       
   415         iEntryWatcherList.Remove( i );
       
   416         delete watcher;
       
   417         }
       
   418 
       
   419     INFO_LOG1(
       
   420         "CDiskNotifyHandlerImpl::CancelNotifyEntry-count=%d",
       
   421         iEntryWatcherList.Count() )
       
   422     }
       
   423 
       
   424 // ---------------------------------------------------------------------------
       
   425 // CDiskNotifyHandlerImpl::CancelNotifyEntry
       
   426 // ---------------------------------------------------------------------------
       
   427 //
       
   428 void CDiskNotifyHandlerImpl::CancelNotifyEntry( const TDesC& aEntry )
       
   429     {
       
   430     FUNC_LOG
       
   431 
       
   432     for( ;; )
       
   433         {
       
   434         TInt i( iEntryWatcherList.FindInOrder(
       
   435             aEntry, CEntryWatcher::CompareFind ) );
       
   436         if ( i >= 0 && i < iEntryWatcherList.Count() )
       
   437             {
       
   438             INFO_LOG2(
       
   439                 "CDiskNotifyHandlerImpl::CancelNotifyEntry-aEntry=%S,i=%d",
       
   440                 &aEntry, i )
       
   441             CEntryWatcher* watcher = iEntryWatcherList[ i ];
       
   442             iEntryWatcherList.Remove( i );
       
   443             delete watcher;
       
   444             }
       
   445         else
       
   446             {
       
   447             break; // No matching watchers left
       
   448             }
       
   449         }
       
   450 
       
   451     INFO_LOG1(
       
   452         "CDiskNotifyHandlerImpl::CancelNotifyEntry-count=%d",
       
   453         iEntryWatcherList.Count() )
       
   454     }
       
   455 
       
   456 // ---------------------------------------------------------------------------
       
   457 // CDiskNotifyHandlerImpl::CancelNotifyEntry
       
   458 // ---------------------------------------------------------------------------
       
   459 //
       
   460 void CDiskNotifyHandlerImpl::CancelNotifyEntry()
       
   461     {
       
   462     FUNC_LOG
       
   463 
       
   464     iEntryWatcherList.ResetAndDestroy();
       
   465 
       
   466     INFO_LOG1(
       
   467         "CDiskNotifyHandlerImpl::CancelNotifyEntry-count=%d",
       
   468         iEntryWatcherList.Count() )
       
   469     }
       
   470 
       
   471 // ---------------------------------------------------------------------------
       
   472 // CDiskNotifyHandlerImpl::StartDismount
       
   473 // ---------------------------------------------------------------------------
       
   474 //
       
   475 TInt CDiskNotifyHandlerImpl::StartDismount(
       
   476         TInt aDrive, TTimeIntervalMicroSeconds32 aForcedTimeout )
       
   477     {
       
   478     FUNC_LOG
       
   479 
       
   480     CStartedDismountWatcher* watcher = NULL;
       
   481     TInt i( iStartedDismountWatcherList.FindInOrder(
       
   482         aDrive, CStartedDismountWatcher::CompareFind ) );
       
   483     if ( i >= 0 && i < iStartedDismountWatcherList.Count() )
       
   484         {
       
   485         watcher = iStartedDismountWatcherList[ i ];
       
   486         if ( watcher->IsActive() )
       
   487             {
       
   488             ERROR_LOG2(
       
   489                 "CDiskNotifyHandlerImpl::StartDismount-aDrive=%d,ret1=%d",
       
   490                 aDrive, KErrAlreadyExists )
       
   491             return KErrAlreadyExists;
       
   492             }
       
   493         watcher->Activate( aForcedTimeout );
       
   494         return KErrNone;
       
   495         }
       
   496 
       
   497     TRAPD( ret, watcher = CStartedDismountWatcher::NewL(
       
   498         iCallback, iFs, iStartedDismountWatcherList, aDrive, aForcedTimeout ) );
       
   499     if ( ret != KErrNone )
       
   500         {
       
   501         ERROR_LOG2(
       
   502             "CDiskNotifyHandlerImpl::StartDismount-aDrive=%d,ret2=%d",
       
   503             aDrive, ret )
       
   504         return ret;
       
   505         }
       
   506 
       
   507     INFO_LOG1(
       
   508         "CDiskNotifyHandlerImpl::StartDismount-count=%d",
       
   509         iStartedDismountWatcherList.Count() )
       
   510 
       
   511     return ret;
       
   512     }
       
   513 
       
   514 // ---------------------------------------------------------------------------
       
   515 // CDiskNotifyHandlerImpl::CancelStartedDismount
       
   516 // ---------------------------------------------------------------------------
       
   517 //
       
   518 void CDiskNotifyHandlerImpl::CancelStartedDismount( TInt aDrive )
       
   519     {
       
   520     FUNC_LOG
       
   521 
       
   522     TInt i( iStartedDismountWatcherList.FindInOrder(
       
   523         aDrive, CStartedDismountWatcher::CompareFind ) );
       
   524     if ( i >= 0 && i < iStartedDismountWatcherList.Count() )
       
   525         {
       
   526         INFO_LOG2(
       
   527             "CDiskNotifyHandlerImpl::CancelStartedDismount-aDrive=%d,i=%d",
       
   528             aDrive, i )
       
   529         CStartedDismountWatcher* watcher = iStartedDismountWatcherList[ i ];
       
   530         iStartedDismountWatcherList.Remove( i );
       
   531         delete watcher;
       
   532         }
       
   533 
       
   534     INFO_LOG1(
       
   535         "CDiskNotifyHandlerImpl::CancelStartedDismount-count=%d",
       
   536         iStartedDismountWatcherList.Count() )
       
   537     }
       
   538 
       
   539 // ---------------------------------------------------------------------------
       
   540 // CDiskNotifyHandlerImpl::CancelStartedDismount
       
   541 // ---------------------------------------------------------------------------
       
   542 //
       
   543 void CDiskNotifyHandlerImpl::CancelStartedDismount()
       
   544     {
       
   545     FUNC_LOG
       
   546 
       
   547     iStartedDismountWatcherList.ResetAndDestroy();
       
   548     }
       
   549 
       
   550 // End of File