/**
* \file qsee_agent_main.c
* \brief Entry point to QSEE trustlet.
* \author Dmytro Podgornyi (d.podgornyi@samsung.com)
* \version 0.1
* \date Created May 28, 2013
* \par In Samsung Ukraine R&D Center (SURC) under a contract between
* \par LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine) and
* \par "Samsung Elecrtronics Co", Ltd (Seoul, Republic of Korea)
* \par Copyright: (c) Samsung Electronics Co, Ltd 2012. All rights reserved.
**/

#include <string.h>

#include "sec_alloc.h"
#include "log.h"
#include "version.h"
#include "CommandHandler.h"
#ifdef USE_ENCAPSULATED_TID
#include "qsee_message.h"
#endif

#include "CommLayerData.h"
#include "CryptoPlatform.h"
#include "SfsFileOperations.h"

void tz_app_init(void)
{
	LOGI("================================================");
	LOGI(" MLDAP trustlet v%s", VERSION);
	LOGI("================================================");

	return;
}

void tz_app_shutdown(void)
{
	LOGD("unloading mldap trustlet...");
	return;
}

void tz_app_cmd_handler(void* cmd, uint32_t cmdlen,
			void* rsp, uint32_t rsplen)
{
	cmd_req_t cmd_buf;
	cmd_rsp_t* rsp_ptr = (cmd_rsp_t*)rsp;

	if (cmdlen != sizeof(cmd_req_t)) {
		LOGE("tz_app_cmd_handler: Error, Invalid Req size (%d)\n", cmdlen);
		return;
	}

	sec_init();

	memset(&cmd_buf, 0, sizeof(cmd_req_t));
	memcpy(&cmd_buf, cmd, sizeof(cmd_req_t));
	rsp_ptr->dataLen = sizeof(rsp_ptr->data);

	if (cmd_buf.mldap_flag == 0){
		LOGE("tz_app_cmd_handler: Call from other module, mldap do not support");
		return;
	}

	if (qsee_is_ns_range((void*)(rsp_ptr->data), rsp_ptr->dataLen)) {
		LOGE("Invalid payload memeory region (0x%08x)\n", rsp_ptr->dataLen);
		return;
	}

	if (cmd_buf.dataLen > MAX_TRANSFER_SIZE) {
		LOGE("tz_app_cmd_handler: Error, Invalid cmd size (%d) \n", cmd_buf.dataLen);
		return;
	}
	rsp_ptr->status = handleCmd(cmd_buf.cmd_id,
					cmd_buf.data,
					cmd_buf.dataLen,
					rsp_ptr->data,
					&rsp_ptr->dataLen);
	memset(&cmd_buf, 0, sizeof(cmd_req_t));

	return;
}