/**
 * @file tees_log.c
 * @brief Multibuild's logging API implementation for qsee
 * @author Iaroslav Makarchuk (i.makarchuk@samsung.com)
 * @date Created Oct 3, 2016
 * @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 2015. All rights reserved.
 *
 * This software is proprietary of Samsung Electronics.
 * No part of this software, either material or conceptual may be copied
 * or distributed, transmitted, transcribed, stored in a retrieval system
 * or translated into any human or computer language in any form by any means,
 * electronic, mechanical, manual or otherwise, or disclosed to third parties
 * without the express written permission of Samsung Electronics.
 */

#include <tees_log.h>

#include <stdarg.h>
#include <stdio.h>

#include <log_utils.h>

#include "qsee_log.h"

#define MAX_LOG_MSG_LEN 1024

TEES_LogLevel g_tees_log_level = TEES_LOG_LEVEL_DEFAULT;

void TEES_LogSetTarget(TEES_LogTarget target,
                          const void *param,
                          uint32_t param_len) {
  (void) param;
  (void) param_len;
  (void) target;
}

void TEES_LogSetLevel(TEES_LogLevel level) {
  if (level < TEES_LOG_LEVEL_MAX) {
    g_tees_log_level = level;
  }
}

void TEES_Log(TEES_LogLevel level, const char *function_name, int line, 
                 const char *project_name, const char *fmt, ...)
{
  va_list vl;
  char buffer[MAX_LOG_MSG_LEN] = {0};

  if (level < g_tees_log_level ||
      level > TEES_LOG_LEVEL_MAX) {
    return;
  }

  va_start(vl, fmt);
  vsnprintf(buffer, MAX_LOG_MSG_LEN - 1, fmt, vl);
  qsee_printf("[%s] %s [%s:%d] %s",
              project_name ? project_name : NAME_UNKNOWN,
              LogUtilsGetTag(level),
              function_name ? function_name : NAME_UNKNOWN,
              line, buffer);
  va_end(vl);
}

void TEES_LogMem(TEES_LogLevel level, const char *function_name, int line,
                    const char *project_name, const void *data,
                    uint32_t data_len)
{
  char buf[MAX_LOG_MSG_LEN] = {0};
  uint32_t written_len = 0;
  char *source_ptr = (char *)data;


  if (level < g_tees_log_level || level > TEES_LOG_LEVEL_MAX || !data) {
    return;
  }

  qsee_printf("[%s] %s [%s:%d] "MEMORY_LOG_TAG": %p (%u)\n",
              project_name ? project_name : NAME_UNKNOWN,
              LogUtilsGetTag(level),
              function_name ? function_name : NAME_UNKNOWN,
              line, data, data_len);

  while (written_len < data_len) {
    char *dest_ptr = buf;
    uint32_t bytes_to_write = data_len - written_len > DUMP_ROW_LEN ?
                              DUMP_ROW_LEN : data_len - written_len;

    written_len += bytes_to_write;

    while (bytes_to_write--) {
      dest_ptr += snprintf(dest_ptr, sizeof(buf) - (dest_ptr - buf),
                           "%02X", *(source_ptr++));
    }

    qsee_printf("[%s] %s", project_name ? project_name : NAME_UNKNOWN, buf);
  }
}

