/* Copyright (c) 2012, 2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*     * Redistributions of source code must retain the above copyright
*       notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above
*       copyright notice, this list of conditions and the following
*       disclaimer in the documentation and/or other materials provided
*       with the distribution.
*     * Neither the name of The Linux Foundation nor the names of its
*       contributors may be used to endorse or promote products derived
*       from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

// Camera dependencies
#include "mm_qcamera_app.h"
#include "mm_qcamera_dbg.h"

int mm_camera_queue_init(mm_camera_queue_t *queue,
                         release_data_fn data_rel_fn,
                         void *user_data)
{
    if ( NULL == queue ) {
        return -1;
    }

    pthread_mutex_init(&queue->m_lock, NULL);
    cam_list_init(&queue->m_head.list);
    queue->m_size = 0;
    queue->m_dataFn = data_rel_fn;
    queue->m_userData = user_data;

    return MM_CAMERA_OK;
}

int mm_qcamera_queue_release(mm_camera_queue_t *queue)
{
    if ( NULL == queue ) {
        return -1;
    }

    mm_qcamera_queue_flush(queue);
    pthread_mutex_destroy(&queue->m_lock);

    return MM_CAMERA_OK;
}

int mm_qcamera_queue_isempty(mm_camera_queue_t *queue)
{
    if ( NULL == queue ) {
        return 0;
    }

    int flag = 1;
    pthread_mutex_lock(&queue->m_lock);
    if (queue->m_size > 0) {
        flag = 0;
    }
    pthread_mutex_unlock(&queue->m_lock);

    return flag;
}

int mm_qcamera_queue_enqueue(mm_camera_queue_t *queue, void *data)
{
    if ( NULL == queue ) {
        return -1;
    }

    camera_q_node *node =
        (camera_q_node *)malloc(sizeof(camera_q_node));
    if (NULL == node) {
        LOGE(" No memory for camera_q_node");
        return 0;
    }

    memset(node, 0, sizeof(camera_q_node));
    node->data = data;

    pthread_mutex_lock(&queue->m_lock);
    cam_list_add_tail_node(&node->list, &queue->m_head.list);
    queue->m_size++;
    pthread_mutex_unlock(&queue->m_lock);

    return 1;
}

void* mm_qcamera_queue_dequeue(mm_camera_queue_t *queue, int bFromHead)
{
    if ( NULL == queue ) {
        return NULL;
    }

    camera_q_node* node = NULL;
    void* data = NULL;
    struct cam_list *head = NULL;
    struct cam_list *pos = NULL;

    pthread_mutex_lock(&queue->m_lock);
    head = &queue->m_head.list;
    if (bFromHead) {
        pos = head->next;
    } else {
        pos = head->prev;
    }
    if (pos != head) {
        node = member_of(pos, camera_q_node, list);
        cam_list_del_node(&node->list);
        queue->m_size--;
    }
    pthread_mutex_unlock(&queue->m_lock);

    if (NULL != node) {
        data = node->data;
        free(node);
    }

    return data;
}

void mm_qcamera_queue_flush(mm_camera_queue_t *queue)
{
    camera_q_node* node = NULL;
    struct cam_list *head = NULL;
    struct cam_list *pos = NULL;

    if ( NULL == queue ) {
        return;
    }

    pthread_mutex_lock(&queue->m_lock);
    head = &queue->m_head.list;
    pos = head->next;

    while(pos != head) {
        node = member_of(pos, camera_q_node, list);
        pos = pos->next;
        cam_list_del_node(&node->list);
        queue->m_size--;

        if (NULL != node->data) {
            if (queue->m_dataFn) {
                queue->m_dataFn(node->data, queue->m_userData);
            }
            free(node->data);
        }
        free(node);

    }
    queue->m_size = 0;
    pthread_mutex_unlock(&queue->m_lock);
}

