mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
fix: extractZipFile is not part of Client but more generic.
This solve a crash from mainmenu while extracting the zip
This commit is contained in:
parent
ba40b39500
commit
225d4541ff
5 changed files with 72 additions and 69 deletions
|
@ -725,72 +725,6 @@ bool Client::loadMedia(const std::string &data, const std::string &filename,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool Client::extractZipFile(const char *filename, const std::string &destination)
|
||||
{
|
||||
auto fs = m_rendering_engine->get_filesystem();
|
||||
|
||||
if (!fs->addFileArchive(filename, false, false, io::EFAT_ZIP)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
sanity_check(fs->getFileArchiveCount() > 0);
|
||||
|
||||
/**********************************************************************/
|
||||
/* WARNING this is not threadsafe!! */
|
||||
/**********************************************************************/
|
||||
io::IFileArchive* opened_zip = fs->getFileArchive(fs->getFileArchiveCount() - 1);
|
||||
|
||||
const io::IFileList* files_in_zip = opened_zip->getFileList();
|
||||
|
||||
unsigned int number_of_files = files_in_zip->getFileCount();
|
||||
|
||||
for (unsigned int i=0; i < number_of_files; i++) {
|
||||
std::string fullpath = destination;
|
||||
fullpath += DIR_DELIM;
|
||||
fullpath += files_in_zip->getFullFileName(i).c_str();
|
||||
std::string fullpath_dir = fs::RemoveLastPathComponent(fullpath);
|
||||
|
||||
if (!files_in_zip->isDirectory(i)) {
|
||||
if (!fs::PathExists(fullpath_dir) && !fs::CreateAllDirs(fullpath_dir)) {
|
||||
fs->removeFileArchive(fs->getFileArchiveCount()-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
io::IReadFile* toread = opened_zip->createAndOpenFile(i);
|
||||
|
||||
FILE *targetfile = fopen(fullpath.c_str(),"wb");
|
||||
|
||||
if (targetfile == NULL) {
|
||||
fs->removeFileArchive(fs->getFileArchiveCount()-1);
|
||||
return false;
|
||||
}
|
||||
|
||||
char read_buffer[1024];
|
||||
long total_read = 0;
|
||||
|
||||
while (total_read < toread->getSize()) {
|
||||
|
||||
unsigned int bytes_read =
|
||||
toread->read(read_buffer,sizeof(read_buffer));
|
||||
if ((bytes_read == 0 ) ||
|
||||
(fwrite(read_buffer, 1, bytes_read, targetfile) != bytes_read))
|
||||
{
|
||||
fclose(targetfile);
|
||||
fs->removeFileArchive(fs->getFileArchiveCount() - 1);
|
||||
return false;
|
||||
}
|
||||
total_read += bytes_read;
|
||||
}
|
||||
|
||||
fclose(targetfile);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fs->removeFileArchive(fs->getFileArchiveCount() - 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Virtual methods from con::PeerHandler
|
||||
void Client::peerAdded(con::Peer *peer)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue