memspy/Driver/Kernel/Source/MemSpyDriverDevice.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:57:15 +0200
changeset 0 a03f92240627
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 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:
*
*/

#include "MemSpyDriverDevice.h"

// System includes
#include <memspy/driver/memspydriverconstants.h>

// User includes
#include "MemSpyDriverUtils.h"
#include "MemSpyDriverOSAdaption.h"
#include "MemSpyDriverEventMonitor.h"
#include "MemSpyDriverLogicalChannel.h"
#include "MemSpyDriverSuspensionManager.h"
#include "MemSpyDriverInspectedProcessManager.h"



DMemSpyDriverDevice::DMemSpyDriverDevice()
	{
	iVersion = KMemSpyDriverVersion();
	}


DMemSpyDriverDevice::~DMemSpyDriverDevice()
    {
	TRACE( Kern::Printf("DMemSpyDriverDevice::~DMemSpyDriverDevice() - START"));

    Cleanup();
    
    TRACE( Kern::Printf("DMemSpyDriverDevice::~DMemSpyDriverDevice() - END"));
    }


TInt DMemSpyDriverDevice::Install()
	{
	TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - START"));
    TInt error = KErrNone;
    //
	TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - creating event monitor..."));
	iEventMonitor = new DMemSpyEventMonitor();
	//
	if	( iEventMonitor != NULL )
    	{
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - constructing event monitor..."));
		error = iEventMonitor->Create( this );
		//
		if	( error == KErrNone )
			{
	        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - starting event monitor..."));
			error = iEventMonitor->Start();
			//
			if	( error == KErrNone )
				{
	            TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - creating process manager..."));
                iProcessManager = new DMemSpyInspectedProcessManager();
                //
                if  ( iProcessManager != NULL )
                    {
	                TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - constructing process manager..."));
                    error = iProcessManager->Create( this );
                    //
                    if  ( error == KErrNone )
                        {
	                    TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - creating process manager..."));
                        iSuspensionManager = new DMemSpySuspensionManager( *this );
                        //
                        if  ( iSuspensionManager != NULL )
                            {
	                        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - constructing process manager..."));
                            error = iSuspensionManager->Construct();
                            //
                            if  ( error == KErrNone )
                                {
	                            TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - creating os adaption..."));
                                iOSAdaption = new DMemSpyDriverOSAdaption( *this );
                                //
                                if  ( iOSAdaption != NULL )
                                    {
	                                TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - constructing os adaption..."));
                                    error = iOSAdaption->Construct();
                                    //
                                    if  ( error == KErrNone )
                                        {
                                        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - setting name..."));
				                        error = SetName( &KMemSpyDriverDeviceName );
                                        }
                                    }
                                }
                            }
                        }
                    }
				}
			}
        }
    
    // Handle errors
    if  ( error != KErrNone )
        {
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - error: %d", error ));
        if  ( iProcessManager )
            {
	        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - closing PM" ));
            iProcessManager->Close( NULL );
            iProcessManager = NULL;
            }
        if  ( iEventMonitor )
            {
	        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - stopping EM" ));
            iEventMonitor->Stop();
	        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - closing EM" ));
            iEventMonitor->Close();
	        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - deleting EM" ));
            iEventMonitor = NULL;
            }
        if  ( iSuspensionManager )
            {
	        TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - deleting SM" ));
            delete iSuspensionManager;
            iSuspensionManager = NULL;
            }
        }
    //
	TRACE( Kern::Printf("DMemSpyDriverDevice::Install() - END - error: %d", error ));
	return error;
	}


void DMemSpyDriverDevice::GetCaps( TDes8& /*aDes*/ ) const
	{
	}


TInt DMemSpyDriverDevice::Create( DLogicalChannelBase*& aChannel )
	{
    TRACE( Kern::Printf("DMemSpyDriverDevice::Create() - START"));
    TInt r = KErrNoMemory;
    //
	aChannel = new DMemSpyDriverLogicalChannel;
    //
    if  ( aChannel )
        {
        if  ( iProcessManager == NULL && iEventMonitor == NULL && iSuspensionManager == NULL )
            {
            TRACE( Kern::Printf("DMemSpyDriverDevice::Create() - need to re-create objects, calling Install()"));
            r = Install();
            TRACE( Kern::Printf("DMemSpyDriverDevice::Create() - called Install()"));
            }
        else
            {
            r = KErrNone;
            }
        }
    //
    TRACE( Kern::Printf("DMemSpyDriverDevice::Create() - END - r: %d", r ));
	return r;
	}


void DMemSpyDriverDevice::Cleanup()
    {

    NKern::ThreadEnterCS();
    if  ( iProcessManager )
        {
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - destroying process manager..."));
        iProcessManager->Close( NULL );
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - process manager destroyed"));
        iProcessManager = NULL;
        }
    
    if  ( iEventMonitor )
        {
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - destroying event monitor..."));
        iEventMonitor->Stop();
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - stopped event monitor..."));
        iEventMonitor->Close();
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - closed event monitor..."));
        iEventMonitor = NULL;
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - event monitor destroyed"));
        }
    
    if  ( iSuspensionManager )
        {
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - destroying suspension manager..."));
        delete iSuspensionManager;
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - suspension manager destroyed"));
        iSuspensionManager = NULL;
        }

    if  ( iOSAdaption )
        {
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - destroying os adaption..."));
        delete iOSAdaption;
	    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - suspension os adaption destroyed"));
        iOSAdaption = NULL;
        }

    NKern::ThreadLeaveCS();

    TRACE( Kern::Printf("DMemSpyDriverDevice::Cleanup() - END"));
    }