homescreenpluginsrv/hspsmanager/src/hspsfilechangelisteneremu.cpp
changeset 0 79c6a41cd166
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenpluginsrv/hspsmanager/src/hspsfilechangelisteneremu.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,383 @@
+/*
+* Copyright (c) 2002-2004 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:  Xuikon hspshspsFileChangeListenerEmu listens to given file folder and notifies it observer (Only in Emulator environment)
+*                if there is any file change.
+*
+*
+*/
+
+
+#include "hsps_builds_cfg.hrh"
+
+#ifdef _hsps_EMULATOR_SUPPORT_
+
+#include "hspsfilechangelisteneremu.h"
+
+#ifdef HSPS_LOG_ACTIVE
+#include <hspslogbus.h>
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::ChspsFileChangeListenerEmu
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+ChspsFileChangeListenerEmu::ChspsFileChangeListenerEmu( RFs& aFs, 
+                              MhspsEmuFileChangeObserver& aObserver,
+                              TEmuNotifyType aNotifyType) :
+    CTimer(EPriorityLow),
+    iFs( aFs ), 
+    iObserver( aObserver), 
+    iNotifyType( aNotifyType )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::ConstructL( const TDesC& aFullPath )
+    {
+    
+    iFileList = new( ELeave ) CDesCArraySeg(KFilelistGranularity );
+    iState = EEmuStateIdle;
+   
+    if ( aFullPath.Length() > 0 )
+        {
+        iFullPath.Append( aFullPath );
+        }
+    CTimer::ConstructL();
+    CActiveScheduler::Add( this );
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+ChspsFileChangeListenerEmu* ChspsFileChangeListenerEmu::NewL(   RFs& aFs, 
+                                        MhspsEmuFileChangeObserver& aObserver, 
+                                        TEmuNotifyType aNotifyType,
+                                        const TDesC& aFullPath)
+    {
+    ChspsFileChangeListenerEmu* self = new(ELeave) ChspsFileChangeListenerEmu( aFs, 
+        aObserver, 
+        aNotifyType);
+    CleanupStack::PushL( self );
+    self->ConstructL( aFullPath );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::~ChspsFileChangeListenerEmu
+// Destructor
+// ------------------------------------------------------------------------------
+ChspsFileChangeListenerEmu::~ChspsFileChangeListenerEmu()
+    {
+    Cancel();
+    
+    if (iFileList)
+        {
+        delete iFileList;
+        iFileList = NULL;
+        }
+        
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::RunL
+// From CActive. Called when asynchronous request is completed. 
+// Notifies the observer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::RunL()
+    {
+    TBool Diff(EFalse);
+    TInt errCode = KErrNone;
+    if (iStatus.Int() == KErrNone)
+        {
+        CDesCArraySeg* CurFileList = new( ELeave ) CDesCArraySeg(KFilelistGranularity );
+        CleanupStack::PushL(CurFileList);
+
+        // Retrieve current list of files in filesystem
+        TRAP(errCode, RetrieveFileListL(*CurFileList, iFullPath);)
+        if (errCode)
+            {
+#ifdef HSPS_LOG_ACTIVE
+            if( iLogBus )
+                {
+                iLogBus->LogText( _L( "ChspsFileChangeListenerEmu::RunL():RetrieveFileListL, Error=%d" ),
+                        errCode );
+                }
+#endif    
+            }
+
+        // Compare files  
+        TRAP(errCode, Diff = CompareFilesL(*CurFileList);)
+        if (errCode)
+            {
+#ifdef HSPS_LOG_ACTIVE
+            if( iLogBus )
+                {
+                iLogBus->LogText( _L( "ChspsFileChangeListenerEmu::RunL():CompareFilesL, Error=%d" ),
+                        errCode );
+                }
+#endif
+            }
+        
+        // If changes, call observer handle function
+        if (Diff) 
+            {
+            InformObserver(); 
+            }
+
+        // Store current file situation
+        TRAP(errCode, StoreFileListL(*CurFileList);)
+        if (errCode)
+            {
+#ifdef HSPS_LOG_ACTIVE
+            if( iLogBus )
+                {
+                iLogBus->LogText( _L( "ChspsFileChangeListenerEmu::RunL():StoreFileListL, Error=%d" ),
+                        errCode );
+                }
+#endif
+            }
+            
+        CleanupStack::Pop( CurFileList );
+        if ( CurFileList )
+            {
+        	delete CurFileList;
+        	CurFileList = NULL;
+            }
+                        
+        // Restart timer
+        After(KFileSystemPollingTime);  
+        }
+ 
+    }
+
+// -----------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::RunError
+// From CActive. Called when error occurred in asynchronous request
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt ChspsFileChangeListenerEmu::RunError( TInt /*aError*/ )
+    {
+    return KErrNone;
+    }
+    
+// -----------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::DoCancel()
+// Not implemented yet
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//   
+void ChspsFileChangeListenerEmu::DoCancel()
+    {
+    iState = EEmuStateIdle;
+    CTimer::DoCancel();
+    } 
+    
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::StartL
+// Starts polling directory for changes
+// ------------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::StartL()
+    {
+    TInt errCode = KErrNone;
+    
+    if (iState == EEmuStateIdle)
+        {
+        CDesCArraySeg* CurFileList = new( ELeave ) CDesCArraySeg(KFilelistGranularity );
+        
+        CleanupStack::PushL(CurFileList);
+        
+        // Retrieve current list of files in filesystem
+        TRAP(errCode, RetrieveFileListL(*CurFileList, iFullPath);)
+        if (errCode)
+            {
+            User::Leave(errCode);
+            }
+        
+        // Store current file situation
+        TRAP(errCode, StoreFileListL(*CurFileList);)
+        if (errCode)
+            {
+            User::Leave(errCode);
+            }
+        
+        CleanupStack::Pop( CurFileList );
+        if ( CurFileList )
+            {
+        	delete CurFileList;
+        	CurFileList = NULL;
+            }
+
+        // Start timer
+        After(KFileSystemPollingTime);
+        
+        iState = EEmuStateRunning;
+        }
+    
+    }
+   
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::Stop
+// Stops polling of directory
+// ------------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::Stop()
+    {
+    Cancel();
+    }
+
+#ifdef HSPS_LOG_ACTIVE
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::SetLogBus
+// Set log bus to be used.
+// ------------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::SetLogBus( ChspsLogBus* aLogBus )
+    {
+    iLogBus = aLogBus;
+    }
+#endif
+
+    
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::InformObserver
+// Informs observer of file change
+// ------------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::InformObserver()
+    {
+    iObserver.HandleEmuFileSystemChange();        
+    }
+
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::RetrieveFileListL
+// Retrieves current list of files in filesystem
+// ------------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::RetrieveFileListL( CDesCArraySeg& aFileList, const TDesC& aPath )
+    {  
+   CDirScan* dir_list = CDirScan::NewL( iFs );
+   CleanupStack::PushL( dir_list );
+   
+   dir_list->SetScanDataL( aPath,
+           KEntryAttNormal,
+           ESortByName | EAscending,
+           CDirScan::EScanDownTree );
+   
+   CDir* dirEntries = NULL;   
+   dir_list->NextL( dirEntries );   
+   while( dirEntries != NULL )
+       {
+       CleanupStack::PushL( dirEntries );
+       
+       TInt iDirCount = dirEntries->Count();
+       for( TInt i = 0; i < iDirCount; i++ )
+           {
+           const TEntry a = dirEntries->operator[]( i );
+           aFileList.AppendL( a.iName );
+           }
+       
+       CleanupStack::PopAndDestroy( dirEntries );
+       dirEntries = NULL;
+       dir_list->NextL( dirEntries );       
+       }
+
+   CleanupStack::PopAndDestroy(dir_list);
+
+   }
+    
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::StoreFileListL
+// Stores list of files to memory
+// ------------------------------------------------------------------------------
+//
+void ChspsFileChangeListenerEmu::StoreFileListL(CDesCArraySeg& aFileList)
+    {
+    
+    if (iFileList)
+        {
+        iFileList->Reset();
+        
+        for ( TInt i = 0; i < aFileList.Count(); i++)
+            {
+            TPtrC t = aFileList.MdcaPoint(i);
+            iFileList->AppendL(t);	
+            }
+        }
+    }    
+    
+
+// ------------------------------------------------------------------------------
+// ChspsFileChangeListenerEmu::CompareFilesL
+// Compares given filelist to filelist on memory
+// ------------------------------------------------------------------------------
+//
+TBool ChspsFileChangeListenerEmu::CompareFilesL(CDesCArraySeg& aFileList)
+    {
+    TInt p = 0;
+    TBool ret(EFalse);
+    
+    if (iFileList->Count() == aFileList.Count() )
+        {
+        for (p = 0;p < iFileList->Count(); p++)
+            {
+               TBool found(EFalse);
+               TInt i=0;
+               while (!found && i<aFileList.Count())
+                  {
+                     TPtrC t = iFileList->MdcaPoint(i);
+                     if (!(t.CompareF(aFileList.MdcaPoint(p)) ) )
+                     {
+                        found=ETrue;
+                        break;
+                     }
+                     
+                    i++;
+                  }
+                  
+               if (!found)
+               {
+                  ret = ETrue;
+                  break;
+               }
+            }
+        }
+    else
+        {
+        ret = ETrue;        
+        }
+          
+   return ret;
+  
+   }
+
+#endif // _hsps_EMULATOR_SUPPORT_
+    
+// End of File