localconnectivityservice/dun/utils/inc/DunTransUtils.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:  Utility class for other CDunTransporter classes
*
*/


#ifndef C_CDUNTRANSUTILS_H
#define C_CDUNTRANSUTILS_H

#include "DunTransporter.h"

/**
 *  Notification interface class for managing channel's activity
 *  This class is needed to update KPSUidDialupConnStatus pub&sub key
 *
 *  @lib dunutils.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( MDunActivityManager )
    {

public:

    /**
     * CDunTransporter callback: gets called when activity is detected on a
     * channel
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt NotifyChannelActivity() = 0;

    /**
     * CDunTransporter callback: gets called when inactivity is detected on a
     * channel
     *
     * @since S60 3.2
     * @return KErrGeneral if mismatch in channel activity, KErrNone otherwise
     */
    virtual TInt NotifyChannelInactivity() = 0;

    };

/**
 *  Utility accessor class for CDunTransporter class itself
 *  Shares basic functionality of CDunTransporter by simplifying it
 *
 *  @lib dunutils.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( MDunTransporterUtility )
    {

public:

    /**
     * Initializes first free channel
     *
     * @since S60 3.2
     * @param aLocalIdNew Identifier of the new local endpoint
     * @return Symbian error code on error, found index otherwise
     */
    virtual TInt InitializeFirstFreeChannel( TConnId aLocalIdNew ) = 0;

    /**
     * Allocates a channel by creating and setting local media independent
     * objects
     * This is a common method used by exported local media dependent methods
     *
     * @since S60 3.2
     * @param aBufferLength Buffer length selected for this channel
     * @param aFirstFree Index to first free channel data
     * @param aCorrection Pointer to object implementing buffer correction
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual void DoAllocateChannelL(
        RComm* aComm,
        TInt& aBufferLength,
        TInt aFirstFree,
        MDunBufferCorrection* aCorrection ) = 0;

    /**
     * Adds connection monitor callback for either local media or network side
     * by connection ID
     * Error will be added to aIndex:th endpoint
     *
     * @since S60 3.2
     * @param aIndex Index where to add new connection monitor callback
     * @param aCallback Pointer to object whose callbacks will be called
     * @param aDirection Direction of operation to monitor for read/write error
     * @param aSignal Receive also signal change if ETrue
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt DoAddConnMonCallback( TInt aIndex,
                                       MDunConnMon* aCallback,
                                       TDunDirection aDirection,
                                       TBool aSignal ) = 0;

    /**
     * Adds error to consider as no error condition when doing any of the four
     * endpoint's read/writer operation
     * Error will be added to aIndex:th endpoint
     *
     * @since S60 3.2
     * @param aIndex Index where to add new "no error" code
     * @param aError Error code to consider as "no error"
     * @param aDirection One of four data transfer endpoints where to add a
     *                   skipped error code
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt DoAddSkippedError( TInt aIndex,
                                    TInt aError,
                                    TDunDirection aDirection ) = 0;

    /**
     * Issues transfers requests for aIndex:th transfer objects
     *
     * @since S60 3.2
     * @param aIndex Index to transfer objects that will be activated
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt DoIssueTransferRequests( TInt aIndex ) = 0;

    /**
     * Stops transfers for aIndex:th transfer objects
     *
     * @since S60 3.2
     * @param aIndex Index to transfer objects that will be stopped
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt DoStopTransfers( TInt aIndex ) = 0;

    /**
     * Free aIndex:th channel's objects
     *
     * @since S60 3.2
     * @param aIndex Index of channel to free
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt DoFreeChannel( TInt aIndex ) = 0;

    };

/**
 *  Utility accessor class for other than CDunTransporter classes
 *  Basically a collection of miscellaneous helper methods
 *
 *  @lib dunutils.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( MDunTransporterUtilityAux )
    {

public:

    /**
     * Gets local ID counterpart of a network ID
     *
     * @since S60 3.2
     * @param aComm Network ID to search for
     * @return Null if ID not found, otherwise found ID
     */
    virtual TConnId GetLocalId( RComm* aComm ) = 0;

    /**
     * Notifies when serious read/write error is detected on a connection
     *
     * @since S60 3.2
     * @param aComm Non-null if error on RComm
     * @param aSocket Non-null if error on RSocket
     * @param aConnReason Reason of connection error
     * @param aCallbacks Callbacks to notify on connections error
     * @return Symbian error code on error, KErrNone otherwise
     */
    virtual TInt DoNotifyConnectionNotOk(
        RComm* aComm,
        RSocket* aSocket,
        TDunConnectionReason& aConnReason,
        RPointerArray<MDunConnMon>& aCallbacks) = 0;

    };

/**
 *  Utility class for other CDunTransporter classes
 *  This class implements basic functionality that is shared by different
 *  CDunTransporter classes, also for simplifying CDunTransporter itself
 *
 *  @lib dunutils.lib
 *  @since S60 v3.2
 */
NONSHARABLE_CLASS( CDunTransUtils ) : public CBase,
                                      public MDunActivityManager,
                                      public MDunTransporterUtility,
                                      public MDunTransporterUtilityAux
    {

public:

    /**
     * Two-phased constructor.
     * @param aParent Parent class owning this friend class (CDunTransporter)
     * @param aPluginManager Callback to call when notification via
     *                       MDunPluginManager to be made
     * @return Instance of self
     */
	static CDunTransUtils* NewL( CDunTransporter& aParent,
	                             MDunPluginManager* aPluginManager );

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

private:

    CDunTransUtils( CDunTransporter& aParent,
                    MDunPluginManager* aPluginManager );

    void ConstructL();

    /**
     * Manages service advertisement status changes
     *
     * @since S60 5.0
     * @param aAdvertise New advertisement status
     * @param aCreation ETrue if channel creation
     *                  EFalse if channel free
     * @return None
     */
    void ManageAdvertisementStatusChange( TBool aAdvertise,
                                          TBool aCreation=EFalse );

    /**
     * Creates empty channel data
     *
     * @since S60 3.2
     * @param aChannel Channel data to set empty
     * @return None
     */
    void CreateEmptyChannelData( TDunChannelData& aChannel );

    /**
     * Creates new buffer if source buffer defined, otherwise already existing
     * buffer will be used
     *
     * @since S60 3.2
     * @param aSrcBuffer Source buffer
     * @param aSrcPtr Pointer to source buffer
     * @param aDstBuffer Destination buffer
     * @param aDstPtr Pointer to destination buffer
     * @param aItemsInCs Items in cleanup stack, will be incremented if
     *                   necessary
     * @return None
     */
    void DoCreateBufferLC( TUint8* aSrcBuffer,
                           TPtr8* aSrcPtr,
                           TUint8*& aDstBuffer,
                           TPtr8*& aDstPtr,
                           TInt aBufferLength,
                           TInt& aItemsInCs );

    /**
     * Creates new signal copy object if source defined, otherwise
     * already existing will be used
     *
     * @since S60 3.2
     * @param aSrcSignalCopy Source signal copy object
     * @param aDstSignalCopy Destination signal copy object
     * @param aItemsInCs Items in cleanup stack, will be incremented if
     *                   necessary
     * @return None
     */
    void DoCreateSignalCopyLC( CDunSignalCopy* aSrcSignalCopy,
                               CDunSignalCopy*& aDstSignalCopy,
                               TInt& aItemsInCs );

    /**
     * Creates new signal notify object if source defined, otherwise
     * already existing will be used
     *
     * @since S60 3.2
     * @param aSrcSignalNotify Source signal notify object
     * @param aDstSignalNotify Destination signal notify object
     * @param aItemsInCs Items in cleanup stack, will be incremented if
     *                   necessary
     * @return None
     */
    void DoCreateSignalNotifyLC( CDunSignalNotify* aSrcSignalNotify,
                                 CDunSignalNotify*& aDstSignalNotify,
                                 TInt& aItemsInCs );

    /**
     * Creates transfer objects for reader and writer if sources defined,
     * otherwise already existing ones will be used
     *
     * @since S60 3.2
     * @param aSrcReader Source reader object
     * @param aDstReader Destination reader object
     * @param aItemsInCs Items in cleanup stack, will be incremented if
     *                   necessary
     * @return None
     */
    void DoCreateUpTransferObjectL( CDunUpstream* aSrcReader,
                                    CDunUpstream*& aDstReader,
                                    TInt& aItemsInCs );

    /**
     * Creates transfer objects for reader and writer if sources defined,
     * otherwise already existing ones will be used
     *
     * @since S60 3.2
     * @param aSrcReader Source reader object
     * @param aDstReader Destination reader object
     * @param aItemsInCs Items in cleanup stack, will be incremented if
     *                   necessary
     * @return None
     */
    void DoCreateDownTransferObjectL( CDunDownstream* aSrcReader,
                                      CDunDownstream*& aDstReader,
                                      TInt& aItemsInCs );

    /**
     * Resets/frees network data of aIndex:th channel
     *
     * @since S60 3.2
     * @param aIndex Index of channel to reset/free
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DeleteOneNetworkData( TInt aIndex );

    /**
     * Deletes local data of aIndex:th channel
     *
     * @since S60 3.2
     * @param aIndex Index of channel to delete
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DeleteOneLocalData( TInt aIndex );

    /**
     * Deletes buffering objects of aIndex:th channel
     *
     * @since S60 3.2
     * @param aIndex Index of channel to delete
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DeleteBuffering( TInt aIndex );

// from base class MDunTransporterUtility

    /**
     * From MDunTransporterUtility.
     * Initializes first free channel
     *
     * @since S60 3.2
     * @param aLocalIdNew Identifier of the new local endpoint
     * @return Symbian error code on error, found index otherwise
     */
    TInt InitializeFirstFreeChannel( TConnId aLocalIdNew );

    /**
     * From MDunTransporterUtility.
     * Allocates a channel by creating and setting local media independent
     * objects
     * This is a common method used by exported local media dependent methods
     *
     * @since S60 3.2
     * @param aBufferLength Buffer length selected for this channel
     * @param aFirstFree Index to first free channel data
     * @param aCorrection Pointer to object implementing buffer correction
     * @return Symbian error code on error, KErrNone otherwise
     */
    void DoAllocateChannelL( RComm* aComm,
                             TInt& aBufferLength,
                             TInt aFirstFree,
                             MDunBufferCorrection* aCorrection );

    /**
     * From MDunTransporterUtility.
     * Adds connection monitor callback for either local media or network side
     * by connection ID
     * Connection monitor will be added to aIndex:th endpoint
     *
     * @since S60 3.2
     * @param aIndex Index where to add new connection monitor callback
     * @param aCallback Pointer to object whose callbacks will be called
     * @param aDirection Direction of operation to monitor for read/write error
     * @param aSignal Receive also signal change if ETrue
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DoAddConnMonCallback( TInt aIndex,
                               MDunConnMon* aCallback,
                               TDunDirection aDirection,
                               TBool aSignal );

    /**
     * From MDunTransporterUtility.
     * Adds error to consider as no error condition when doing any of the four
     * endpoint's read/writer operation
     * Error will be added to aIndex:th endpoint
     *
     * @since S60 3.2
     * @param aIndex Index where to add new "no error" code
     * @param aError Error code to consider as "no error"
     * @param aDirection One of four data transfer endpoints where to add a
     *                   skipped error code
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DoAddSkippedError( TInt aIndex,
                            TInt aError,
                            TDunDirection aDirection );

    /**
     * From MDunTransporterUtility.
     * Issues transfers requests for aIndex:th transfer objects
     *
     * @since S60 3.2
     * @param aIndex Index to transfer objects that will be activated
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DoIssueTransferRequests( TInt aIndex );

    /**
     * From MDunTransporterUtility.
     * Stops transfers for aIndex:th transfer objects
     *
     * @since S60 3.2
     * @param aIndex Index to transfer objects that will be stopped
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DoStopTransfers( TInt aIndex );

    /**
     * From MDunTransporterUtility.
     * Free aIndex:th channel's objects
     *
     * @since S60 3.2
     * @param aIndex Index of channel to free
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DoFreeChannel( TInt aIndex );

// from base class MDunTransporterUtilityAux

    /**
     * From MDunTransporterUtilityAux.
     * Gets local ID counterpart of a network ID
     *
     * @since S60 3.2
     * @param aComm Network ID to search for
     * @return Null if ID not found, otherwise found ID
     */
    TConnId GetLocalId( RComm* aComm );

    /**
     * From MDunTransporterUtilityAux.
     * Notifies when serious read/write error is detected on a connection
     *
     * @since S60 3.2
     * @param aComm Non-null if error on RComm
     * @param aSocket Non-null if error on RSocket
     * @param aConnReason Reason of connection error
     * @param aCallbacks Callbacks to notify on connections error
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt DoNotifyConnectionNotOk(
        RComm* aComm,
        RSocket* aSocket,
        TDunConnectionReason& aConnReason,
        RPointerArray<MDunConnMon>& aCallbacks);

// from base class MDunActivityManager

    /**
     * From MDunActivityManager.
     * Notifies about activity on a channel
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyChannelActivity();

    /**
     * From MDunActivityManager.
     * Notifies about inactivity on a channel
     *
     * @since S60 3.2
     * @return Symbian error code on error, KErrNone otherwise
     */
    TInt NotifyChannelInactivity();

private:  // data

    /**
     * Parent class owning this friend class (CDunTransporter)
     */
    CDunTransporter& iParent;

    /**
     * Array of abstractions of each "channel" (from parent iParent)
     * One TDunChannelData entry contains objects needed for one channel
     */
    RArray<TDunChannelData>& iChannelData;

    /**
     * Array of service advertisement data for each plugin (from parent iParent)
     * One TDunServAdvData entry contains objects needed for one plugin
     */
    RArray<TDunServAdvData>& iServAdvData;

    /**
     * Callback to call when notification via MDunPluginManager to be made
     * Not own.
     */
    MDunPluginManager* iPluginManager;

    };

#endif  // C_CDUNTRANSUTILS_H