/*
* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:   Declaration of the WlanManagementSideUmacCb class.
*
*/

/*
* %version: 17 %
*/

#ifndef WLANMANAGEMENTSIDEUMACB_H
#define WLANMANAGEMENTSIDEUMACB_H

class TDataBuffer;
struct TMacAddress;

/**
* Callback interface class for oid completion and stuff
*/
class WlanManagementSideUmacCb
    {
public:  // Types

    struct SOidOutputData
        {
        public:

            TUint32 iOidId;
            TAny*   iBufferSupplied;
            TUint32 iLengthOfBufferSupplied;

            const TAny* iOidData;
            TUint32     iLengthOfDataInBytes;

            SOidOutputData() 
                : iOidId( 0 ), 
                iBufferSupplied( NULL ),
                iLengthOfBufferSupplied( 0 ),
                iOidData( NULL ),
                iLengthOfDataInBytes( 0 ) {};

        private:
            
            /** Prohibit assignment operator */
            SOidOutputData& operator= ( const SOidOutputData& aObj );    
            /** Prohibit copy constructor */
            SOidOutputData( const SOidOutputData& );
        };

public:
    
    // dtor
    virtual ~WlanManagementSideUmacCb();

    void Attach( WlanManagementSideUmacCb& aSelf ); 
    void Detach(); 

    /**
    * Called from statemachine when oid has been completed. 
    * Triggers handling of a new oid
    * @param aOid OID handled
    * @param aReason completion code
    */
    virtual void OnOidCompleted( TInt aReason, SOidOutputData& OidOutputData );

    /**
    * Sets the Tx offset for every frame type which can be transmitted
    *
    * @since S60 5.0
    * @param aEthernetFrameTxOffset Tx offset for Ethernet frames and Ethernet
    *        Test frames
    * @param aDot11FrameTxOffset Tx offset for 802.11 frames
    * @param aSnapFrameTxOffset Tx offset for SNAP frames
    */
    virtual void SetMgmtSideTxOffsets( 
        TUint32 aEthernetFrameTxOffset,
        TUint32 aDot11FrameTxOffset,
        TUint32 aSnapFrameTxOffset ); 

    /**
    * Gets buffer for Rx data
    * @param aLengthinBytes Requested buffer length
    * @return buffer for Rx data upon success
    *         NULL otherwise
    */
    virtual TUint8* GetBufferForRxData( TUint aLengthinBytes );

    /**
     * Get DMA xfer suitable Tx buffer for UMAC's internal use
     *
     * @since S60 3.1
     * @returns begin of the memory that can be used for DMA xfer 
     */
    virtual TUint8* DmaPrivateTxMemory();
    
    /**
    * Completes a data read operation from management side
    *
    * @param aBufferStart first element of the array that holds pointers to
    *        Rx frame meta headers
    * @param aNumOfBuffers number of meta header pointers in the array
    */
    virtual void MgmtDataReceiveComplete( 
        const TDataBuffer*& aBufferStart, 
        TUint32 aNumOfBuffers );

    /**
    * Completes a data write operation from management side
    * @param aErr completion code 
    */
    virtual void MgmtPathWriteComplete( TInt aErr );

    /**
    * Sends a indication to the management side
    * @param aIndication indication code 
    */
    virtual void OnInDicationEvent( TIndication aIndication );

    /**
    * Frees the specified Rx frame buffer
    *
    * @param aBufferToFree The buffer to free
    */
    virtual void MarkRxBufFree( TUint8* aBufferToFree );

    virtual void RegisterTimeout( 
        TUint32 aTimeoutInMicroSeconds, 
        TWlanTimer aTimer = EWlanDefaultTimer );
    virtual void CancelTimeout( TWlanTimer aTimer = EWlanDefaultTimer );

    virtual void RegisterDfc( TAny* aCntx );
    virtual void CancelDfc();

    /**
    * Allocates Rx frame meta header
    * @return Rx frame meta header upon success
    *         NULL otherwise
    */
    virtual TDataBuffer* GetRxFrameMetaHeader();

    /**
    * Deallocates Rx frame meta header
    * @param aMetaHeader Meta header to deallocate
    */
    virtual void FreeRxFrameMetaHeader( TDataBuffer* aMetaHeader );
    
protected:

    WlanManagementSideUmacCb() : iSelf( NULL ) {};

private:
    
    // Prohibit copy constructor 
    WlanManagementSideUmacCb( const WlanManagementSideUmacCb& );
    // Prohibit assigment operator 
    WlanManagementSideUmacCb& operator= ( const WlanManagementSideUmacCb& );   

private: // Data

    /** pointer to self */
    WlanManagementSideUmacCb* iSelf;
    };

#endif      // WLANMANAGEMENTSIDEUMACB_H
