forked from Ivasoft/DSView
remove libzip, and fix srzip data is empty
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user