Files
2026-08-24 10:03:24 +08:00

199 lines
5.0 KiB
C++

/*
* Copyright (c) 2014 Amlogic, Inc. All rights reserved.
*
* This source code is subject to the terms and conditions defined in the
* file 'LICENSE' which is part of this source code package.
*
* Description: c++ file
*/
#define LOG_MODULE_TAG "PQ"
#define LOG_CLASS_TAG "SSMHandler"
#include "SSMHandler.h"
SSMHandler* SSMHandler::mSSMHandler = NULL;
SSMHandler* SSMHandler::GetSingletonInstance(const char *SSMHandlerPath)
{
if (!mSSMHandler) {
mSSMHandler = new SSMHandler();
mSSMHandler->mSSMHandlerPath = SSMHandlerPath;
if (mSSMHandler && !mSSMHandler->Construct()) {
delete mSSMHandler;
mSSMHandler = NULL;
}
}
return mSSMHandler;
}
SSMHandler::SSMHandler()
{
mFd = -1;
mSSMHandlerPath = NULL;
memset (&mSSMHeader_section1, 0, sizeof (SSMHeader_section1_t));
unsigned int sum = 0;
for (unsigned int i = 1; i < gSSMHeader_section1.count; i++) {
sum += gSSMHeader_section2[i-1].size;
gSSMHeader_section2[i].addr = sum;
}
}
SSMHandler::~SSMHandler()
{
if (mFd > 0) {
close(mFd);
mFd = -1;
}
}
bool SSMHandler::Construct()
{
bool ret = true;
mFd = open(mSSMHandlerPath, O_RDWR | O_SYNC | O_CREAT, S_IRUSR | S_IWUSR);
if (-1 == mFd) {
ret = false;
LOGD ("%s, Open %s failure\n", __FUNCTION__, mSSMHandlerPath);
}
return ret;
}
bool SSMHandler::CheckHandler(void)
{
lseek (mFd, 0, SEEK_SET);
SSMHeader_section1_t header_section1;
ssize_t ssize = read(mFd, &header_section1, sizeof(SSMHeader_section1_t));
if (ssize != sizeof(SSMHeader_section1_t)) {
SYS_LOGE("Failed to read section1 header, expected %zu, got %zd\n", sizeof(SSMHeader_section1_t), ssize);
return false;
}
if (header_section1.count > SSM_DATA_MAX || header_section1.count == 0) {
SYS_LOGE("Invalid count value: %u\n", header_section1.count);
return false;
}
size_t required_size = header_section1.count * sizeof(SSMHeader_section2_t);
ssize_t ssize1 = read(mFd, gSSMHeader_section2, required_size);
if (ssize1 != static_cast<ssize_t>(required_size)) {
SYS_LOGE("Failed to read section2 data, expected %zu, got %zd\n", required_size, ssize1);
memset(gSSMHeader_section2, 0, required_size);
return false;
}
SYS_LOGD("%s, ssize %zd, ssize1 %zd, count %u\n", __FUNCTION__, ssize, ssize1, header_section1.count);
return true;
}
SSM_status_t SSMHandler::SSMSection1Verify()
{
SSM_status_t ret = SSM_HEADER_VALID;
lseek (mFd, 0, SEEK_SET);
ssize_t ssize = read(mFd, &mSSMHeader_section1, sizeof (SSMHeader_section1_t));
if (ssize != sizeof (SSMHeader_section1_t) ||
mSSMHeader_section1.magic != gSSMHeader_section1.magic ||
mSSMHeader_section1.count != gSSMHeader_section1.count ||
mSSMHeader_section1.version != gSSMHeader_section1.version) {
ret = SSM_HEADER_INVALID;
}
return ret;
}
SSM_status_t SSMHandler::SSMSection2Verify(SSM_status_t SSM_status)
{
return SSM_status;
}
int SSMHandler::SSMSaveCurrentHeader(current_ssmheader_section2_t *header_cur)
{
std::vector<SSMHeader_section2_t> vsection2;
unsigned int size = 0;
int rd_size;
LOGD ("%s --- line:%d\n", __FUNCTION__, __LINE__);
if (lseek (mFd, sizeof (SSMHeader_section1_t), SEEK_SET) == 1) {
LOGE("%s seek faile\n", __FUNCTION__);
}
for (unsigned int i = 0; i < gSSMHeader_section1.count; i++) {
SSMHeader_section2_t temp;
rd_size = read(mFd, &temp, sizeof (SSMHeader_section2_t));
if (rd_size < 0) {
LOGE("read error = %s\n", strerror(errno));
}
vsection2.push_back(temp);
size += temp.size;
}
header_cur->size = size;
memcpy(header_cur->header_section2_data, &vsection2, sizeof(vsection2));
//if (header_cur->size < 0) {
// LOGE ("SSMSaveCurrentHeader error!\n");
// return -1;
//}
return 0;
}
bool SSMHandler::SSMRecreateHeader()
{
bool ret = true;
int wr_size;
int size;
LOGD ("%s ---.\n", __FUNCTION__);
size = ftruncate(mFd, 0);
if (size < 0) {
LOGE("ftruncate error = %s\n", strerror(errno));
}
lseek (mFd, 0, SEEK_SET);
//cal Addr and write
size = write(mFd, &gSSMHeader_section1, sizeof (SSMHeader_section1_t));
if (size < 0) {
LOGE("write error = %s\n", strerror(errno));
}
wr_size = write(mFd, gSSMHeader_section2, gSSMHeader_section1.count * sizeof (SSMHeader_section2_t));
if (wr_size < 0) {
LOGE("write error = %s\n", strerror(errno));
}
return ret;
}
unsigned int SSMHandler::SSMGetActualAddr(int id)
{
return gSSMHeader_section2[id].addr;
}
unsigned int SSMHandler::SSMGetActualSize(int id)
{
return gSSMHeader_section2[id].size;
}
SSM_status_t SSMHandler::SSMVerify()
{
return SSMSection2Verify(SSMSection1Verify());
}
SSMHandler& SSMHandler::operator = (const SSMHandler& obj)
{
return const_cast<SSMHandler&>(obj);
}