localconnectivityservice/dun/plugins/inc/bt/DunBtPlugin.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 Bluetooth plugin
*
*/


#ifndef C_CDUNBTPLUGIN_H
#define C_CDUNBTPLUGIN_H

#include <e32base.h>
#include <es_sock.h>
#include "DunTransporter.h"
#include "DunPlugin.h"

/**
 *  Cleanup information for AllocateChannelL().
 *  This data is needed to clean up partially constructed data in
 *  NotifyChannelAllocate() when a leave occurs in channel creation.
 *
 *  @lib dunbt.lib
 *  @since S60 v5.0
 */
NONSHARABLE_CLASS( TBtCleanupInfo )
    {

public:

    /**
     * Flag to indicate whether or not a new entity was created
     */
    TBool iNewEntity;

    /**
     * Index to the position of the found entity
     */
    TInt iEntityIndex;

    };

/**
 *  DUN BT plugin's port entity
 *  This class is used to keep track of N number of BT ports and RFCOMM
 *  channel numbers associated to them.
 *
 *  @lib dunbt.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( TBtPortEntity )
    {

public:

    /**
     * RFCOMM channel number for BT local media side
     */
    TInt iChannelNum;

    /**
     * Port for BT local media side
     */
    RSocket iBTPort;

    };

/**
 *  DUN Bluetooth plugin's main class
 *  This class creates new transporter channel when new data is detected by
 *  CDunBtListen class and acts on transporter's state changes. Also acts on
 *  DUN server's requests.
 *
 *  @lib dunbt.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( CDunBtPlugin ) : public CBase,
                                    public MDunLocalMediaPlugin,
                                    public MDunListenCallback,
                                    public MDunConnMon
    {

public:

    CDunBtPlugin();

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

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();

    /**
     * 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 );

    /**
     * Allocates a free channel
     *
     * @since S60 3.2
     * @param aNoFreeChans ETrue if no free channels, EFalse otherwise
     * @param aCleanupInfo Cleanup information
     * @return None
     */
    void AllocateChannelL( TBool& aNoFreeChans, TBtCleanupInfo& aCleanupInfo );

    /**
     * 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 GetPortByConnId( TConnId aConnId, TBtPortEntity*& 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 GetFirstFreePort( TBtPortEntity*& aEntity );

    /**
     * Sets modem's MSC (Modem Status Command)
     *
     * @since S60 3.2
     * @param aEntity Port entity for which to change signal
     * @param aSignal Signal to set to high or low
     * @param aSignalOn ETrue if signal wanted high, otherwise low
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt SetRFCOMMStatusCommand( TBtPortEntity& aEntity,
                                 TUint8 aSignal,
                                 TBool aSignalOn );

    /**
     * Manages advertiser for channel free operation
     *
     * @since S60 5.0
     * @return None
     */
    void ManageAdvertiserFreeOperationL();

    /**
     * Cleans partial created channel data based on TATExtCleanupInfo
     *
     * @since S60 5.0
     * @param aCleanupInfo Cleanup information
     * @return None
     */
    void CleanPartialChanneldata( TBtCleanupInfo& aCleanupInfo );
    
// 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 );

private:  // data

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

    /**
     * Listener for detecting new data in RFComm channel
     * Notifies this class about new data
     * Own.
     */
    CDunBtListen* iBTListen;

    /**
     * Data socket entity for actual data transfer
     * This will be valid after CDunBtListen reacts to new data in
     * listener socket
     */
    TBtPortEntity iEntity;

    /**
     * Array of RSocket port(s) entities for BT local media side
     */
    RArray<TBtPortEntity> iBTPorts;

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

    };

#endif  // C_CDUNBTPLUGIN_H