bool CCZipFile::initWithBuffer(const void *buffer, uLong size) { if (!buffer || size == 0) return false; m_zipFile = unzOpenBuffer(buffer, size); if (!m_zipFile) return false; return true; }
int load_game_scripts(lua_State* L, const char* zipfile) { size_t size = 0; unsigned char* filedata = s_read(zipfile, &size, 0); if (!filedata) { fprintf(stderr, "unable to read zipfile = %s\n", zipfile); return 1; } unzFile unzfile = unzOpenBuffer(filedata, size); if(!unzfile) { fprintf(stderr, "open zip from buffer failed.\n"); return 1; } lua_getglobal(L, "package"); lua_getfield(L, -1, "preload"); char filename[1024] = ""; int err = unzGoToFirstFile(unzfile); if (err) { fprintf(stderr, "go to first file failed"); return 1; } bool succeed = true; while (true) { unz_file_info info; err = unzGetCurrentFileInfo(unzfile, &info, filename, 1024, NULL, 0, NULL, 0); if (err) { fprintf(stderr, "get current file info failed, filename = %s\n", filename); succeed = false; break; } unz_file_pos file_pos; err = unzGetFilePos(unzfile, &file_pos); err = unzGoToFilePos(unzfile, &file_pos); err = unzOpenCurrentFile(unzfile); unsigned long size = info.uncompressed_size; unsigned char* buffer = s_malloc(size); unsigned int readed = unzReadCurrentFile(unzfile, buffer, (unsigned int)size); if(readed != size) { succeed = false; fprintf(stderr, "read zip file failed? error size, required = %ld, readed = %d, filename = %s\n", size, readed, filename); goto error; } err = luaL_loadbuffer(L, (const char*)buffer, size, filename); if(err) { fprintf(stderr, "error loadL_loadbuffer, filename = %s\n", filename); goto error; } lua_setfield(L, -2, filename); if(unzGoToNextFile(unzfile) == UNZ_END_OF_LIST_OF_FILE) { succeed = true; break; } unzCloseCurrentFile(unzfile); s_free(buffer); continue; error: succeed = false; unzCloseCurrentFile(unzfile); s_free(buffer); break; } lua_pop(L, -1); return succeed ? 1 : 0; }