2
0
forked from Ivasoft/DSView

remove libzip, and fix srzip data is empty

This commit is contained in:
dreamsourcelabTAI
2022-07-05 11:01:52 +08:00
parent e36c1372bf
commit 4077e0bf22
11 changed files with 300 additions and 479 deletions

View File

@@ -30,6 +30,6 @@
#define DS_VERSION_MAJOR 1
#define DS_VERSION_MINOR 2
#define DS_VERSION_MICRO 0
#define DS_VERSION_STRING "1.2.0-RC10"
#define DS_VERSION_STRING "1.2.0-RC15"
#endif

View File

@@ -25,6 +25,7 @@
#include <string.h>
#include <sys/stat.h>
#include <time.h>
#include <QDebug>
ZipMaker::ZipMaker() :
m_zDoc(NULL)
@@ -160,4 +161,84 @@ const char *ZipMaker::GetError()
if (m_error[0])
return m_error;
return NULL;
}
//-----------------ZipReader
ZipInnerFileData::ZipInnerFileData(char *data, int size)
{
_data = data;
_size = size;
}
ZipInnerFileData::~ZipInnerFileData()
{
if (_data != NULL){
free(_data);
_data = NULL;
}
}
ZipReader::ZipReader(const char *filePath)
{
m_archive = NULL;
m_archive = unzOpen64(filePath);
}
ZipReader::~ZipReader()
{
Close();
}
void ZipReader::Close()
{
if (m_archive != NULL){
unzClose(m_archive);
m_archive = NULL;
}
}
ZipInnerFileData* ZipReader::GetInnterFileData(const char *innerFile)
{
char *metafile = NULL;
char szFilePath[15];
unz_file_info64 fileInfo;
if (m_archive == NULL){
return NULL;
}
// inner file not exists
if (unzLocateFile(m_archive, innerFile, 0) != UNZ_OK){
return NULL;
}
if (unzGetCurrentFileInfo64(m_archive, &fileInfo, szFilePath,
sizeof(szFilePath), NULL, 0, NULL, 0) != UNZ_OK)
{
return NULL;
}
if (unzOpenCurrentFile(m_archive) != UNZ_OK)
{
return NULL;
}
if (fileInfo.uncompressed_size > 0 && (metafile = (char *)malloc(fileInfo.uncompressed_size)))
{
unzReadCurrentFile(m_archive, metafile, fileInfo.uncompressed_size);
unzCloseCurrentFile(m_archive);
ZipInnerFileData *data = new ZipInnerFileData(metafile, fileInfo.uncompressed_size);
return data;
}
return NULL;
}
void ZipReader::ReleaseInnerFileData(ZipInnerFileData *data)
{
if (data){
delete data;
}
}

View File

@@ -23,17 +23,10 @@
#pragma once
#include "../../common/minizip/zip.h"
typedef struct
{
char inFileName[256];
int inFileNameLen;
void *pData;
long long dataLen;
} UnZipFileInfo;
#include <minizip/zip.h>
#include <minizip/unzip.h>
class ZipMaker
{
public:
@@ -67,4 +60,43 @@ private:
zip_fileinfo *m_zi; //life must as m_zDoc;
char m_error[500];
};
//------------------ZipReader
class ZipInnerFileData
{
public:
ZipInnerFileData(char *data, int size);
~ZipInnerFileData();
inline char *data(){
return _data;
}
inline int size(){
return _size;
}
private:
char *_data;
int _size;
};
class ZipReader{
public:
ZipReader(const char *filePath);
~ZipReader();
void Close();
inline bool HaveArchive(){
return m_archive != NULL;
}
ZipInnerFileData* GetInnterFileData(const char *innerFile);
void ReleaseInnerFileData(ZipInnerFileData *data);
private:
unzFile m_archive;
};

View File

@@ -24,9 +24,10 @@
#include "sessionfile.h"
#include <QFileInfo>
#include <zip.h>
#include <assert.h>
#include "../utility/path.h"
#include <stdlib.h>
#include "../ZipMaker.h"
namespace pv {
namespace device {
@@ -70,67 +71,38 @@ File* File::create(QString name)
}
QJsonArray File::get_decoders()
{
struct zip *archive;
struct zip_file *zf;
struct zip_stat zs;
int ret;
char *dec_file;
{
QJsonArray dec_array;
QJsonParseError error;
QJsonParseError error;
/* read "decoders" */
auto f_name = path::ConvertPath(_path);
ZipReader rd(f_name.c_str());
auto *data = rd.GetInnterFileData("decoders");
archive = zip_open(f_name.c_str(), 0, &ret);
if (archive) {
/* read "decoders" */
if (zip_stat(archive, "decoders", 0, &zs) != -1) {
dec_file = (char *)g_try_malloc(zs.size);
if (dec_file) {
zf = zip_fopen_index(archive, zs.index, 0);
zip_fread(zf, dec_file, zs.size);
zip_fclose(zf);
//QString sessionData = QString::fromUtf8(dec_file);
QJsonDocument sessionDoc = QJsonDocument::fromJson(QByteArray::fromRawData(dec_file, zs.size), &error);
dec_array = sessionDoc.array();
}
}
zip_close(archive);
if (data != NULL){
QJsonDocument sessionDoc = QJsonDocument::fromJson(
QByteArray::fromRawData(data->data(), data->size()), &error);
dec_array = sessionDoc.array();
rd.ReleaseInnerFileData(data);
}
return dec_array;
}
QJsonDocument File::get_session()
{
struct zip *archive;
struct zip_file *zf;
struct zip_stat zs;
int ret;
char *dec_file;
{
QJsonDocument sessionDoc;
QJsonParseError error;
auto f_name = path::ConvertPath(_path);
ZipReader rd(f_name.c_str());
auto *data = rd.GetInnterFileData("session");
archive = zip_open(f_name.c_str(), 0, &ret);
if (archive) {
/* read "decoders" */
if (zip_stat(archive, "session", 0, &zs) != -1) {
dec_file = (char *)g_try_malloc(zs.size);
if (dec_file) {
zf = zip_fopen_index(archive, zs.index, 0);
zip_fread(zf, dec_file, zs.size);
zip_fclose(zf);
//QString sessionData = QString::fromUtf8(dec_file);
sessionDoc = QJsonDocument::fromJson(QByteArray::fromRawData(dec_file, zs.size), &error);
}
}
zip_close(archive);
if (data != NULL){
sessionDoc = QJsonDocument::fromJson(
QByteArray::fromRawData(data->data(), data->size()), &error);
rd.ReleaseInnerFileData(data);
}
return sessionDoc;