diff -r 000000000000 -r c53acadfccc6 harvester/monitorplugins/mdsfileserverplugin/src/mdsfileserverplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/monitorplugins/mdsfileserverplugin/src/mdsfileserverplugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,1235 @@ +/* +* Copyright (c) 2006-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: Monitors file creations, modifications and deletions.* +*/ + + +#include +#include "mdsfileserverplugin.h" +#include "harvesterlog.h" +#include "mdsutils.h" + +_LIT( KMdsFileServerPlugin, "MdsFileServerPlugin" ); + +/* Server name */ +_LIT( KHarvesterServerName, "HarvesterServer" ); + +const TInt KCleanQueueTreshoald( 1000 ); + +//----------------------------------------------------------------------------- +// CMdsFileServerPlugin implementation +//----------------------------------------------------------------------------- +// +CMdsFileServerPlugin::CMdsFileServerPlugin() +: iFormatOldMediaId( 0 ), iFormatDriveNumber( -1 ), iConnectionCount( 0 ) + { + WRITELOG( "CMdsFileServerPlugin::CMdsFileServerPlugin()" ); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +CMdsFileServerPlugin::~CMdsFileServerPlugin() + { + WRITELOG( "CMdsFileServerPlugin::~CMdsFileServerPlugin()" ); + + TRAP_IGNORE( DisableL() ); + iFsSession.Close(); + + iCreatedFiles.ResetAndDestroy(); + iCreatedFiles.Close(); + + iPaths.ResetAndDestroy(); + iPaths.Close(); + + iIgnorePaths.ResetAndDestroy(); + iIgnorePaths.Close(); + + iQueue.ResetAndDestroy(); + iQueue.Close(); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +CMdsFileServerPlugin* CMdsFileServerPlugin::NewL() + { + WRITELOG( "CMdsFileServerPlugin::NewL()" ); + return new (ELeave) CMdsFileServerPlugin; + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::InitialiseL() + { + WRITELOG( "CMdsFileServerPlugin::InitializeL()" ); + User::LeaveIfError( iFsSession.Connect() ); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::EnableL() + { + WRITELOG( "CMdsFileServerPlugin::EnableL()" ); + User::LeaveIfError( RegisterIntercept(EFsFileCreate, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsFileRename, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsRename, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsDelete, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsFileReplace, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsReplace, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsFileSetModified, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsFileSubClose, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsSetEntry, EPostIntercept) ); + // format events + User::LeaveIfError( RegisterIntercept(EFsFormatSubClose, EPostIntercept) ); + User::LeaveIfError( RegisterIntercept(EFsFormatOpen, EPreIntercept) ); + +#ifdef _DEBUG_EVENTS + RegisterDebugEventsL(); +#endif + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::DisableL() + { + WRITELOG( "CMdsFileServerPlugin::DisableL()" ); + User::LeaveIfError( UnregisterIntercept(EFsFileCreate, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsFileRename, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsRename, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsDelete, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsFileReplace, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsReplace, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsFileSetModified, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsFileSubClose, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsSetEntry, EPrePostIntercept) ); + // format events + User::LeaveIfError( UnregisterIntercept(EFsFormatSubClose, EPostIntercept) ); + User::LeaveIfError( UnregisterIntercept(EFsFormatOpen, EPreIntercept) ); + +#ifdef _DEBUG_EVENTS + UnregisterDebugEventsL(); +#endif + } + +//----------------------------------------------------------------------------- +// AddConnection +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::AddConnection() + { + WRITELOG( "CMdsFileServerPlugin::AddConnection()" ); + + ++iConnectionCount; + iPendingEvents = 0; + } + +//----------------------------------------------------------------------------- +// RemoveConnection +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::RemoveConnection() + { + WRITELOG( "CMdsFileServerPlugin::RemoveConnection()" ); + + --iConnectionCount; + + // remove notification request if this was last connection + if( iConnectionCount <= 0 ) + { + WRITELOG( "CMdsFileServerPlugin::RemoveConnection() last connection" ); + + iNotification = NULL; + iPendingEvents = 0; + iQueue.ResetAndDestroy(); + iQueue.Compress(); + } + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPlugin::DoRequestL( TFsPluginRequest& aRequest ) + { + // ignore event if there is no any client listening + if( iConnectionCount <= 0 ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - no clients -> ignore event" ); + return KErrNone; + } + + TInt function = aRequest.Function(); + + iFileName.Zero(); + +#ifdef _DEBUG_EVENTS + PrintDebugEvents( function ); +#endif + + if ( function == EFsFileSubClose && iCreatedFiles.Count() == 0 ) + { +#ifdef _DEBUG_EVENTS + if( GetName( &aRequest, iFileName ) == KErrNone && iFileName.Length() <= KMaxFileName ) + { + WRITELOG1("Dropping subclose %S",&iFileName); + } +#endif + return KErrNone; + } + + const TBool formatFunction = function == EFsFormatOpen || function == EFsFormatSubClose; + iNewFileName.Zero(); + + WRITELOG1( "----- CMdsFileServerPlugin::DoRequestL() - plugin function: %d -----", function ); + + if ( !formatFunction ) + { + if( GetName( &aRequest, iFileName ) != KErrNone || iFileName.Length() > KMaxFileName ) + { + return KErrNone; + } + else + { + WRITELOG1( "CMdsFileServerPlugin::DoRequestL() - fileName: %S", &iFileName ); + } + } + + // get process id + TUid processId = { 0 }; + + processId = aRequest.Message().SecureId(); + + TBool isDirectory = EFalse; + + // if rename, check destination path + if ( function == EFsRename || function == EFsFileRename || + function == EFsReplace || function == EFsFileReplace || + function == EFsSetEntry ) + { + const TInt newNameErr = GetNewName( &aRequest, iNewFileName ); + if ( iNewFileName.Length() > KMaxFileName ) + { + return KErrNone; + } + WRITELOG2( "CMdsFileServerPlugin::DoRequestL() - newFileName: '%S' %d", &iNewFileName, newNameErr ); + if ( newNameErr == KErrNone ) + { + if ( !CheckPath(iNewFileName) ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - new path not supported" ); + if( !CheckPath(iFileName) ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - old path not supported" ); + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - ignore file" ); + return KErrNone; + } + // file moved to ignored path, delete from db + function = EFsDelete; + } + + if ( !CheckAttribs( iNewFileName, isDirectory ) ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - new path attribute check failed" ); + if( !CheckAttribs(iFileName, isDirectory) ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - old path attribute check failed" ); + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - ignore file" ); + return KErrNone; + } + // file set to hidden, delete from db + function = EFsDelete; + } + } + else + { + if ( !CheckPath(iFileName) ) + { + 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) ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - path not supported" ); + return KErrNone; + } + + if ( !CheckAttribs( iFileName, isDirectory ) ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - attribute check failed" ); + return KErrNone; + } + } + + TInt fileEventType = EMdsFileUnknown; + TInt drvNumber = aRequest.DriveNumber(); + TVolumeInfo volInfo; + + WRITELOG1( "CMdsFileServerPlugin::DoRequestL() - drive number: %d", drvNumber ); + + TInt err( KErrNone ); + + switch( function ) + { + case EFsFileCreate: + { +#ifdef _DEBUG + if (function == EFsFileCreate) + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileCreate" ); + if (function == EFsFileReplace) + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileReplace" ); +#endif + + iCreatedFiles.Append( iFileName.AllocL() ); + User::LeaveIfError( UnregisterIntercept(EFsFileSetModified, EPostIntercept) ); + return KErrNone; + } + + case EFsFileSubClose: + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileSubClose" ); + + TBool found = EFalse; + + for ( TInt i = iCreatedFiles.Count(); --i >= 0; ) + { + if ( MdsUtils::Compare( iFileName, *(iCreatedFiles[i]) ) == 0 ) + { + fileEventType = EMdsFileCreated; + 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) ); + } + } + + if( iCreatedFiles.Count() == 0 ) + { + iCreatedFiles.GranularCompress(); + } + + if ( !found ) + { + return KErrNone; + } + } + break; + + case EFsRename: + { + WRITELOG1( "CMdsFileServerPlugin::DoRequestL() - EFsRename, new file: %S", &iNewFileName ); + + if ( isDirectory ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - it is directory!" ); + fileEventType = EMdsDirRenamed; + AddBackslashIfNeeded( iNewFileName ); // new file name + AddBackslashIfNeeded( iFileName ); // old file name + } + else + { + fileEventType = EMdsFileRenamed; + } + } + break; + + case EFsFileRename: + WRITELOG1( "CMdsFileServerPlugin::DoRequestL() - EFsFileRename, new file: %S", &iNewFileName ); + fileEventType = EMdsFileRenamed; + break; + + case EFsFileSetModified: + case EFsSetEntry: + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFileSetModified" ); + fileEventType = EMdsFileModified; + break; + + case EFsFileReplace: + case EFsReplace: + WRITELOG1( "CMdsFileServerPlugin::DoRequestL() - EFsReplace/EFsFileReplace, new file: %S", &iNewFileName ); + fileEventType = EMdsFileReplaced; + break; + + case EFsDelete: + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsDelete" ); + fileEventType = EMdsFileDeleted; + break; + + case EFsFormatOpen: + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFormatOpen" ); + // get the drive letter + err = iFsSession.Volume( volInfo, drvNumber ); + if( KErrNone == err ) + { + iFormatOldMediaId = volInfo.iUniqueID; + iFormatDriveNumber = drvNumber; + fileEventType = EMdsDriveFormatted; + processId.iUid = 0; + } + else + { + iFormatDriveNumber = -1; + } + return KErrNone; + + case EFsFormatSubClose: + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - EFsFormatSubClose" ); + if ( iFormatDriveNumber < 0 ) + { + return KErrNone; + } + drvNumber = iFormatOldMediaId; + volInfo.iUniqueID = iFormatOldMediaId; + iFormatOldMediaId = 0; + iFormatDriveNumber = -1; + fileEventType = EMdsDriveFormatted; + if ( processId.iUid == 0 ) + { + processId.iUid = 1; + } + break; + + default: + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - Unknown function" ); + return KErrNone; + } + + if ( iNotification ) + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - iNotification found" ); + TMdsFSPStatusPckg clientStatusBuf; + TMdsFSPStatus& clientStatus = clientStatusBuf(); + clientStatus.iDriveNumber = drvNumber; + clientStatus.iDriveMediaId = volInfo.iUniqueID; + clientStatus.iFileName.Copy( iFileName ); + clientStatus.iNewFileName.Copy( iNewFileName ); + clientStatus.iFileEventType = fileEventType; + clientStatus.iProcessId = processId; + + TRAP( err, iNotification->WriteParam1L(clientStatusBuf) ); + iNotification->Complete( err ); + iNotification = NULL; + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - iNotification complete" ); + } + else // no notification ready, put in the queue + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - iNotification not found. Put in the queue" ); + + // Check if harvester is still alive + if( CheckHarvesterStatus() ) + { + CMdsFSPQueueItem* queueItem = CMdsFSPQueueItem::NewL(); + CleanupStack::PushL( queueItem ); + queueItem->iDriveNumber = drvNumber; + queueItem->iDriveMediaId = volInfo.iUniqueID; + queueItem->iFileName = iFileName.AllocL(); + queueItem->iNewFileName = iNewFileName.AllocL(); + queueItem->iFileEventType = fileEventType; + queueItem->iProcessId = processId; + + iQueue.AppendL( queueItem ); // owenership is transferred + CleanupStack::Pop( queueItem ); + err = KErrNone; + iPendingEvents++; + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - added to queue" ); + } + else + { + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - Harvester process not detected" ); + iConnectionCount = 0; + iPendingEvents = 0; + iQueue.ResetAndDestroy(); + iQueue.Compress(); + } + } + + WRITELOG( "CMdsFileServerPlugin::DoRequestL() - return" ); + return err; + } + +//----------------------------------------------------------------------------- +// CMdsFileServerPluginConn implementation +//----------------------------------------------------------------------------- +class CMdsFileServerPluginConn : public CFsPluginConn + { + public: + static CMdsFileServerPluginConn* NewL( CMdsFileServerPlugin& aPlugin ); + virtual ~CMdsFileServerPluginConn(); + + virtual TInt DoControl( CFsPluginConnRequest& aRequest ); + virtual void DoRequest( CFsPluginConnRequest& aRequest ); + virtual void DoCancel( TInt aReqMask ); + + private: + CMdsFileServerPluginConn( CMdsFileServerPlugin& aPlugin ); + + CMdsFileServerPlugin& iPlugin; + + RMessage2* iMessage; + }; + +/** +* Leaving New function for the plugin +* @internalComponent +*/ +CMdsFileServerPluginConn* CMdsFileServerPluginConn::NewL( + CMdsFileServerPlugin& aPlugin ) + { + WRITELOG( "CMdsFileServerPluginConn::NewL()" ); + return new (ELeave) CMdsFileServerPluginConn( aPlugin ); + } + + +/** +* Constructor for the plugin +* @internalComponent +*/ +CMdsFileServerPluginConn::CMdsFileServerPluginConn( + CMdsFileServerPlugin& aPlugin ) : + iPlugin( aPlugin ) + { + WRITELOG( "CMdsFileServerPluginConn::CMdsFileServerPluginConn()" ); + + iPlugin.AddConnection(); + } + + +/** +* The destructor for the test virus scanner hook. +* @internalComponent +*/ +CMdsFileServerPluginConn::~CMdsFileServerPluginConn() + { + WRITELOG( "CMdsFileServerPluginConn::~CMdsFileServerPluginConn()" ); + + iPlugin.RemoveConnection(); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPluginConn::DoControl( CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPluginConn::DoControl()" ); + TInt err = KErrNotSupported; + + CMdsFileServerPlugin& myPlugin = *(CMdsFileServerPlugin*)Plugin(); + + switch( aRequest.Function() ) + { + case EMdsFSPOpEnable: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpEnable" ); + TRAP( err, myPlugin.EnableL() ); + break; + } + + case EMdsFSPOpDisable: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpDisable" ); + TRAP( err, myPlugin.DisableL() ); + break; + } + + default: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - Unknown Control" ); + break; + } + } + + return err; + } + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPluginConn::DoRequest( CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPluginConn::DoRequest()" ); + CMdsFileServerPlugin& myPlugin = *(CMdsFileServerPlugin*)Plugin(); + + switch( aRequest.Function() ) + { + case EMdsFSPOpRegisterNotification: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpRegisterNotification" ); + const TInt err = myPlugin.RegisterNotification( aRequest ); + + if ( err != KErrNone ) + { + aRequest.Complete( err ); + } + break; + } + + case EMdsFSPOpAddNotificationPath: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpAddNotificationPath" ); + const TInt err = myPlugin.AddNotificationPath( aRequest ); + aRequest.Complete( err ); + break; + } + + case EMdsFSPOpRemoveNotificationPath: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpRemoveNotificationPath" ); + const TInt err = myPlugin.RemoveNotificationPath( aRequest ); + aRequest.Complete( err ); + break; + } + + case EMdsFSPOpAddIgnorePath: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpAddIgnorePath" ); + const TInt err = myPlugin.AddIgnorePath( aRequest ); + aRequest.Complete( err ); + break; + } + + case EMdsFSPOpRemoveIgnorePath: + { + WRITELOG( "CMdsFileServerPluginConn::DoControl() - EMdsFSPOpRemoveIgnorePath" ); + const TInt err = myPlugin.RemoveIgnorePath( aRequest ); + aRequest.Complete( err ); + break; + } + default: + break; + } + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPluginConn::DoCancel( TInt /*aReqMask*/ ) + { + WRITELOG( "CMdsFileServerPluginConn::DoCancel()" ); + iRequestQue.DoCancelAll( KErrCancel ); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +CFsPluginConn* CMdsFileServerPlugin::NewPluginConnL() + { + WRITELOG( "CMdsFileServerPluginConn::NewPluginConnL()" ); + return CMdsFileServerPluginConn::NewL( *this ); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPlugin::RegisterNotification( CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPlugin::RegisterNotification()" ); + + if ( iNotification ) + { + return KErrInUse; + } + + iNotification = &aRequest; + + if ( iQueue.Count() > 0 ) + { + WRITELOG( "CMdsFileServerPlugin::RegisterNotification() - item in queue" ); + + CMdsFSPQueueItem* queueItem = iQueue[0]; + + TMdsFSPStatusPckg pckg; + TMdsFSPStatus& status = pckg(); + + queueItem->GetAsFspStatus( status ); + + TRAPD( err, iNotification->WriteParam1L(pckg) ); + iNotification->Complete( err ); + iNotification = NULL; + + delete queueItem; + queueItem = NULL; + iQueue.Remove( 0 ); + } + else + { + iQueue.GranularCompress(); + } + + return KErrNone; + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPlugin::AddNotificationPath( const CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPlugin::AddNotificationPath()" ); + TInt err = KErrNone; + + TMdsFSPStatusPckg pckg; + TRAP( err, aRequest.ReadParam1L(pckg) ); + + if ( err != KErrNone ) + { + return err; + } + + TMdsFSPStatus& status = pckg(); + + if ( status.iFileName.Length() > 0 ) + { + // check if already exists + for ( TInt i = iPaths.Count(); --i >= 0; ) + { + TDesC* tf = iPaths[i]; + if ( MdsUtils::Compare( status.iFileName, *tf ) == 0 ) + { + return KErrNone; + } + } + + WRITELOG1( "CMdsFileServerPlugin::AddNotificationPath() - add path: %S", &status.iFileName ); + HBufC* fn = status.iFileName.Alloc(); + if ( fn ) + { + iPaths.Append( fn ); + } + } + else + { + err = KErrNotFound; + } + + return err; + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPlugin::RemoveNotificationPath( const CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPlugin::RemoveNotificationPath()" ); + TInt err = KErrNone; + + TMdsFSPStatusPckg pckg; + TRAP( err, aRequest.ReadParam1L(pckg) ); + + if ( err != KErrNone ) + { + return err; + } + + TMdsFSPStatus& status = pckg(); + + if ( status.iFileName.Length() > 0 ) + { + // check if already exist + if ( iPaths.Count() > 0 ) + { + for ( TInt i = iPaths.Count(); --i >= 0; ) + { + TDesC* tf = iPaths[i]; + if ( MdsUtils::Compare( status.iFileName, *tf ) == 0 ) + { + WRITELOG1( "CMdsFileServerPlugin::RemoveNotificationPath() - remove path: %S", &status.iFileName ); + delete tf; + tf = NULL; + iPaths.Remove( i ); + } + } + } + } + else + { + err = KErrNotFound; + } + + return err; + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPlugin::AddIgnorePath( const CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPlugin::AddIgnorePath()" ); + TInt err = KErrNone; + + TMdsFSPStatusPckg pckg; + TRAP( err, aRequest.ReadParam1L(pckg) ); + + if ( err != KErrNone ) + { + return err; + } + + TMdsFSPStatus& status = pckg(); + + if ( status.iFileName.Length() > 0 ) + { + // check if already exist + for ( TInt i = iIgnorePaths.Count(); --i >= 0; ) + { + TDesC* tf = iIgnorePaths[i]; + if ( MdsUtils::Compare( status.iFileName, *tf ) == 0 ) + { + return KErrNone; + } + } + + WRITELOG1( "CMdsFileServerPlugin::AddIgnorePath() - add path: %S", &status.iFileName ); + HBufC* fn = status.iFileName.Alloc(); + if ( fn ) + { + iIgnorePaths.Append( fn ); // ownership is transferred + } + } + else + { + err = KErrNotFound; + } + + return err; + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +TInt CMdsFileServerPlugin::RemoveIgnorePath( const CFsPluginConnRequest& aRequest ) + { + WRITELOG( "CMdsFileServerPlugin::RemoveIgnorePath()" ); + TInt err = KErrNone; + + TMdsFSPStatusPckg pckg; + TRAP( err, aRequest.ReadParam1L(pckg) ); + + if ( err != KErrNone ) + { + return err; + } + + TMdsFSPStatus& status = pckg(); + + if ( status.iFileName.Length() > 0 ) + { + // check if already exist + for ( TInt i = iIgnorePaths.Count(); --i >= 0; ) + { + TDesC* tf = iIgnorePaths[i]; + if ( MdsUtils::Compare(status.iFileName, *tf ) == 0 ) + { + WRITELOG1( "CMdsFileServerPlugin::RemoveIgnorePath() - remove path: %S", &status.iFileName ); + delete tf; + tf = NULL; + iIgnorePaths.Remove( i ); + } + } + } + else + { + err = KErrNotFound; + } + + return err; + } + +//----------------------------------------------------------------------------- +// CheckPath +//----------------------------------------------------------------------------- +// +TBool CMdsFileServerPlugin::CheckPath( const TDesC& aFilename ) const + { + // check if ignored pathlist + for ( TInt i = iIgnorePaths.Count(); --i >= 0; ) + { + TDesC* pathName = iIgnorePaths[i]; + if ( MdsUtils::Find( aFilename, *pathName ) != KErrNotFound ) + { + return EFalse; + } + } + + // check if notification path + if ( iPaths.Count() > 0 ) + { + for ( TInt i = iPaths.Count(); --i >= 0; ) + { + TDesC* pathName = iPaths[i]; + if ( MdsUtils::Find( aFilename, *pathName ) != KErrNotFound ) + { + return ETrue; + } + } + } + else + { + return ETrue; + } + + return EFalse; + } + +//----------------------------------------------------------------------------- +// CheckAttribs +//----------------------------------------------------------------------------- +// +TBool CMdsFileServerPlugin::CheckAttribs( const TDesC& aFilename, + TBool& aIsDirectory ) const + { + // find last backslash from filename and + // take drive and path from filename including last backslash + const TChar KBackslashChar( '\\' ); + TInt pos = aFilename.LocateReverse( KBackslashChar ); + if ( KErrNotFound == pos ) + { + return ETrue; + } + TPtrC path( aFilename.Left( pos + 1 ) ); + + TUint att = 0; + + // check if path is hidden or system path + TInt err = iFsSession.Att( path, att ); + if ( err == KErrNone ) + { + if ( att & KEntryAttHidden || att & KEntryAttSystem ) + { + return EFalse; + } + } + + // or is the file hidden or system file + att = 0; + err = iFsSession.Att( aFilename, att ); + if ( err == KErrNone ) + { + if ( att & KEntryAttHidden || att & KEntryAttSystem ) + { + return EFalse; + } + + aIsDirectory = att & KEntryAttDir ? ETrue : EFalse; + } + + return ETrue; + } + +//----------------------------------------------------------------------------- +// AddBackslashIfNeeded +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::AddBackslashIfNeeded( TDes& aDirName ) const + { + WRITELOG1( "CMdsFileServerPlugin::AddBackslashIfNeeded() - begin, dirName: %S", &aDirName ); + + const TChar KBackslashChar( '\\' ); + + const TInt lastChar = aDirName.Length() - 1; + + // If it is directory which not contain backslash. + if ( KBackslashChar != aDirName[lastChar] ) + { + aDirName.Append( KBackslashChar ); + } + + WRITELOG1( "CMdsFileServerPlugin::AddBackslashIfNeeded() - end, dirName: %S", &aDirName ); + } + +//----------------------------------------------------------------------------- +// CheckHarvesterStatus +//----------------------------------------------------------------------------- +// +TBool CMdsFileServerPlugin::CheckHarvesterStatus() + { + WRITELOG( "CMdsFileServerPlugin::CheckHarvesterStatus() - begin" ); + + if( iPendingEvents <= KCleanQueueTreshoald ) + { + WRITELOG( "CMdsFileServerPlugin::CheckHarvesterStatus() - end" ); + return ETrue; + } + + TFindServer findHarvesterServer( KHarvesterServerName ); + TFullName name; + + TInt result = findHarvesterServer.Next( name ); + if ( result == KErrNone ) + { + WRITELOG( "CMdsFileServerPlugin::CheckHarvesterStatus() - HarvesterServer running" ); + WRITELOG( "CMdsFileServerPlugin::CheckHarvesterStatus() - end" ); + + iPendingEvents = 0; + return ETrue; + } + + WRITELOG( "CMdsFileServerPlugin::CheckHarvesterStatus() - end" ); + return EFalse; + } + +//----------------------------------------------------------------------------- +// CMdsFileServerPluginFactory implementation +//----------------------------------------------------------------------------- +// +class CMdsFileServerPluginFactory : public CFsPluginFactory + { + public: + CMdsFileServerPluginFactory(); + virtual TInt Install(); + virtual CFsPlugin* NewPluginL(); + virtual TInt UniquePosition(); + }; + +// Constructor for the plugin factory +// @internalComponent +CMdsFileServerPluginFactory::CMdsFileServerPluginFactory() + { + WRITELOG( "CMdsFileServerPluginFactory::CMdsFileServerPluginFactory()" ); + } + +// Install function for the plugin factory +// @internalComponent +TInt CMdsFileServerPluginFactory::Install() + { + WRITELOG( "CMdsFileServerPluginFactory::Install()" ); + iSupportedDrives = KPluginAutoAttach; + + return( SetName(&KMdsFileServerPlugin) ); + } + +// @internalComponent +TInt CMdsFileServerPluginFactory::UniquePosition() + { + WRITELOG( "CMdsFileServerPluginFactory::UniquePosition()" ); + return( KMdsFSPluginPosition ); + } + +// Plugin factory function +// @internalComponent +CFsPlugin* CMdsFileServerPluginFactory::NewPluginL() + { + WRITELOG( "CMdsFileServerPluginFactory::NewPluginL()" ); + return CMdsFileServerPlugin::NewL(); + } + +// Create a new Plugin +// @internalComponent +extern "C" + { + EXPORT_C CFsPluginFactory* CreateFileSystem() + { + WRITELOG( "CMdsFileServerPluginFactory::CreateFileSystem" ); + return( new CMdsFileServerPluginFactory() ); + } + } + +#ifdef _DEBUG_EVENTS + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::RegisterDebugEventsL() + { + User::LeaveIfError( RegisterIntercept( EFsFileDuplicate, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileCreate, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileWrite, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileFlush, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileSetAtt, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileChangeMode, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsDelete, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileAdopt, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileLock, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileSize, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileRename, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsRename, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileOpen, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileTemp, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileUnLock, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileSetSize, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileDrive, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsReplace, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileSubClose, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileRead, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileSeek, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileAtt, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileSet, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsFileName, EPreIntercept) ); + User::LeaveIfError( RegisterIntercept( EFsDirOpen, EPreIntercept) ); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::UnregisterDebugEventsL() + { + User::LeaveIfError( UnregisterIntercept( EFsFileDuplicate, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileCreate, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileWrite, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileFlush, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileSetAtt, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileChangeMode, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsDelete, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileAdopt, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileLock, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileSize, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileRename, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsRename, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileOpen, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileTemp, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileUnLock, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileSetSize, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileDrive, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsReplace, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileSubClose, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileRead, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileSeek, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileAtt, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileSet, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsFileName, EPrePostIntercept) ); + User::LeaveIfError( UnregisterIntercept( EFsDirOpen, EPrePostIntercept) ); + } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +// +void CMdsFileServerPlugin::PrintDebugEvents( TInt aFunction ) + { + switch ( aFunction ) + { + case EFsFileDuplicate: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileDuplicate" ); + break; + + case EFsFileCreate: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileCreate" ); + break; + case EFsFileWrite: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileWrite" ); + break; + case EFsFileFlush: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileFlush" ); + break; + case EFsFileSetAtt: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSetAtt" ); + break; + case EFsFileChangeMode: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileChangeMode" ); + break; + case EFsDelete: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsDelete" ); + break; + case EFsFileAdopt: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileAdopt" ); + break; + case EFsFileReplace: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileReplace" ); + break; + case EFsFileLock: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileLock" ); + break; + case EFsFileSize: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSize" ); + break; + case EFsFileModified: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileModified" ); + break; + case EFsFileRename: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileRename" ); + break; + case EFsRename: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsRename" ); + break; + case EFsFileOpen: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileOpen" ); + break; + case EFsFileTemp: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileTemp" ); + break; + case EFsFileUnLock: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileUnLock" ); + break; + case EFsFileSetSize: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSetSize" ); + break; + case EFsFileSetModified: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSetModified" ); + break; + case EFsFileDrive: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileDrive" ); + break; + case EFsReplace: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsReplace" ); + break; + case EFsFileSubClose: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSubClose" ); + break; + case EFsFileRead: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileRead" ); + break; + case EFsFileSeek: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSeek" ); + break; + case EFsFileAtt: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileAtt" ); + break; + case EFsFileSet: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileSet" ); + break; + case EFsFileName: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsFileName" ); + break; + case EFsDirOpen: + WRITELOG( "CMdsFileServerPlugin::PrintDebugEvents() - EFsDirOpen" ); + break; + default: + break; + } + } +#endif