* 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;
}
}