/*
 * Copyright (c) 2020 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __PARSEDATA_H__
#define __PARSEDATA_H__

#include <stdint.h>
#include "base.h"
#include "mem_stat.h"

#ifdef __cplusplus
extern "C" {
#endif

#define DEFINE_EMPTY_STRUCT_FUNC(d_name) \
    void *parse_##d_name(const char *payload, enum json_object_data_type data_type) \
    { \
        (void)payload; \
        (void)data_type; \
        return NULL; \
    } \
    void free_##d_name(void *obj) \
    { \
        (void)obj; \
    } \
    char *make_##d_name(void *data) \
    { \
        (void)data; \
        return "Current devices do not support this feature."; \
    }


struct pass_through_data {
    uint32_t message_code;
    void *payload_data;
};

uint32_t parse_header(const char *data);

struct pass_through_data *parse_data(const char *data);
void free_data(struct pass_through_data *data);

void *parse_payload(const char *payload, enum json_object_data_type data_type);
void free_payload(char *data, enum json_object_data_type data_type);

/* pake request */
void free_pake_request(void *obj);
char *make_pake_request(void *data);

/* pake response */
void *parse_pake_response(const char *payload, enum json_object_data_type data_type);
void free_pake_response(void *obj);

/* pake client confirm */
void free_pake_client_confirm(void *obj);
char *make_pake_client_confirm(void *data);

/* pake server confirm */
void *parse_pake_server_confirm(const char *payload, enum json_object_data_type data_type);
void free_pake_server_confirm(void *obj);

/* sts auth start request */
void free_auth_start_request(void *obj);
char *make_auth_start_request(void *data);

/* sts auth start response */
void *parse_auth_start_response(const char *payload, enum json_object_data_type data_type);
void free_auth_start_response(void *obj);

/* sts auth ack request */
void free_auth_ack_request(void *obj);
char *make_auth_ack_request(void *data);

/* sts auth ack response */
void *parse_auth_ack_response(const char *payload, enum json_object_data_type data_type);
void free_auth_ack_response(void *obj);

/* add auth data */
void *parse_add_auth_info_data(const char *payload, enum json_object_data_type data_type);
void free_add_auth_info_data(void *obj);
char *make_add_auth_info_data(void *data);

/* rmv auth request */
void *parse_rmv_auth_info_request(const char *payload, enum json_object_data_type data_type);
void free_rmv_auth_info_request(void *obj);
char *make_rmv_auth_info_request(void *data);

/* rmv auth response */
void *parse_rmv_auth_info_response(const char *payload, enum json_object_data_type type);
void free_rmv_auth_info_response(void *obj);
char *make_rmv_auth_info_response(void *data);

/* rmv auth data */
void *parse_rmv_auth_info_data(const char *payload, enum json_object_data_type data_type);
void free_rmv_auth_info_data(void *obj);
char *make_rmv_auth_info_data(void *data);

/* exchange request */
void free_exchange_request(void *obj);
char *make_exchange_request(void *data);

/* exchange response */
void *parse_exchange_response(const char *payload, enum json_object_data_type data_type);
void free_exchange_response(void *obj);

/* exchange authdata */
void *parse_exchange_data(const char *payload, enum json_object_data_type data_type);
void free_exchange_data(void *obj);
char *make_exchange_data(void *data);

/* sec_clone data */
void *sec_clone_parse_client_request(const char *payload, enum json_object_data_type data_type);
void sec_clone_free_client_request(void *obj);
char *sec_clone_make_srv_proof(void *data);
void *sec_clone_parse_client_ack(const char *payload, enum json_object_data_type data_type);
void sec_clone_free_client_ack(void *obj);
char *sec_clone_make_clone_ret(void *data);
void *sec_clone_parse_start_resp(const char *payload, enum json_object_data_type data_type);
void *sec_clone_parse_ack_resp(const char *payload, enum json_object_data_type data_type);

/* inform message */
void *parse_inform_message(const char *payload, enum json_object_data_type data_type);
void free_inform_message(void *obj);
char *make_inform_message(void *data);

#define FIELD_ADD_TYPE        "addType"
#define FIELD_ADD_ID          "addId"
#define FIELD_ADD_KEY         "addKey"
#define FIELD_AUTH_DATA       "authData"
#define FIELD_AUTH_RETURN     "authReturn"
#define FIELD_AUTH_ID         "authId"
#define FIELD_AUTH_PK         "authPk"
#define FIELD_AUTH_FORM       "authForm"
#define FIELD_ADD_AUTH_INFO   "addAuthInfo"
#define FIELD_ADD_RETURN      "addReturn"
#define FIELD_CHALLENGE       "challenge"
#define FIELD_CURRENT_VERSION "currentVersion"
#define FIELD_EPK             "epk"
#define FIELD_EPK_LEN         "epkLen"
#define FIELD_EX_AUTH_INFO    "exAuthInfo"
#define FIELD_ERROR_CODE      "errorCode"
#define FIELD_KCF_DATA        "kcfData"
#define FIELD_KEY_LENGTH      "keyLength"
#define FIELD_KEY_TYPE        "keyType"
#define FIELD_MESSAGE         "message"
#define FIELD_MIN_VERSION     "minVersion"
#define FIELD_OPERATION_CODE  "operationCode"
#define FIELD_OWNER_ID        "ownerId"
#define FIELD_PERMISSION      "Permission"
#define FIELD_PAYLOAD         "payload"
#define FIELD_PUBLIC_KEY      "publicKey"
#define FIELD_PKG_NAME        "pkgName"
#define FIELD_PEER_AUTH_ID    "peerAuthId"
#define FIELD_PEER_USER_TYPE  "peerUserType"
#define FIELD_RMV_TYPE        "rmvType"
#define FIELD_RMV_ID          "rmvId"
#define FIELD_RMV_AUTH_INFO   "rmvAuthInfo"
#define FIELD_RMV_RETURN      "rmvReturn"
#define FIELD_SALT            "salt"
#define FIELD_SUPPORT_256_MOD "support256mod"
#define FIELD_SERVICE_TYPE    "serviceType"
#define FIELD_VERSION         "version"

#ifdef __cplusplus
}
#endif
#endif /* __PARSEDATA_H__ */