#include <tee_internal_api.h>
#include <comdef.h>
#include <qsee_services.h>
#include <protocol.h>
#include <tees_log.h>

extern PersObjectCmd g_po_cmd_buffer;
extern uint32_t g_listener_id;
extern ProtocolCmd *g_cmd_buffer;


// should get all information from current command buffer
bool GetCancellationFlag(void) {
  TEE_Result status = TEE_ERROR_BAD_PARAMETERS;
  uint8_t res = 0;

  // In a case when a request to a trustlet is performed from SWd,
  // then g_cmd_buffer is expected to be NULL.
  // Client may not provide listener
  if (!g_cmd_buffer || (g_listener_id == 0)) {
    return false;
  }

  TEE_MemFill(&g_po_cmd_buffer, 0x00, sizeof(g_po_cmd_buffer));

  g_po_cmd_buffer.cmd_id = PROTOCOL_COMMAND_GETCANCELFLAG;

  g_po_cmd_buffer.data_len = 1;
  g_po_cmd_buffer.teec_oper = g_cmd_buffer->teec_oper;

  /* msm8974 API: void qsee_request_service(unsigned int listener_id, void *req,
   * unsigned int req_len, void *rsp, unsigned int rsplen); */
  /* msm8996 API:  int qsee_request_service(unsigned int listener_id, void *req,
   * unsigned int req_len, void *rsp, unsigned int rsplen); */
  qsee_request_service(g_listener_id,
                       &g_po_cmd_buffer, sizeof(g_po_cmd_buffer),
                       &g_po_cmd_buffer, sizeof(g_po_cmd_buffer));
  status = g_po_cmd_buffer.cmd_id;

  if (TEE_SUCCESS == status) {
    TEE_MemMove(&res, g_po_cmd_buffer.data, 1);
  }
  return res;
}
