Files

573 lines
17 KiB
C++
Raw Permalink Normal View History

2026-10-04 00:04:20 +08:00
/**
* CBitAnswer 类,接口的封装实现
2026-09-28 15:28:50 +08:00
*/
#include "StdAfx.h"
#include "BitAnswerCpp.h"
CBitAnswer::CBitAnswer(void)
{
m_ref = 0;
}
CBitAnswer::~CBitAnswer(void)
{
2026-10-04 00:04:20 +08:00
// 释放类的时候,调用Logout释放相关资源
2026-09-28 15:28:50 +08:00
if (m_ref > 0)
{
Bit_Logout(m_handle);
}
}
/**
2026-10-04 00:04:20 +08:00
* 进行授权登陆,获取操作句柄。必须在除升级函数之外的其它操作前执行。根据登录模式的不同可能需要连接授权服务器。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::Login(BIT_PCSTR szSN, LOGIN_MODE mode)
{
if (m_ref == 0)
{
BIT_STATUS status = Bit_Login(NULL, szSN, m_application_data, &m_handle, mode);
if (status != BIT_SUCCESS)
{
return status;
}
m_sn = szSN;
m_mode = mode;
}
m_ref++;
return BIT_SUCCESS;
}
/**
2026-10-04 00:04:20 +08:00
* 进行授权登陆,获取操作句柄。必须在除升级函数之外的其它操作前执行。根据登录模式的不同可能需要连接授权服务器。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::LoginEx(BIT_PCSTR szSN, BIT_UINT32 featureId, LOGIN_MODE mode)
{
if (m_ref == 0)
{
BIT_STATUS status = Bit_LoginEx(NULL, szSN, featureId, NULL, m_application_data, &m_handle, mode);
if (status != BIT_SUCCESS)
{
return status;
}
m_sn = szSN;
m_mode = mode;
}
m_ref++;
return BIT_SUCCESS;
}
/**
2026-10-04 00:04:20 +08:00
* 授权退出
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::Logout()
{
if (m_ref > 0)
{
m_ref--;
}
if (m_ref == 0)
{
return Bit_Logout(m_handle);
}
return BIT_SUCCESS;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于读取特征项的数据内容,可用于“只读”和“读写”特征类型。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::ReadFeature(BIT_UINT32 featureId, BIT_UINT32 *pFeatureValue)
{
BIT_STATUS status = Bit_ReadFeature(m_handle, featureId, pFeatureValue);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_ReadFeature(m_handle, featureId, pFeatureValue);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于更新“读写”类型的特征项的数据内容。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::WriteFeature(BIT_UINT32 featureId, BIT_UINT32 featureValue)
{
BIT_STATUS status = Bit_WriteFeature(m_handle, featureId, featureValue);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_WriteFeature(m_handle, featureId, featureValue);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于使用“算法”类型的特征项对输入参数进行变换操作,得到唯一对应的4字节结果。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::ConvertFeature(BIT_UINT32 featureId, BIT_UINT32 para1, BIT_UINT32 para2, BIT_UINT32 para3, BIT_UINT32 para4, BIT_UINT32 *pResult)
{
BIT_STATUS status = Bit_ConvertFeature(m_handle, featureId, para1, para2, para3, para4, pResult);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_ConvertFeature(m_handle, featureId, para1, para2, para3, para4, pResult);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于使用“密钥”类型的特征项对输入的明文进行加密,返回密文结果。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::EncryptFeature(BIT_UINT32 featureId, BIT_UCHAR *pPlainBuffer, BIT_UCHAR *pCipherBuffer, BIT_UINT32 bufferSize)
{
BIT_STATUS status = Bit_EncryptFeature(m_handle, featureId, pPlainBuffer, pCipherBuffer, bufferSize);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_EncryptFeature(m_handle, featureId, pPlainBuffer, pCipherBuffer, bufferSize);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于使用“密钥”类型的特征项对输入的密文进行解密,返回明文结果。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::DecryptFeature(BIT_UINT32 featureId, BIT_UCHAR *pCipherBuffer, BIT_UCHAR *pPlainBuffer, BIT_UINT32 bufferSize)
{
BIT_STATUS status = Bit_DecryptFeature(m_handle, featureId, pCipherBuffer, pPlainBuffer, bufferSize);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_DecryptFeature(m_handle, featureId, pCipherBuffer, pPlainBuffer, bufferSize);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 获取“用户”类型特征项的用户数,并返回剩余容量。如没有可分配用户数,则返回1810错误。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::QueryFeature(BIT_UINT32 featureId, BIT_UINT32 *pCapacity)
{
BIT_STATUS status = Bit_QueryFeature(m_handle, featureId, pCapacity);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_QueryFeature(m_handle, featureId, pCapacity);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 释放“用户”类型特征项的用户数,并返回剩余容量。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::ReleaseFeature(BIT_UINT32 featureId, BIT_UINT32 *pCapacity)
{
BIT_STATUS status = Bit_ReleaseFeature(m_handle, featureId, pCapacity);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_ReleaseFeature(m_handle, featureId, pCapacity);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 创建或更新配置项。如果相同名称的配置项存在,则会更新其中的数据;否则将添加新的授权码配置项。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::SetDataItem(BIT_PCSTR szDataItemName, BIT_PCSTR szDataValue)
{
BIT_STATUS status = Bit_SetDataItem(m_handle, szDataItemName, (void*)szDataValue, strlen(szDataValue));
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_SetDataItem(m_handle, szDataItemName, (void*)szDataValue, strlen(szDataValue));
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 删除指定的配置项。该操作无法删除在比特平台上设置的产品配置项或模版配置项。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::RemoveDataItem(BIT_PCSTR dataItemName)
{
BIT_STATUS status = Bit_RemoveDataItem(m_handle, dataItemName);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_RemoveDataItem(m_handle, dataItemName);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 读取指定的配置项数据。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetDataItem(BIT_PCSTR szDataItemName, std::string& dataValue)
{
BIT_CHAR *pDataItemValue = new BIT_CHAR[1024];
BIT_UINT32 dataItemValueSize = 1024;
BIT_STATUS status = Bit_GetDataItem(m_handle, szDataItemName, pDataItemValue, &dataItemValueSize);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_GetDataItem(m_handle, szDataItemName, pDataItemValue, &dataItemValueSize);
}
}
dataValue = pDataItemValue;
if (pDataItemValue != NULL)
{
delete[] pDataItemValue;
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于获取可访问配置项的数量,一般用于配置项的枚举操作。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetDataItemNum(BIT_UINT32 *pNumber)
{
BIT_STATUS status = Bit_GetDataItemNum(m_handle, pNumber);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_GetDataItemNum(m_handle, pNumber);
}
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 根据配置项索引获取其名称,一般用于配置项的枚举操作。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetDataItemName(BIT_UINT32 index, std::string &dataName)
{
BIT_CHAR *pDataName = new BIT_CHAR[1024];
BIT_UINT32 dataItemNameSize = 1024;
BIT_STATUS status = Bit_GetDataItemName(m_handle, index, pDataName, &dataItemNameSize);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_GetDataItemName(m_handle, index, pDataName, &dataItemNameSize);
}
}
dataName = pDataName;
if (pDataName != NULL)
{
delete[] pDataName;
}
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 获取当前会话信息。根据获取的内容不同,此函数返回的数据可能是XML格式或非XML格式。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetSessionInfo(SESSION_TYPE type, std::string &sessionInfo)
{
BIT_UINT32 sessionInfoSize = 1024;
BIT_CHAR *pSessionInfo = new BIT_CHAR[sessionInfoSize];
if (pSessionInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
BIT_STATUS status = Bit_GetSessionInfo(m_handle, type, pSessionInfo, &sessionInfoSize);
if (status == BIT_ERR_NEED_LOGIN)
{
m_ref = 0;
status = Login(m_sn, m_mode);
if (status == BIT_SUCCESS)
{
status = Bit_GetSessionInfo(m_handle, type, pSessionInfo, &sessionInfoSize);
}
}
if (status == BIT_ERR_BUFFER_SMALL)
{
delete[] pSessionInfo;
pSessionInfo = new BIT_CHAR[sessionInfoSize];
if (pSessionInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
status = Bit_GetSessionInfo(m_handle, type, pSessionInfo, &sessionInfoSize);
}
sessionInfo = pSessionInfo;
delete[] pSessionInfo;
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 获取授权信息及使用环境信息,数据以XML格式返回。调用此函数前客户端不需要执行登录操作。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetInfo(BIT_PCSTR szSN, BIT_INFO_TYPE type, std::string& info)
{
BIT_UINT32 infoSize = 1024;
BIT_CHAR *pInfo = new BIT_CHAR[infoSize];
if (pInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
BIT_STATUS status = Bit_GetInfo(szSN, m_application_data, type, pInfo, &infoSize);
if (status == BIT_ERR_BUFFER_SMALL)
{
delete[] pInfo;
pInfo = new BIT_CHAR[infoSize];
if (pInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
status = Bit_GetInfo(szSN, m_application_data, type, pInfo, &infoSize);
}
info = pInfo;
delete[] pInfo;
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 获取当前运行环境的升级请求码,用于发起本地授权激活及升级请求。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetRequestInfo(BIT_PCSTR szSN, BINDING_TYPE type, std::string& requestInfo)
{
BIT_CHAR *pRequestInfo = NULL;
BIT_UINT32 requestInfoSize = 10240;
pRequestInfo = new BIT_CHAR[requestInfoSize];
if (pRequestInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
BIT_STATUS status = Bit_GetRequestInfo(szSN, m_application_data, type, pRequestInfo, &requestInfoSize);
if (status == BIT_ERR_BUFFER_SMALL)
{
delete[] pRequestInfo;
pRequestInfo = new BIT_CHAR[requestInfoSize];
if (pRequestInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
status = Bit_GetRequestInfo(szSN, m_application_data, type, pRequestInfo, &requestInfoSize);
}
requestInfo = pRequestInfo;
delete[] pRequestInfo;
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 使用请求码与授权服务器进行连接,获取升级码。本函数需要进行网络连接。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetUpdateInfo(BIT_PCSTR szSN, BIT_PCSTR pRequestInfo, std::string &updateInfo)
{
BIT_CHAR *pUpdateInfo = NULL;
BIT_UINT32 updateInfoSize = 10240;
pUpdateInfo = new BIT_CHAR[updateInfoSize];
if (pUpdateInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
BIT_STATUS status = Bit_GetUpdateInfo(NULL, szSN, m_application_data, pRequestInfo, pUpdateInfo, &updateInfoSize);
if (status == BIT_ERR_BUFFER_SMALL)
{
delete[] pUpdateInfo;
pUpdateInfo = new BIT_CHAR[updateInfoSize];
if (pUpdateInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
status = Bit_GetUpdateInfo(NULL, szSN, m_application_data, pRequestInfo, pUpdateInfo, &updateInfoSize);
}
updateInfo = pUpdateInfo;
delete[] pUpdateInfo;
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 应用升级码完成本地授权激活或升级。本函数必须在获取请求码的同一环境下执行。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::ApplyUpdateInfo(BIT_PCSTR pUpdateInfo, std::string& receiptInfo)
{
BIT_CHAR *pReceiptInfo = NULL;
BIT_UINT32 receiptInfoSize = 10240;
pReceiptInfo = new BIT_CHAR[receiptInfoSize];
if (pReceiptInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
BIT_STATUS status = Bit_ApplyUpdateInfo(m_application_data, pUpdateInfo, pReceiptInfo, &receiptInfoSize);
if (status == BIT_ERR_BUFFER_SMALL)
{
delete[] pReceiptInfo;
pReceiptInfo = new BIT_CHAR[receiptInfoSize];
if (pReceiptInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
status = Bit_ApplyUpdateInfo(m_application_data, pUpdateInfo, pReceiptInfo, &receiptInfoSize);
}
receiptInfo = pReceiptInfo;
delete[] pReceiptInfo;
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于与授权服务器在线连接,自动完成本地授权的升级操作。本函数需要进行网络连接。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::UpdateOnline(BIT_PCSTR szSN)
{
return Bit_UpdateOnline(NULL, szSN, m_application_data);
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于完成授权的在线迁出,迁出以后,其他机器就可以用了。本函数需要进行网络连接。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::RevokeOnline(BIT_PCSTR szSN)
{
return Bit_Revoke(NULL, szSN, m_application_data, NULL, NULL);
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于与产生授权的离线迁出请求码。本函数需要进行网络连接。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::Revoke(BIT_PCSTR szSN, std::string& revokeInfo)
{
BIT_CHAR *pRevocationInfo = NULL;
BIT_UINT32 revocationInfoSize = 10240;
pRevocationInfo = new BIT_CHAR[revocationInfoSize];
if (pRevocationInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
BIT_STATUS status = Bit_Revoke(NULL, szSN, m_application_data, pRevocationInfo, &revocationInfoSize);
if (status == BIT_ERR_BUFFER_SMALL)
{
delete[] pRevocationInfo;
pRevocationInfo = new BIT_CHAR[revocationInfoSize];
if (pRevocationInfo == NULL)
{
return BIT_ERR_MALLOC_FAILED;
}
status = Bit_Revoke(NULL, szSN, m_application_data, pRevocationInfo, &revocationInfoSize);
}
revokeInfo = pRevocationInfo;
delete[] pRevocationInfo;
return status;
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于设置集团服务的地址和端口。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::SetLocalServer(BIT_PCSTR szHostName, BIT_UINT32 nPort, BIT_UINT32 nTimeoutSeconds)
{
return Bit_SetLocalServer(m_application_data, szHostName, nPort, nTimeoutSeconds);
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于设置代理服务的地址和端口。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::SetProxy(BIT_PCSTR szHostName, BIT_UINT32 nPort, BIT_PCSTR szUserID, BIT_PCSTR szPassword)
{
return Bit_SetProxy(m_application_data, szHostName, nPort, szUserID, szPassword);
}
/**
2026-10-04 00:04:20 +08:00
* 此函数用于删除授权。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::RemoveSn(BIT_PCSTR szSN)
{
return Bit_RemoveSn(szSN, m_application_data);
}
/**
2026-10-04 00:04:20 +08:00
* 获取授权信息及使用环境信息,数据以XML格式返回。调用此函数前客户端不需要执行登录操作。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetInfo(BIT_PCSTR szSN, BIT_INFO_TYPE type, BIT_CHAR *pInfo, BIT_UINT32 *pInfoSize)
{
return Bit_GetInfo(szSN, m_application_data, type, pInfo, pInfoSize);
}
/**
2026-10-04 00:04:20 +08:00
* 获取客户端安全库版本号。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::GetVersion(BIT_UINT32 *pVersion)
{
return Bit_GetVersion(pVersion);
}
/**
2026-10-04 00:04:20 +08:00
* 从集团授权服务器借出一个完整的授权码,以允许客户端脱离集团服务器单独使用。
* 被借出的集团授权码必须具有可借出属性,并在客户端成功借出后减少一个可用用户数。
* 被借出的用户数在到期后将自动返还给集团服务器。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::CheckOutSn(BIT_PCSTR szURL, BIT_UINT32 featureId, BIT_UINT32 nDurationDays)
{
return Bit_CheckOutSn(szURL, featureId, m_application_data, nDurationDays);
}
/**
2026-10-04 00:04:20 +08:00
* 从集团授权服务器借出一组特征项,这些特征项必须包含在同一个授权码中。
* 被借出的集团授权码必须具有可借出属性,并在客户端成功借出后减少一个可用用户数。
* 被借出的用户数在到期后将自动返还给集团服务器。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::CheckOutFeatures(BIT_PCSTR szURL, BIT_UINT32 *pFeatureList, BIT_UINT32 nFeatureInList, BIT_UINT32 nDurationDays)
{
return Bit_CheckOutFeatures(szURL, m_application_data, pFeatureList, nFeatureInList, nDurationDays);
}
/**
2026-10-04 00:04:20 +08:00
* 提前返还从集团授权服务器借出的授权。要提前返还授权,该授权码必须具有允许提前返还属性。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::CheckIn(BIT_PCSTR szURL, BIT_UINT32 featureId)
{
return Bit_CheckIn(szURL, featureId, m_application_data);
}
/**
2026-10-04 00:04:20 +08:00
* 测试集团授权和特征项是否可用,不会占用授权码或特征项的用户数。
2026-09-28 15:28:50 +08:00
*/
BIT_STATUS CBitAnswer::TestBitService(BIT_PCSTR szURL, BIT_PCSTR szSN, BIT_UINT32 featureId)
{
return Bit_TestBitService(szURL, szSN, featureId, m_application_data);
}