/*
 * @file softsim_main.c
 * @brief Code for handling SOFTSIM commands
 * Copyright (c) 2015, Samsung Electronics Corporation. All rights reserved.
 */
/*#include <comdef.h>*/

#include <stdlib.h>
#include <string.h>
#include "tl_process_cmd.h"
#include "tl_heap.h"
#include "tl_log.h"
/**
 * softsim_cmd_handler - main SOFTSIM command handler
 */
void softsim_cmd_handler(void* cmd, uint32_t cmdlen, void* rsp, uint32_t rsplen)
{
    cmd_rsp_t *resp = (cmd_rsp_t *)rsp;
    int result = init_mem_pool();
    if (result == -1) {
        resp->out_len= 0;
        resp->status = UNDEFINE_CMD_ID;
        SOFTSIM_LOGE("init mem error");
        return;
    }
    cmd_req_t *cmdreq = tl_malloc(sizeof(cmd_req_t));
    if (cmdreq == NULL) {
        resp->out_len= 0;
        resp->status = UNDEFINE_CMD_ID;
        SOFTSIM_LOGE("malloc mem error");
        return;
    }
    memcpy(cmdreq, cmd, sizeof(cmd_req_t));
    cmd_req_t *req = (cmd_req_t *)cmdreq;
    init_log(req, resp);
    memset(resp->output, 0, SOFTSIM_OUTPUT_LEN);

    switch(req->cmd_id)
    {
        case SOFTSIM_CMD_ID_TRACK1:
            SOFTSIM_LOGD("Send SOFTSIM Test track1 data --> Success: %d", 90);
            resp->status = 90;
            break;
        case SOFTSIM_CMD_ID_TRACK2: {
            SOFTSIM_LOGD("[SOFTSIM] Send SOFTSIM Test track2 data --> Success");
            char *buf = "hello, Java, from TA";
            memcpy(resp->output, buf, strlen(buf));
            resp->out_len = strlen(buf);
            resp->status = 0;
            }
            break;

        case SOFTSIM_CMD_INIT:
            SOFTSIM_LOGD("[SOFTSIM] ");
            resp->status = 0;
            break;

        case SOFTSIM_CMD_CREATE_FILE:
        case SOFTSIM_CMD_GET_DEVICE_CERT:
        case SOFTSIM_CMD_GET_SERVICE_CERT:
        case SOFTSIM_CMD_GET_PRIVATE_KEY:
        case SOFTSIM_CMD_DRK_REQUEST:
        case SOFTSIM_CMD_GET_CACHED_CERTS:
            SOFTSIM_LOGI("SOFTSIM_CMD_XX_CERTS");
            process_certs_request(req, resp);
            resp->status = 0;
            break;

        case SOFTSIM_CMD_SOFTSIM_LOGIC_SELECT:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_SET_NETMODE:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_START:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_STOP:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_INSERT:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_REMOVE:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_RESET:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_COMMAND:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_WRITE_USIM:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_ENACTIVE_IMSI:
        case SOFTSIM_CMD_SOFTSIM_LOGIC_DEACTIVE_IMSI:
            /*SOFTSIM_LOGI("SOFTSIM_CMD_SOFTSIM_LOGIC_XXX, cmd_id: 0x%08x",req->cmd_id);*/
            process_softsim_logic_request(req, resp);
            break;

        case SOFTSIM_CMD_ADD_USIM_JSON:
        case SOFTSIM_CMD_ADD_USIM:
        case SOFTSIM_CMD_RETRIEVE_USIM:
        case SOFTSIM_CMD_RETRIEVE_MASKED_USIM:
        case SOFTSIM_CMD_RETRIEVE_ALL_USIM:
        case SOFTSIM_CMD_RETRIEVE_ALL_MASKED_USIM:
        case SOFTSIM_CMD_REMOVE_USIM:
        case SOFTSIM_CMD_REMOVE_ALL_USIM:
        case SOFTSIM_CMD_GET_APNINFO_FROM_TA:
        case SOFTSIM_CMD_GET_ACTIVATED_IMSI_INFO:
        case SOFTSIM_CMD_GET_SAVED_IMSI_NUM:
        case SOFTSIM_CMD_GET_ALL_SAVED_IMSI:
        case SOFTSIM_CMD_FORCE_REMOVE_ACTIVATED_IMSI:
        case SOFTSIM_CMD_FORCE_REMOVE_CACHED_SFS_FILES:
            SOFTSIM_LOGI("SOFTSIM_CMD_XXXX_USIM, cmd_id: 0x%08x",req->cmd_id);
            process_softsim_usim(req, resp);
            break;

        case SOFTSIM_CMD_AES_ENCRYPT:
        case SOFTSIM_CMD_AES_DECRYPT:
        case SOFTSIM_CMD_SAVE_RSA_ENCRYPTED_SYMMETRIC_KEY:
        case SOFTSIM_CMD_RESTORE_SYMMETRIC_KEY:
        case SOFTSIM_CMD_RSA_ENCRYPT:
        case SOFTSIM_CMD_RSA_DECRYPT:
        case SOFTSIM_CMD_SAVE_AES_ENCRYPTED_IMSI_RESOURCE:
            SOFTSIM_LOGI("SOFTSIM_CMD_XXXX_CRYPTO, cmd_id: 0x%08x",req->cmd_id);
            process_softsim_crypto(req, resp);
            break;

        default :
            resp->out_len= 0;
            resp->status = UNDEFINE_CMD_ID;
            SOFTSIM_LOGD("[SOFTSIM] Undefined command");
            break;
    }
    if(NULL != cmdreq) {
        tl_free(cmdreq);
    }

    cleanup_mem_pool();
    SOFTSIM_LOGD("buf pos :%d", get_log_pos());

    close_log();
}
