/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 *  Store data bytes in a variable-size queue.
 */

#pragma once
#include "NfcJniUtil.h"
#include "gki.h"
#include "Mutex.h"
#include <list>


class DataQueue
{
public:
    /*******************************************************************************
    **
    ** Function:        DataQueue
    **
    ** Description:     Initialize member variables.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    DataQueue ();


    /*******************************************************************************
    **
    ** Function:        ~DataQueue
    **
    ** Description:      Release all resources.
    **
    ** Returns:         None.
    **
    *******************************************************************************/
    ~DataQueue ();


    /*******************************************************************************
    **
    ** Function:        enqueue
    **
    ** Description:     Append data to the queue.
    **                  data: array of bytes
    **                  dataLen: length of the data.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool enqueue (UINT8* data, UINT16 dataLen);


    /*******************************************************************************
    **
    ** Function:        dequeue
    **
    ** Description:     Retrieve and remove data from the front of the queue.
    **                  buffer: array to store the data.
    **                  bufferMaxLen: maximum size of the buffer.
    **                  actualLen: actual length of the data.
    **
    ** Returns:         True if ok.
    **
    *******************************************************************************/
    bool dequeue (UINT8* buffer, UINT16 bufferMaxLen, UINT16& actualLen);


    /*******************************************************************************
    **
    ** Function:        isEmpty
    **
    ** Description:     Whether the queue is empty.
    **
    ** Returns:         True if empty.
    **
    *******************************************************************************/
    bool isEmpty();

private:
    struct tHeader
    {
        UINT16 mDataLen; //number of octets of data
        UINT16 mOffset; //offset of the first octet of data
    };
    typedef std::list<tHeader*> Queue;

    Queue mQueue;
    Mutex mMutex;
};

