7z: use fopen on all platforms

This commit is contained in:
flyinghead 2021-11-27 14:08:07 +01:00
parent f91847dad0
commit 0579f2ede6
2 changed files with 85 additions and 99 deletions

View File

@ -33,25 +33,10 @@ bool SzArchive::Open(const char* path)
File_Close(&archiveStream.file); File_Close(&archiveStream.file);
File_Construct(&archiveStream.file); File_Construct(&archiveStream.file);
#ifdef USE_WINDOWS_FILE
nowide::wstackstring wpath;
if (!wpath.convert(path))
return false;
#if (_WIN32_WINNT >= 0x0602 /*_WIN32_WINNT_WIN8*/)
archiveStream.file.handle = CreateFile2(wpath.c_str(),
GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL);
#else
archiveStream.file.handle = CreateFileW(wpath.c_str(),
GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
#endif
if (archiveStream.file.handle == INVALID_HANDLE_VALUE)
return false;
#else
archiveStream.file.file = nowide::fopen(path, "rb"); archiveStream.file.file = nowide::fopen(path, "rb");
if (archiveStream.file.file == nullptr) if (archiveStream.file.file == nullptr)
return false; return false;
#endif
FileInStream_CreateVTable(&archiveStream); FileInStream_CreateVTable(&archiveStream);
LookToRead2_CreateVTable(&lookStream, 0); LookToRead2_CreateVTable(&lookStream, 0);
lookStream.buf = (Byte *)ISzAlloc_Alloc(&g_Alloc, kInputBufSize); lookStream.buf = (Byte *)ISzAlloc_Alloc(&g_Alloc, kInputBufSize);

View File

@ -1,83 +1,84 @@
/* 7zFile.h -- File IO /* 7zFile.h -- File IO
2017-04-03 : Igor Pavlov : Public domain */ 2017-04-03 : Igor Pavlov : Public domain */
#ifndef __7Z_FILE_H #ifndef __7Z_FILE_H
#define __7Z_FILE_H #define __7Z_FILE_H
#ifdef _WIN32 // Flycast handles wchar file path already
#define USE_WINDOWS_FILE //#ifdef _WIN32
#endif //#define USE_WINDOWS_FILE
//#endif
#ifdef USE_WINDOWS_FILE
#include <windows.h> #ifdef USE_WINDOWS_FILE
#else #include <windows.h>
#include <stdio.h> #else
#endif #include <stdio.h>
#endif
#include "7zTypes.h"
#include "7zTypes.h"
EXTERN_C_BEGIN
EXTERN_C_BEGIN
/* ---------- File ---------- */
/* ---------- File ---------- */
typedef struct
{ typedef struct
#ifdef USE_WINDOWS_FILE {
HANDLE handle; #ifdef USE_WINDOWS_FILE
#else HANDLE handle;
FILE *file; #else
#endif FILE *file;
} CSzFile; #endif
} CSzFile;
void File_Construct(CSzFile *p);
#if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE) void File_Construct(CSzFile *p);
WRes InFile_Open(CSzFile *p, const char *name); #if !defined(UNDER_CE) || !defined(USE_WINDOWS_FILE)
WRes OutFile_Open(CSzFile *p, const char *name); WRes InFile_Open(CSzFile *p, const char *name);
#endif WRes OutFile_Open(CSzFile *p, const char *name);
#ifdef USE_WINDOWS_FILE #endif
WRes InFile_OpenW(CSzFile *p, const WCHAR *name); #ifdef USE_WINDOWS_FILE
WRes OutFile_OpenW(CSzFile *p, const WCHAR *name); WRes InFile_OpenW(CSzFile *p, const WCHAR *name);
#endif WRes OutFile_OpenW(CSzFile *p, const WCHAR *name);
WRes File_Close(CSzFile *p); #endif
WRes File_Close(CSzFile *p);
/* reads max(*size, remain file's size) bytes */
WRes File_Read(CSzFile *p, void *data, size_t *size); /* reads max(*size, remain file's size) bytes */
WRes File_Read(CSzFile *p, void *data, size_t *size);
/* writes *size bytes */
WRes File_Write(CSzFile *p, const void *data, size_t *size); /* writes *size bytes */
WRes File_Write(CSzFile *p, const void *data, size_t *size);
WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin);
WRes File_GetLength(CSzFile *p, UInt64 *length); WRes File_Seek(CSzFile *p, Int64 *pos, ESzSeek origin);
WRes File_GetLength(CSzFile *p, UInt64 *length);
/* ---------- FileInStream ---------- */
/* ---------- FileInStream ---------- */
typedef struct
{ typedef struct
ISeqInStream vt; {
CSzFile file; ISeqInStream vt;
} CFileSeqInStream; CSzFile file;
} CFileSeqInStream;
void FileSeqInStream_CreateVTable(CFileSeqInStream *p);
void FileSeqInStream_CreateVTable(CFileSeqInStream *p);
typedef struct
{ typedef struct
ISeekInStream vt; {
CSzFile file; ISeekInStream vt;
} CFileInStream; CSzFile file;
} CFileInStream;
void FileInStream_CreateVTable(CFileInStream *p);
void FileInStream_CreateVTable(CFileInStream *p);
typedef struct
{ typedef struct
ISeqOutStream vt; {
CSzFile file; ISeqOutStream vt;
} CFileOutStream; CSzFile file;
} CFileOutStream;
void FileOutStream_CreateVTable(CFileOutStream *p);
void FileOutStream_CreateVTable(CFileOutStream *p);
EXTERN_C_END
EXTERN_C_END
#endif
#endif