/* common/KMChecksum.cpp
 *
 * Copyright (C) 2023 OpenKylin, Inc
 */

#include "KMChecksum.h"

KMChecksum::KMChecksum(GChecksumType checksum_type)
{
    m_checksum = g_checksum_new(checksum_type);
}

KMChecksum::~KMChecksum()
{
    if (m_checksum)
    {
        g_checksum_free(m_checksum);
    }
}

/**
 * @brief : 将数据馈送到现有的GChecksum中，校验和必须仍然处于打开状态，即不能在校验和上调用getString（）或getDigest（）
 * @param : [in] data, 用于计算校验和的缓冲区。
 * @param : [in] length，缓冲区的大小，如果是以null结尾的字符串，则为-1。
 */
void KMChecksum::update(const unsigned char *data, std::size_t length)
{
    g_checksum_update(m_checksum, data, length);
}

/**
 * @brief : 从校验和中获取摘要作为原始二进制矢量，并将其放入缓冲区。摘要的大小取决于校验和的类型。调用此函数后，GChecksum将关闭，并且不能再使用update（）进行更新。
 * @param : [out] buffer, 输出缓冲区
 * @param : [in | out] digest_len，调用方将其初始化为缓冲区的大小。在调用之后，它包含摘要的长度。
 */
void KMChecksum::getDigest(unsigned char *buffer, std::size_t *digest_len)
{
    g_checksum_get_digest(m_checksum, buffer, digest_len);
}

/**
 * @brief : 获取十六进制字符串形式的摘要。一旦调用了此函数，就不能再使用update（）更新GChecksum。十六进制字符将使用小写。
 * @return: 校验和的十六进制表示。返回的字符串归校验和所有，不应修改或释放。
 */
std::string KMChecksum::getString()
{
    const char *checksum = g_checksum_get_string(m_checksum);

    if (checksum)
    {
        return checksum;
    }
    else
    {
        return "";
    }
}
