diff --git a/file_io.cpp b/file_io.cpp index 872c04b..71826ec 100644 --- a/file_io.cpp +++ b/file_io.cpp @@ -65,7 +65,7 @@ struct fileZipArchive __off64_t offset; }; -static bool FileIsZipped(char* path, char** zip_path, char** file_path) +static int FileIsZipped(char* path, char** zip_path, char** file_path) { char* z = strcasestr(path, ".zip"); if (z) @@ -76,9 +76,10 @@ static bool FileIsZipped(char* path, char** zip_path, char** file_path) if (zip_path) *zip_path = path; if (file_path) *file_path = z; - return true; + return 1; } - return false; + + return 0; } static char* make_fullpath(const char *path, int mode = 0) @@ -235,101 +236,84 @@ void FileClose(fileTYPE *file) file->filp = nullptr; } - -int zip_search_by_crc(mz_zip_archive *zipArchive, uint32_t crc32) +static int zip_search_by_crc(mz_zip_archive *zipArchive, uint32_t crc32) { - for (unsigned int file_index = 0; file_index < zipArchive->m_total_files; file_index++) { mz_zip_archive_file_stat s; - if (mz_zip_reader_file_stat(zipArchive, file_index, &s)) + if (mz_zip_reader_file_stat(zipArchive, file_index, &s)) { if (s.m_crc32 == crc32) { return file_index; - } + } } } return -1; } - -int FileOpenZip(fileTYPE *file, const char *name, uint32_t crc32, int mode, char mute) +int FileOpenZip(fileTYPE *file, const char *name, uint32_t crc32) { - make_fullpath((char*)name, mode); + make_fullpath(name); FileClose(file); file->mode = 0; file->type = 0; char *p = strrchr(full_path, '/'); - strcpy(file->name, (mode == -1) ? full_path : p + 1); + strcpy(file->name, (p) ? p + 1 : full_path); char *zip_path, *file_path; - if ((mode != -1) && FileIsZipped(full_path, &zip_path, &file_path)) + if (!FileIsZipped(full_path, &zip_path, &file_path)) { - if (mode & O_RDWR || mode & O_WRONLY) - { - if(!mute) printf("FileOpenZip(mode) Zip:%s, writing to zipped files is not supported.\n", - full_path); - return 0; - } - - file->zip = new fileZipArchive{}; - if (!mz_zip_reader_init_file(&file->zip->archive, zip_path, 0)) - { - if(!mute) printf("FileOpenZip(mz_zip_reader_init_file) Zip:%s, error:%s\n", zip_path, - mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); - return 0; - } - - if (crc32) - { - file->zip->index = zip_search_by_crc(&file->zip->archive, crc32); - } - - - - if (file->zip->index < 0 || !crc32) - { - file->zip->index = mz_zip_reader_locate_file(&file->zip->archive, file_path, NULL, 0); - } - - if (file->zip->index < 0) - { - if(!mute) printf("FileOpenZip(mz_zip_reader_locate_file) Zip:%s, file:%s, error: %s\n", - zip_path, file_path, - mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); - FileClose(file); - return 0; - } - - mz_zip_archive_file_stat s; - if (!mz_zip_reader_file_stat(&file->zip->archive, file->zip->index, &s)) - { - if(!mute) printf("FileOpenZip(mz_zip_reader_file_stat) Zip:%s, file:%s, error:%s\n", - zip_path, file_path, - mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); - FileClose(file); - return 0; - } - file->size = s.m_uncomp_size; - - file->zip->iter = mz_zip_reader_extract_iter_new(&file->zip->archive, file->zip->index, 0); - if (!file->zip->iter) - { - if(!mute) printf("FileOpenZip(mz_zip_reader_extract_iter_new) Zip:%s, file:%s, error:%s\n", - zip_path, file_path, - mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); - FileClose(file); - return 0; - } - file->zip->offset = 0; - file->offset = 0; - file->mode = mode; - } else { + printf("FileOpenZip: %s, is not a zip.\n", full_path); return 0; } + + file->zip = new fileZipArchive{}; + if (!mz_zip_reader_init_file(&file->zip->archive, zip_path, 0)) + { + printf("FileOpenZip(mz_zip_reader_init_file) Zip:%s, error:%s\n", zip_path, + mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); + return 0; + } + + file->zip->index = -1; + if (crc32) file->zip->index = zip_search_by_crc(&file->zip->archive, crc32); + if (file->zip->index < 0) file->zip->index = mz_zip_reader_locate_file(&file->zip->archive, file_path, NULL, 0); + if (file->zip->index < 0) + { + printf("FileOpenZip(mz_zip_reader_locate_file) Zip:%s, file:%s, error: %s\n", + zip_path, file_path, + mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); + FileClose(file); + return 0; + } + + mz_zip_archive_file_stat s; + if (!mz_zip_reader_file_stat(&file->zip->archive, file->zip->index, &s)) + { + printf("FileOpenZip(mz_zip_reader_file_stat) Zip:%s, file:%s, error:%s\n", + zip_path, file_path, + mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); + FileClose(file); + return 0; + } + file->size = s.m_uncomp_size; + + file->zip->iter = mz_zip_reader_extract_iter_new(&file->zip->archive, file->zip->index, 0); + if (!file->zip->iter) + { + printf("FileOpenZip(mz_zip_reader_extract_iter_new) Zip:%s, file:%s, error:%s\n", + zip_path, file_path, + mz_zip_get_error_string(mz_zip_get_last_error(&file->zip->archive))); + FileClose(file); + return 0; + } + + file->zip->offset = 0; + file->offset = 0; + file->mode = O_RDONLY; return 1; } diff --git a/file_io.h b/file_io.h index 443a49e..853d036 100644 --- a/file_io.h +++ b/file_io.h @@ -59,7 +59,7 @@ int getStorage(int from_setting); void setStorage(int dev); int isUSBMounted(); -int FileOpenZip(fileTYPE *file, const char *name, uint32_t crc32, int mode, char mute = 0); +int FileOpenZip(fileTYPE *file, const char *name, uint32_t crc32); int FileOpenEx(fileTYPE *file, const char *name, int mode, char mute = 0); int FileOpen(fileTYPE *file, const char *name, char mute = 0); void FileClose(fileTYPE *file); diff --git a/support/arcade/romutils.cpp b/support/arcade/romutils.cpp index dbd52a5..375006d 100644 --- a/support/arcade/romutils.cpp +++ b/support/arcade/romutils.cpp @@ -159,10 +159,9 @@ static int file_data(const uint8_t *buf, uint16_t chunk, struct MD5Context *md5c static int file_file(const char *name, uint32_t crc32, int start, int len, struct MD5Context *md5context) { - char mute = 0; fileTYPE f = {}; static uint8_t buf[4096]; - if (!FileOpenZip(&f, name, crc32, mute)) return 0; + if (!FileOpenZip(&f, name, crc32)) return 0; if (start) FileSeek(&f, start, SEEK_SET); unsigned long bytes2send = f.size; if (len > 0 && len < (int)bytes2send) bytes2send = len; @@ -385,7 +384,7 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons } if (!strcasecmp(node->attributes[i].name, "crc") && !strcasecmp(node->tag, "part")) { - arc_info->crc = (uint32_t)strtoul(node->attributes[i].value, NULL, 16); + arc_info->crc = (uint32_t)strtoul(node->attributes[i].value, NULL, 16); } if (!strcasecmp(node->attributes[i].name, "offset") && !strcasecmp(node->tag, "patch")) { @@ -583,13 +582,13 @@ static int xml_send_rom(XMLEvent evt, const XMLNode* node, SXML_CHAR* text, cons } else { strcpy(zipnames_list, arc_info->zipname); } - + char *zipname = NULL; char *zipptr = zipnames_list; const char *root = get_arcade_root(0); int result = 0; while ((zipname = strsep(&zipptr, "|")) != NULL) - { + { sprintf(fname, (zipname[0] == '/') ? "%s%s/%s" : "%s/mame/%s/%s", root, zipname, arc_info->partname); printf("file: %s, start=%d, len=%d\n", fname, start, length);