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

/**
 @file
 @internalComponent
*/

#ifndef MSMMENGINE_H
#define MSMMENGINE_H

#include <e32base.h>
class TUSBMSDeviceDescription;
class TMsmmNodeBase;
class TUsbMsInterface;
class TUsbMsLogicalUnit;
class TUsbMsDevice;

NONSHARABLE_CLASS(CMsmmEngine) : public CBase
    {
public:
    virtual ~CMsmmEngine();
    static CMsmmEngine* NewL();
    static CMsmmEngine* NewLC();

public:

    /**
    Called to add a Usb MS device node
    @param aDevice The device currently attched
    */
    void AddUsbMsDeviceL(const TUSBMSDeviceDescription& aDevice);
        
    /**
    Called to add a Usb MS interface node
    @param aDevice The device to which current interface belongs
    @param aInterfaceNode Currently adding interface node
    */
    TUsbMsInterface* AddUsbMsInterfaceL(TInt aDeviceId, 
            TUint8 aInterfaceNumber, TInt32 aInterface);
    
    /**
    Called to add a Usb MS LU node
    @param aDeviceId The device identifier of the device by which current 
        logical unit supported
    @param aInterfaceNumber The interface number value of the interface
        to which current logical unit belongs
    @param aLogicalUnitNumber Current LU number value
    @param aDrive The drive on which current LU mounted
    */
    void AddUsbMsLogicalUnitL(TInt aDeviceId, TInt aInterfaceNumber, 
            TInt aLogicalUnitNumber, TText aDrive);
    
    /**
    Called to remove a Usb MS node
    @param aNodeToBeRemoved The node to be removed
    */
    void RemoveUsbMsNode(TMsmmNodeBase* aNodeToBeRemoved);
    
    /**
    Called to search a particular device in engine
    @param aDeviceId The related device identifier of the device node
    @return Pointer to the device node found out in the data engine
    */
    TUsbMsDevice* SearchDevice(TInt aDeviceId) const;
        
    /**
    Called to search a particular device in engine. Intends to be used
    when a parent device node is available.
    @param aDevice The parent device node of the interface node 
        currently searched 
    @param aInterfaceNumber The related interface number value of the 
        interface node
    @return Pointer to the device node found out in the data engine
    */
    TUsbMsInterface* SearchInterface(TMsmmNodeBase* aDevice, 
            TInt aInterfaceNumber) const;
    
protected:
    CMsmmEngine();
    void ConstructL();

private:

    // Called to add a new USB MS interface node into data engine.
    TUsbMsInterface* AddUsbMsInterfaceNodeL(TUsbMsDevice* iParent,
            TInt aInterfaceNumber, TInt aInterfaceToken);
    
    // Called to add a new USB MS logical unit node into data engine.
    TUsbMsLogicalUnit* AddUsbMsLogicalUnitNodeL(TUsbMsInterface* iParent,
            TInt aLogicalUnitNumber, TText aDrive);

private:
    TMsmmNodeBase* iDataEntrys; // Usb Ms device tree
    };

#endif /*MSMMENGINE_H*/
