harvester/monitorplugins/mdsfileserverplugin/src/mdsfileserverplugin.cpp
changeset 28 c461c7fa72c2
parent 23 33ae025ac1e8
child 31 81125601ee77
--- a/harvester/monitorplugins/mdsfileserverplugin/src/mdsfileserverplugin.cpp	Fri May 14 16:17:23 2010 +0300
+++ b/harvester/monitorplugins/mdsfileserverplugin/src/mdsfileserverplugin.cpp	Thu May 27 13:18:43 2010 +0300
@@ -21,6 +21,8 @@
 #include "mdsutils.h"
 
 _LIT( KMdsFileServerPlugin, "MdsFileServerPlugin" );
+_LIT( KExludedThumbPath, "\\_PAlbTN\\");
+_LIT( KExludedMediaArtPath, "\\.mediaartlocal\\");
 
 /* Server name */
 _LIT( KHarvesterServerName, "HarvesterServer" );
@@ -45,8 +47,13 @@
     {
     WRITELOG( "CMdsFileServerPlugin::~CMdsFileServerPlugin()" );
     
-    TRAP_IGNORE( DisableL() );
-    iFsSession.Close();
+#ifdef _DEBUG
+    TRAPD( error, DisableL() );
+    _LIT( KPanicCategory,"CMdsFileServerPlugin" );
+    __ASSERT_DEBUG( error == KErrNone, User::Panic( KPanicCategory,  error ) );
+#else
+    TRAP_IGNORE( DisableL() );    
+#endif
     
     iCreatedFiles.ResetAndDestroy();
     iCreatedFiles.Close();
@@ -81,7 +88,6 @@
 void CMdsFileServerPlugin::InitialiseL()
     {
     WRITELOG( "CMdsFileServerPlugin::InitializeL()" );
-    User::LeaveIfError( iFsSession.Connect() );
     }
     
 //-----------------------------------------------------------------------------
@@ -174,7 +180,7 @@
 //
 TInt CMdsFileServerPlugin::DoRequestL( TFsPluginRequest& aRequest )
 	{
-	// ignore event if there is no any client listening
+	// ignore event if there are not any clients listening
 	if( iConnectionCount <= 0 )
 		{
 		WRITELOG( "CMdsFileServerPlugin::DoRequestL() - no clients -> ignore event" );
@@ -183,9 +189,6 @@
 	
 	TInt function = aRequest.Function();
 	
-	iFileName.Zero();
-    iNewFileName.Zero();
-	
 #ifdef _DEBUG_EVENTS
     PrintDebugEvents( function );
 #endif
@@ -201,7 +204,7 @@
         return KErrNone;
         }
     
-    const TBool formatFunction = function == EFsFormatOpen || function == EFsFormatSubClose;
+    const TBool formatFunction( function == EFsFormatOpen || function == EFsFormatSubClose );
         
     WRITELOG1( "----- CMdsFileServerPlugin::DoRequestL() - plugin function: %d -----", function );
 
@@ -218,9 +221,7 @@
 		}
 
     // get process id
-	TUid processId = { 0 };
-
-	processId = aRequest.Message().SecureId();
+	TUid processId = aRequest.Message().SecureId();
 
 	TBool isDirectory = EFalse;
 	
@@ -235,6 +236,7 @@
         	return KErrNone;
         	}
         WRITELOG2( "CMdsFileServerPlugin::DoRequestL() - newFileName: '%S' %d", &iNewFileName, newNameErr );
+        TBool setToBeDeleted( EFalse );
         if ( newNameErr == KErrNone )
             {
             if ( !CheckPath(iNewFileName) )
@@ -248,47 +250,43 @@
                     }
                 // file moved to ignored path, delete from db
                 function = EFsDelete;
+                setToBeDeleted = ETrue;
                 }
             
-            if ( !CheckAttribs( iNewFileName, isDirectory ) )
+            if( !setToBeDeleted )
                 {
-                WRITELOG( "CMdsFileServerPlugin::DoRequestL() - new path attribute check failed" );
-                if( !CheckAttribs(iFileName, isDirectory) )
+                RFsPlugin fsPlugin( aRequest ); 
+                const TInt rfsPluginErr = fsPlugin.Connect();
+            
+                if ( ( rfsPluginErr == KErrNone ) && !CheckAttribs( iNewFileName, isDirectory, fsPlugin, EFalse ) )
                     {
-                    WRITELOG( "CMdsFileServerPlugin::DoRequestL() - old path attribute check failed" );
-                    WRITELOG( "CMdsFileServerPlugin::DoRequestL() - ignore file" );
-                    return KErrNone;
+                    WRITELOG( "CMdsFileServerPlugin::DoRequestL() - new path attribute check failed" );
+                    if( !CheckAttribs(iFileName, isDirectory, fsPlugin, EFalse) )
+                        {
+                        WRITELOG( "CMdsFileServerPlugin::DoRequestL() - old path attribute check failed" );
+                        WRITELOG( "CMdsFileServerPlugin::DoRequestL() - ignore file" );
+                        fsPlugin.Close();
+                        return KErrNone;
+                        }
+                    // file set to hidden, delete from db
+                    function = EFsDelete;
                     }
-                // file set to hidden, delete from db
-                function = EFsDelete;
+                fsPlugin.Close();
                 }
             }
         else
         	{
-            if ( !CheckPath(iFileName) )
+            if( !CheckIfValidFile(iFileName, isDirectory, aRequest, EFalse)  )
                 {
-                WRITELOG( "CMdsFileServerPlugin::DoRequestL() - path not supported" );
-                return KErrNone;
-                }
-
-            if ( !CheckAttribs(iFileName, isDirectory) )
-                {
-                WRITELOG( "CMdsFileServerPlugin::DoRequestL() - attribute check failed" );
                 return KErrNone;
                 }
         	}
         }
     else if ( !formatFunction )
         {
-        if ( !CheckPath(iFileName) )
+        const TBool deleteFunction( function == EFsDelete );
+        if( !CheckIfValidFile(iFileName, isDirectory, aRequest, deleteFunction)  )
             {
-            WRITELOG( "CMdsFileServerPlugin::DoRequestL() - path not supported" );
-            return KErrNone;
-            }
-
-        if ( !CheckAttribs( iFileName, isDirectory ) )
-            {
-            WRITELOG( "CMdsFileServerPlugin::DoRequestL() - attribute check failed" );
             return KErrNone;
             }
         }
@@ -306,14 +304,23 @@
         case EFsFileCreate:
             {
 #ifdef _DEBUG            
-            if (function == EFsFileCreate)            
+            if (function == EFsFileCreate)
+                {
             	WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileCreate" );
-            if (function == EFsFileReplace)
-            	WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileReplace" );
+                }
 #endif            
             
-            iCreatedFiles.Append( iFileName.AllocL() );
-            User::LeaveIfError( UnregisterIntercept(EFsFileSetModified, EPostIntercept) );
+            HBufC* createdFileName = iFileName.Alloc();
+            if( createdFileName )
+                {
+                // Ownership transferred if succeeded
+                const TInt appendError( iCreatedFiles.Append( createdFileName ) );
+                if( appendError != KErrNone )
+                    {
+                    delete createdFileName;
+                    createdFileName = NULL;
+                    }
+                }
             return KErrNone;
             }
 
@@ -331,13 +338,18 @@
             			delete iCreatedFiles[i];
             			iCreatedFiles.Remove( i );
             			
-						//Have to check whether file has been hidden
-						if ( CheckAttribs( iFileName, isDirectory ) )
-							{
-							found = ETrue;
-							}
-    						
-            			User::LeaveIfError( RegisterIntercept(EFsFileSetModified, EPostIntercept) );
+						//Have to check whether file has been hidden          			
+            	        RFsPlugin fsPlugin( aRequest ); 
+            	        const TInt rfsPluginError( fsPlugin.Connect() );
+            	        if( (rfsPluginError == KErrNone) && CheckAttribs( iFileName, isDirectory, fsPlugin, EFalse ) )
+            	            {
+            	            found = ETrue;
+            	            }
+            	        else if( rfsPluginError != KErrNone )
+            	            {
+            	            found = ETrue;
+            	            }
+            	        fsPlugin.Close();
             			}
             		}
            	
@@ -377,10 +389,34 @@
             break;
 
         case EFsFileSetModified:
-        
+            {
             WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileSetModified" );
-            iModifiedFiles.Append( iFileName.AllocL() );
+            
+            for ( TInt i = iCreatedFiles.Count(); --i >= 0; )
+                {
+                // If file has been created but not closed, do not handle modified events
+                // for that file before the application that has created the file is done with writing 
+                // it to the disk.
+                if ( MdsUtils::Compare( iFileName, *(iCreatedFiles[i]) ) == 0 )
+                    {
+                    return KErrNone;
+                    }
+                } 
+
+            HBufC* modifiedFileName = iFileName.Alloc();
+            if( modifiedFileName )
+                {
+                // Ownership transferred if succeeded
+                const TInt appendError( iModifiedFiles.Append( modifiedFileName ) );
+                if( appendError != KErrNone )
+                    {
+                    delete modifiedFileName;
+                    modifiedFileName = NULL;
+                    }
+                }
+            
             fileEventType = EMdsFileModified;
+            }
             break;
 
         case EFsSetEntry:
@@ -428,17 +464,13 @@
 		    {
 			WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFormatOpen" );
 			// get the drive letter
-		    RFsPlugin fsplugin( aRequest ); 
-	        const TInt rfsPluginError( fsplugin.Connect() );
-	        if( rfsPluginError == KErrNone )
+		    RFsPlugin fsPlugin( aRequest ); 
+		    err = fsPlugin.Connect();
+	        if( err == KErrNone )
 	            {
-	            err = fsplugin.Volume( volInfo, drvNumber );
+	            err = fsPlugin.Volume( volInfo, drvNumber );
 	            }
-	        else
-	            {
-	            err = iFsSession.Volume( volInfo, drvNumber );
-	            }
-	        fsplugin.Close();
+	        fsPlugin.Close();
 	        
 			if( KErrNone == err )
 				{
@@ -525,6 +557,9 @@
             }
         }
     
+    iFileName.Zero();
+    iNewFileName.Zero();
+    
     WRITELOG( "CMdsFileServerPlugin::DoRequestL() - return" );
     return err;
     }
@@ -780,7 +815,12 @@
         HBufC* fn = status.iFileName.Alloc();
         if ( fn )
             {
-            iPaths.InsertInOrder(fn, TLinearOrder<TDesC>(CMdsFileServerPlugin::Compare)); 
+            const TInt insertError( iPaths.InsertInOrder(fn, TLinearOrder<TDesC>(CMdsFileServerPlugin::Compare)));
+            if( insertError != KErrNone )
+                {
+                delete fn;
+                fn = NULL;
+                }
             }
         else
             {
@@ -870,7 +910,12 @@
         HBufC* fn = status.iFileName.Alloc();
         if ( fn )
             {
-            iIgnorePaths.InsertInOrder(fn, TLinearOrder<TDesC>(CMdsFileServerPlugin::Compare)); 
+            const TInt insertError( iIgnorePaths.InsertInOrder(fn, TLinearOrder<TDesC>(CMdsFileServerPlugin::Compare))); 
+            if( insertError != KErrNone )
+                {
+                delete fn;
+                fn = NULL;
+                }
             }
         else
             {
@@ -947,6 +992,14 @@
             {
             return EFalse;
             }
+        else if( MdsUtils::Find( aFilename, KExludedThumbPath ) != KErrNotFound )
+            {
+            return EFalse;
+            }
+        else if( MdsUtils::Find( aFilename, KExludedMediaArtPath ) != KErrNotFound )
+            {
+            return EFalse;
+            }
         }
 
     // check if notification path
@@ -981,7 +1034,7 @@
 //-----------------------------------------------------------------------------
 //
 TBool CMdsFileServerPlugin::CheckAttribs( const TDesC& aFilename, 
-		TBool& aIsDirectory ) const
+		TBool& aIsDirectory, RFsPlugin& aFsPlugin, TBool aDelete ) const
 	{
 	// find last backslash from filename and 
     // take drive and path from filename including last backslash
@@ -993,29 +1046,31 @@
     	}
     TPtrC path( aFilename.Left( pos + 1 ) );
 
-    TUint att = 0;
+    TEntry entry;
 
-    // check if path is hidden or system path
-    TInt err = iFsSession.Att( path, att );
+    // check if path is hidden 
+    TInt err = aFsPlugin.Entry( path, entry );
     if ( err == KErrNone )
-        {
-        if ( att & KEntryAttHidden || att & KEntryAttSystem )
+        {      
+        if ( entry.iAtt & KEntryAttHidden )
             {
             return EFalse;
             }
         }
 
-    // or is the file hidden or system file
-    att = 0;
-    err = iFsSession.Att( aFilename, att );
-    if ( err == KErrNone )
+    if( !aDelete )
         {
-        if ( att & KEntryAttHidden || att & KEntryAttSystem )
+        // check if the file hidden or system file
+        err = aFsPlugin.Entry( aFilename, entry );
+        if ( err == KErrNone )
             {
-            return EFalse;
-            }
+            if ( entry.iAtt & KEntryAttHidden || entry.iAtt & KEntryAttSystem )
+                {
+                return EFalse;
+                }
         
-        aIsDirectory = att & KEntryAttDir ? ETrue : EFalse;
+            aIsDirectory = entry.iAtt & KEntryAttDir ? ETrue : EFalse;
+            }    
         }
 
     return ETrue;
@@ -1074,6 +1129,35 @@
     }
 
 //-----------------------------------------------------------------------------
+// CheckIfValidFile
+//-----------------------------------------------------------------------------
+//
+TBool CMdsFileServerPlugin::CheckIfValidFile( const TDesC& aFilename, 
+        TBool& aIsDirectory, TFsPluginRequest& aRequest, TBool aDelete )
+    {
+    if ( !CheckPath(aFilename) )
+        {
+        WRITELOG( "CMdsFileServerPlugin::CheckIfValidFile() - path not supported" );
+        return EFalse;
+        }
+
+    RFsPlugin fsPlugin( aRequest ); 
+    const TInt rfsPluginErr = fsPlugin.Connect();
+    
+    if( rfsPluginErr == KErrNone )
+        {
+        if ( !CheckAttribs(aFilename, aIsDirectory, fsPlugin, aDelete) )
+            {
+            WRITELOG( "CMdsFileServerPlugin::CheckIfValidFile() - attribute check failed" );
+            return EFalse;
+            }
+        }
+    fsPlugin.Close(); 
+    
+    return ETrue;
+    }
+
+//-----------------------------------------------------------------------------
 // CMdsFileServerPluginFactory implementation
 //-----------------------------------------------------------------------------
 //