/*
 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
 *
 * HDF is dual licensed: you can use it either under the terms of
 * the GPL, or the BSD license, at your option.
 * See the LICENSE file in the root of this repository for complete details.
 */

#include "hdf_message_task.h"
#include "hdf_message_looper.h"
#include "osal_mem.h"
#include "osal_message.h"

int32_t HdfMessageTaskSendMessageLater(
    struct HdfMessageTask *task, struct HdfMessage *msg, bool sync, long delay)
{
    if (msg != NULL) {
        if (msg->target == NULL) {
            msg->target = task;
        }
        if (sync) {
            if (task->messageHandler != NULL && task->messageHandler->Dispatch != NULL) {
                int ret = task->messageHandler->Dispatch(task, msg);
                OsalMemFree(msg);
                return ret;
            }
        } else {
            HdfMessageQueueEnqueue(task->messageQueue, msg, delay);
            return HDF_SUCCESS;
        }
    }

    return HDF_ERR_INVALID_PARAM;
}

int32_t HdfMessageTaskSendMessage(struct HdfMessageTask *task, struct HdfMessage *msg, bool sync)
{
    return HdfMessageTaskSendMessageLater(task, msg, sync, 0);
}

void HdfMessageTaskDispatchMessage(struct HdfMessageTask *task, struct HdfMessage *msg)
{
    struct IHdfMessageHandler *handler = task->messageHandler;
    if ((handler != NULL) && (handler->Dispatch != NULL)) {
        handler->Dispatch(task, msg);
    }
}

void HdfMessageTaskConstruct(struct HdfMessageTask *inst,
    struct HdfMessageLooper *looper, struct IHdfMessageHandler *handler)
{
    if (inst != NULL && looper != NULL) {
        inst->SendMessage = HdfMessageTaskSendMessage;
        inst->messageHandler = handler;
        inst->messageQueue = &looper->messageQueue;
        inst->DispatchMessage = HdfMessageTaskDispatchMessage;
    }
}