harvester/monitorplugins/fileplugin/src/filemonitorao.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Feb 2010 23:14:48 +0200
branchRCL_3
changeset 8 6752808b2036
parent 0 c53acadfccc6
child 14 646a02f170b9
permissions -rw-r--r--
Revision: 201003 Kit: 201007

/*
* 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:  Monitors file creations, modifications and deletions.*
*/


#include <mdeobject.h>

#include "harvestercommon.h"
#include "filemonitorao.h"
#include "harvesterlog.h"
#include "fsutil.h"
#include "mdeharvestersession.h"
#include "processoriginmapper.h"
#include "fileeventhandlerao.h"
#include "harvesterpluginfactory.h"

using namespace MdeConstants;

_LIT( KMdsFSPluginFile, "mdsfileserverplugin" );
_LIT( KMdsFSPluginName, "MdsFileServerPlugin" );

// ---------------------------------------------------------------------------
// CFileMonitorAO::NewL()
// ---------------------------------------------------------------------------
//
CFileMonitorAO* CFileMonitorAO::NewL()
    {
    WRITELOG( "CFileMonitorAO::NewL" );

    CFileMonitorAO* self = new (ELeave) CFileMonitorAO;
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::ConstructL()
// ---------------------------------------------------------------------------
//
void CFileMonitorAO::ConstructL()
    {
    WRITELOG( "CFileMonitorAO::ConstructL" );
    
    CActiveScheduler::Add( this );
    iFsConnectOk = EFalse;
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::~CFileMonitorAO()
// ---------------------------------------------------------------------------
//
CFileMonitorAO::~CFileMonitorAO()
    {
    WRITELOG( "CFileMonitorAO::~CFileMonitorAO" );
    
    Cancel();
    
    StopMonitoring();

    delete iMdeSession;
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::StartMonitoring()
// ---------------------------------------------------------------------------
//
TBool CFileMonitorAO::StartMonitoring( MMonitorPluginObserver& aObserver,
	CMdESession* aMdeSession, const TDesC& aPath, CHarvesterPluginFactory* aHarvesterPluginFactory )
    {
    WRITELOG( "CFileMonitorAO::StartMonitoring" );
    
    iObserver = &aObserver;
    iHarvesterPluginFactory = aHarvesterPluginFactory;
    TRAPD( err, iMdeSession = CMdEHarvesterSession::NewL( *aMdeSession ) );
    if ( err != KErrNone )
    	{
    	return EFalse;
    	}
    
    TRAP( err, iFileEventHandler = CFileEventHandlerAO::NewL( aObserver, iMdeSession, aHarvesterPluginFactory ));
    if ( err != KErrNone )
    	{
    	return EFalse;
    	}
    
    TInt error = iFs.Connect();
    if ( error != KErrNone )
    	{
    	iFs.Close();
    	return EFalse;
    	}
	iFsConnectOk = ETrue;

    // add mds fileserver plugin
    error = iFs.AddPlugin( KMdsFSPluginFile );
    if ( error != KErrAlreadyExists )
        {
        error = iFs.MountPlugin( KMdsFSPluginName );
        if ( error != KErrNone )
            {
            return EFalse;
            }
        }
    
    error = iEngine.Open( iFs, KMdsFSPluginPosition );
    if ( error != KErrNone )
        {
        return EFalse;
        }

    iEngine.Enable();
    iEngine.AddNotificationPath( aPath );
    
    StartNotify();
    return ETrue;
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::StartNotify()
// ---------------------------------------------------------------------------
//
void CFileMonitorAO::StartNotify()
    {
    WRITELOG( "CFileMonitorAO::StartNotify" );
    
    ResetMdsFSPStatus();
        
    iEngine.RegisterNotification( iStatusPckg, iStatus );
    
    SetActive();
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::StopMonitoring()
// ---------------------------------------------------------------------------
//
TBool CFileMonitorAO::StopMonitoring()
    {
    WRITELOG( "CFileMonitorAO::StopMonitoring" );

    if ( iFsConnectOk == EFalse )
    	{
    	return ETrue;
    	}
    
    Cancel();
    
    // remove mds fileserver plugin
    iEngine.Disable();
    iEngine.Close();
    
	iFs.DismountPlugin( KMdsFSPluginName );
	iFs.RemovePlugin( KMdsFSPluginName );
    
    iFs.Close();
    iFsConnectOk = EFalse;
    
    return ETrue;
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::RunL()
// From CActive
// ---------------------------------------------------------------------------
//
void CFileMonitorAO::RunL()
    {
    WRITELOG( "CFileMonitorAO::RunL" );
    
    User::LeaveIfError( iStatus.Int() );
    TMdsFSPStatus& status = iStatusPckg();

    iFileEventHandler->AddToQueueL(status);

    StartNotify();
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::ResetMdsFSPStatus()
// ---------------------------------------------------------------------------
//
void CFileMonitorAO::ResetMdsFSPStatus()
    {
    WRITELOG( "CFileMonitorAO::ResetMdsFSPStatus" );
    
    TMdsFSPStatus& status = iStatusPckg();
    
    status.iDriveNumber = 0;
    status.iFileEventType = EMdsFileUnknown;
    status.iFileName.Zero();
    status.iNewFileName.Zero();
    status.iProcessId = TUid::Null();
    }
    
// ---------------------------------------------------------------------------
// CFileMonitorAO::RunError()
// From CActive
// ---------------------------------------------------------------------------
//
TInt CFileMonitorAO::RunError( TInt aError )
    {
    WRITELOG1( "CFileMonitorAO::RunError %d", aError );

    if ( aError == KErrInUse )
        {
        iEngine.NotificationCancel();
        }
    else
        {
        StartNotify();
        }

    return KErrNone;
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::DoCancel()
// From CActive
// ---------------------------------------------------------------------------
//
void CFileMonitorAO::DoCancel()
    {
    WRITELOG( "CFileMonitorAO::DoCancel" );
    iEngine.Disable();
    iEngine.NotificationCancel();
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::CFileMonitorAO()
// Constructor
// ---------------------------------------------------------------------------
//
CFileMonitorAO::CFileMonitorAO() : CActive( KHarvesterPriorityMonitorPlugin )
    {
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::Mapper()
// Returns a handle to CProcessOriginMapper.
// ---------------------------------------------------------------------------
//
CProcessOriginMapper& CFileMonitorAO::Mapper()
    {
    return iFileEventHandler->Mapper();
    }

// ---------------------------------------------------------------------------
// CFileMonitorAO::Mapper()
// Set event caching status
// ---------------------------------------------------------------------------
//
void CFileMonitorAO::SetCachingStatus( TBool aCachingStatus )
	{
	iFileEventHandler->SetCachingStatus( aCachingStatus );
	}