localconnectivityservice/dun/plugins/inc/usb/DunUsbPlugin.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:03:15 +0300
branchRCL_3
changeset 19 0aa8cc770c8a
permissions -rw-r--r--
Revision: 201032 Kit: 201035

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


#ifndef C_CDUNUSBPLUGIN_H
#define C_CDUNUSBPLUGIN_H

#include <e32base.h>
#include <usbman.h>
#include "DunTransporter.h"
#include "DunUsbListen.h"
#include "DunUsbConfig.h"
#include "DunPlugin.h"

/**
 *  DUN USB plugin's port entity
 *  This class is used to keep track of N number of USB ports and port
 *  numbers associated to them (for CDunUsbConfig's purposes).
 *
 *  @lib dunusb.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( TUsbPortEntity )
    {

public:

    /**
     * Port number for USB local media side
     */
    TInt iPortNum;

    /**
     * Port for USB local media side
     */
    RComm iUsbPort;

    };

/**
 *  DUN USB plugin's main class
 *  This class creates new transporter channel(s) when configured USB is
 *  detected by CDunUsbListen class and acts on transporter's state changes.
 *  Also acts on DUN server's requests.
 *
 *  @lib dunusb.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( CDunUsbPlugin ) : public CBase,
                                     public MDunLocalMediaPlugin,
                                     public MDunListenCallback,
                                     public MDunBufferCorrection,
                                     public MDunConnMon,
                                     public MDunUsbConfig
    {

public:

    CDunUsbPlugin();

    /**
    * Destructor.
    */
    virtual ~CDunUsbPlugin();

private:

    /**
     * State of this plugin
     *
     * @since S60 3.2
     * @return State of plugin
     */
    TDunPluginState PluginState();

    /**
     * Constructs a listener object for this plugin
     *
     * @since S60 3.2
     * @return None
     */
    void ConstructListenerL();

    /**
     * Initializes USB by loading LDD
     *
     * @since S60 3.2
     * @return None
     */
    void InitUsbL();

    /**
     * Initializes all usable USB ports for DUN
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt InitPorts();

    /**
     * Creates empty usable USB ports that can be used by DUN
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt CreateAllPorts();

    /**
     * Initializes one USB port for DUN
     *
     * @since S60 3.2
     * @param aEntity Pointer to port entity
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt InitOnePort( TUsbPortEntity* aEntity );

    /**
     * Sets channel for one USB port
     *
     * @since S60 3.2
     * @param aEntity Pointer to port entity
     * @return None
     */
    void SetChannelL( TUsbPortEntity* aEntity );

    /**
     * Adds skipped error code to Transporter
     * The skipped error is added to local media's read and write operations
     *
     * @since S60 3.2
     * @param aError Skipped error code to add
     * @param aComm RComm object for which to add the error code
     * @return None
     */
    void AddSkippedErrorL( TInt aError, RComm* aComm );

    /**
     * Sets new state
     * New state must be one more than the old state
     *
     * @since S60 3.2
     * @param aPluginState New state to set for a plugin
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt ReportStateChangeUp( TDunPluginState aPluginState );

    /**
     * Sets new state
     * New state must be one less than the old state
     *
     * @since S60 3.2
     * @param aPluginState New state to set for a plugin
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt ReportStateChangeDown( TDunPluginState aPluginState );

    /**
     * Frees existing channels
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt FreeChannels();

    /**
     * Uninitializes this plugin
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt Uninitialize();

    /**
     * Gets port's index and entity by connection ID
     *
     * @since S60 3.2
     * @param aConnId Connection ID of the connection to find
     * @param aEntity Returned port entity
     * @return KErrNotFound if entity not found, found index otherwise
     */
    TInt GetEntityByConnId( TConnId aConnId, TUsbPortEntity*& aEntity );

    /**
     * Gets port's entity by port number
     *
     * @since S60 3.2
     * @param aPortNum Port number of the connection to find
     * @param aEntity Returned port entity
     * @return KErrNotFound if entity not found, found index otherwise
     */
    TInt GetEntityByPortNumber( TInt aPortNum, TUsbPortEntity*& aEntity );

    /**
     * Gets first free port's index and entity
     *
     * @since S60 3.2
     * @param aEntity Returned port entity
     * @return KErrNotFound if entity not found, found index otherwise
     */
    TInt GetFirstFreeEntity( TUsbPortEntity*& aEntity );

// from base class MDunLocalMediaPlugin

    void ConstructL( MDunServerCallback* aServer,
                     CDunTransporter* aTransporter );

    /**
     * From MDunLocalMediaPlugin.
     * Gets called when server changes a plugin's state
     *
     * @since S60 3.2
     * @param aPluginState New changed state
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyServerStateChange( TDunPluginState aPluginState );

    /**
     * From MDunLocalMediaPlugin.
     * Gets called when server needs to know the active connection
     * (For testing purposes only)
     *
     * @since S60 5.0
     * @return Active connection, NULL otherwise
     */
    TConnId ActiveConnection();

// from base class MDunListenCallback

    /**
     * From MDunListenCallback.
     * Gets called when new channel must be created
     *
     * @since S60 3.2
     * @param aNoFreeChans ETrue if no free channels, EFalse otherwise
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyChannelAllocate( TBool& aNoFreeChans );

    /**
     * From MDunListenCallback.
     * Gets called when an existing channel must be freed
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyChannelFree();

// from base class MDunConnMon

    /**
     * From MDunConnMon.
     * Gets called when line status changes or when any type of error is
     * detected
     *
     * @since S60 3.2
     * @param aConnId Connection ID for callback
     * @param aConnReason Reason for progress change
     * @return None
     */
    void NotifyProgressChangeL( TConnId aConnId,
                                TDunConnectionReason aConnReason );

// from base class MDunBufferCorrection

    /**
     * Gets called when request to change local media's buffer size
     *
     * @since S60 3.2
     * @param aLength Suggested buffer length that will be used if no
     *                correction done
     * @return New (corrected) buffer length
     */
    TInt NotifyBufferCorrection( TInt aLength );

// from base class MDunUsbConfig

    /**
     * Gets called when one or more ACM configurations are added
     *
     * @since S60 3.2
     * @param aIndex Index (also port number) of added ACM configuration
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyConfigAddition( TInt aIndex );

    /**
     * Gets called when one or more ACM configurations are removed
     *
     * @since S60 3.2
     * @param aIndex Index (also port number) of removed ACM configuration
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyConfigRemoval( TInt aIndex );

private:  // data

    /**
     * Callback to call when notification via MDunServerCallback to be made
     * Not own.
     */
    MDunServerCallback* iServer;

    /**
     * Listener for detecting attached USB cable and configured ACM
     * Notifies this class to create new channel
     * Own.
     */
    CDunUsbListen* iUsbListen;

    /**
     * Listener and accessor for detecting USB ACM configuration change
     * Own.
     */
    CDunUsbConfig* iUsbConfig;

    /**
     * Communications server used to load ECACM and open USB port(s)
     * Also used to get port information to calculate number of supported ACMs
     */
    RCommServ iCommServer;

    /**
     * USB server (USB manager) needed for device state notifications
     * Device states needed to create transporter channel
     */
    RUsb iUsbServer;

    /**
     * Array of port(s) for USB local media side
     */
    RArray<TUsbPortEntity> iUsbPorts;

    /**
     * Transporter to use for network side communication
     * Not own.
     */
    CDunTransporter* iTransporter;

    /**
     * Flag to be set on if CDunUsbPlugin is waiting for shutdown.
     * This flag is used to skip subsequent higher-level error codes after
     * driver based error occurred.
     */
    TBool iShutdown;

    };

#endif  // C_CDUNUSBPLUGIN_H