From f04a6cae9a280190beb7d1a8ec0798afeb3390a1 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Tue, 28 Mar 2017 18:51:40 +0300 Subject: Move virtfsrwops into virtfs directory. --- src/CMakeLists.txt | 8 +- src/Makefile.am | 4 +- src/fs/virtfs/virtfsrwops.cpp | 427 ++++++++++++++++++++++++++++++++++ src/fs/virtfs/virtfsrwops.h | 75 ++++++ src/fs/virtfsrwops.cpp | 427 ---------------------------------- src/fs/virtfsrwops.h | 75 ------ src/integrity_unittest.cc | 2 +- src/maingui.cpp | 2 +- src/resources/atlas/atlasmanager.cpp | 2 +- src/resources/loaders/imageloader.cpp | 2 +- src/resources/loaders/musicloader.cpp | 2 +- src/resources/loaders/soundloader.cpp | 2 +- src/test/testlauncher.cpp | 2 +- 13 files changed, 515 insertions(+), 515 deletions(-) create mode 100644 src/fs/virtfs/virtfsrwops.cpp create mode 100644 src/fs/virtfs/virtfsrwops.h delete mode 100644 src/fs/virtfsrwops.cpp delete mode 100644 src/fs/virtfsrwops.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 983f0e26b..e32e628db 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -884,8 +884,8 @@ SET(SRCS utils/perfomance.h utils/debugmemoryobject.h fs/virtfs/virtfsfuncs.h - fs/virtfsrwops.cpp - fs/virtfsrwops.h + fs/virtfs/virtfsrwops.cpp + fs/virtfs/virtfsrwops.h fs/virtfstools.cpp fs/virtfstools.h fs/virtlist.cpp @@ -1785,8 +1785,8 @@ SET(DYE_CMD_SRCS utils/perfomance.cpp utils/perfomance.h fs/virtfs/virtfsfuncs.h - fs/virtfsrwops.cpp - fs/virtfsrwops.h + fs/virtfs/virtfsrwops.cpp + fs/virtfs/virtfsrwops.h fs/virtfstools.cpp fs/virtfstools.h fs/virtlist.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 036a2770d..ef2cb3d0e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -571,8 +571,8 @@ BASE_SRC += events/actionevent.h \ utils/perfomance.h \ utils/debugmemoryobject.h \ fs/virtfs/virtfsfuncs.h \ - fs/virtfsrwops.cpp \ - fs/virtfsrwops.h \ + fs/virtfs/virtfsrwops.cpp \ + fs/virtfs/virtfsrwops.h \ fs/virtfstools.cpp \ fs/virtfstools.h \ fs/virtlist.cpp \ diff --git a/src/fs/virtfs/virtfsrwops.cpp b/src/fs/virtfs/virtfsrwops.cpp new file mode 100644 index 000000000..0816b93eb --- /dev/null +++ b/src/fs/virtfs/virtfsrwops.cpp @@ -0,0 +1,427 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013-2017 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * This code provides a glue layer between PhysicsFS and Simple Directmedia + * Layer's (SDL) RWops i/o abstraction. + * + * License: this code is public domain. I make no warranty that it is useful, + * correct, harmless, or environmentally safe. + * + * This particular file may be used however you like, including copying it + * verbatim into a closed-source project, exploiting it commercially, and + * removing any trace of my name from the source (although I hope you won't + * do that). I welcome enhancements and corrections to this file, but I do + * not require you to send me patches if you make changes. This code has + * NO WARRANTY. + * + * Unless otherwise stated, the rest of PhysicsFS falls under the zlib license. + * Please see LICENSE.txt in the root of the source tree. + * + * SDL falls under the LGPL license. You can get SDL at http://www.libsdl.org/ + * + * This file was written by Ryan C. Gordon. (icculus@icculus.org). + * + * Copyright (C) 2012-2017 The ManaPlus Developers + */ + +#include "fs/virtfs/virtfsrwops.h" + +#include "logger.h" + +#include "fs/virtfs/virtfs.h" + +#ifdef DEBUG_VIRTFS +#include "utils/debugmemoryobject.h" + +#include +#endif // DEBUG_VIRTFS + +#include "utils/fuzzer.h" + +#include "debug.h" + +#ifdef USE_SDL2 +#define RWOPSINT int64_t +#define RWOPSSIZE size_t +#else // USE_SDL2 +#define RWOPSINT int32_t +#define RWOPSSIZE int +#endif // USE_SDL2 + +#ifdef DUMP_LEAKED_RESOURCES +static int openedRWops = 0; +#endif // DUMP_LEAKED_RESOURCES + +#ifdef DEBUG_VIRTFS +namespace +{ + std::map mRWops; +} // namespace + +static SDL_RWops *addDebugRWops(SDL_RWops *restrict const rwops, + const char *restrict const name, + const char *restrict const file, + const unsigned line) +{ + if (!rwops) + return nullptr; + + mRWops[rwops] = new VirtFs::DebugMemoryObject(name, file, line); + return rwops; +} + +static void deleteDebugRWops(SDL_RWops *const rwops) +{ + if (!rwops) + return; + + std::map::iterator it = + mRWops.find(rwops); + if (it == mRWops.end()) + { + logger->log("bad RWops delete: %p", static_cast(rwops)); + } + else + { + VirtFs::DebugMemoryObject *const obj = (*it).second; + if (obj) + { + mRWops.erase(rwops); + delete obj; + } + } +} + +void VirtFs::reportLeaks() +{ + if (!mRWops.empty()) + { + logger->log("RWops leaks detected"); + std::map::iterator it = + mRWops.begin(); + const std::map::iterator + it_end = mRWops.end(); + for (; it != it_end; ++it) + { + VirtFs::DebugMemoryObject *obj = (*it).second; + if (obj) + { + logger->log("file: %s at %s", obj->mName.c_str(), + obj->mAddFile.c_str()); + delete obj; + } + } + mRWops.clear(); + } +} +#endif // DEBUG_VIRTFS + +static RWOPSINT virtfsrwops_seek(SDL_RWops *const rw, + const RWOPSINT offset, + const int whence) +{ + if (!rw) + return -1; + VirtFile *const handle = static_cast( + rw->hidden.unknown.data1); + RWOPSINT pos = 0; + + if (whence == SEEK_SET) + { + pos = offset; + } /* if */ + else if (whence == SEEK_CUR) + { + const int64_t current = VirtFs::tell(handle); + if (current == -1) + { + logger->assertLog( + "virtfsrwops_seek: Can't find position in file."); + return -1; + } /* if */ + + pos = CAST_S32(current); + if (static_cast(pos) != current) + { + logger->assertLog("virtfsrwops_seek: " + "Can't fit current file position in an int!"); + return -1; + } /* if */ + + if (offset == 0) /* this is a "tell" call. We're done. */ + return pos; + + pos += offset; + } /* else if */ + else if (whence == SEEK_END) + { + const int64_t len = VirtFs::fileLength(handle); + if (len == -1) + { + logger->assertLog("virtfsrwops_seek:Can't find end of file."); + return -1; + } /* if */ + + pos = static_cast(len); + if (static_cast(pos) != len) + { + logger->assertLog("virtfsrwops_seek: " + "Can't fit end-of-file position in an int!"); + return -1; + } /* if */ + + pos += offset; + } /* else if */ + else + { + logger->assertLog("virtfsrwops_seek: Invalid 'whence' parameter."); + return -1; + } /* else */ + + if (pos < 0) + { + logger->assertLog("virtfsrwops_seek: " + "Attempt to seek past start of file."); + return -1; + } /* if */ + + if (!VirtFs::seek(handle, static_cast(pos))) + { + logger->assertLog("virtfsrwops_seek: seek error."); + return -1; + } /* if */ + + return pos; +} /* virtfsrwops_seek */ + +static RWOPSSIZE virtfsrwops_read(SDL_RWops *const rw, + void *const ptr, + const RWOPSSIZE size, + const RWOPSSIZE maxnum) +{ + if (!rw) + return 0; + VirtFile *const handle = static_cast( + rw->hidden.unknown.data1); + const int64_t rc = VirtFs::read(handle, ptr, + CAST_U32(size), + CAST_U32(maxnum)); + if (rc != static_cast(maxnum)) + { + if (!VirtFs::eof(handle)) /* not EOF? Must be an error. */ + { + logger->assertLog("virtfsrwops_seek: read error."); + } + } /* if */ + + return CAST_S32(rc); +} /* virtfsrwops_read */ + +static RWOPSSIZE virtfsrwops_write(SDL_RWops *const rw, + const void *const ptr, + const RWOPSSIZE size, + const RWOPSSIZE num) +{ + if (!rw) + return 0; + VirtFile *const handle = static_cast( + rw->hidden.unknown.data1); + const int64_t rc = VirtFs::write(handle, ptr, + CAST_U32(size), + CAST_U32(num)); + if (rc != static_cast(num)) + { + logger->assertLog("virtfsrwops_seek: write error."); + } + + return CAST_S32(rc); +} /* virtfsrwops_write */ + +static int virtfsrwops_close(SDL_RWops *const rw) +{ + if (!rw) + return 0; + VirtFile *const handle = static_cast( + rw->hidden.unknown.data1); + if (!VirtFs::close(handle)) + { + logger->assertLog("virtfsrwops_seek: close error."); + return -1; + } /* if */ + + SDL_FreeRW(rw); +#ifdef DUMP_LEAKED_RESOURCES + if (openedRWops <= 0) + logger->assertLog("virtfsrwops_seek: closing already closed RWops"); + openedRWops --; +#endif // DUMP_LEAKED_RESOURCES +#ifdef DEBUG_VIRTFS + deleteDebugRWops(rw); +#endif // DEBUG_VIRTFS + + return 0; +} /* virtfsrwops_close */ + +#ifdef USE_SDL2 +static RWOPSINT virtfsrwops_size(SDL_RWops *const rw) +{ + VirtFile *const handle = static_cast( + rw->hidden.unknown.data1); + return VirtFs::fileLength(handle); +} /* virtfsrwops_size */ +#endif // USE_SDL2 + +static SDL_RWops *create_rwops(VirtFile *const file) +{ + SDL_RWops *retval = nullptr; + + if (!file) + { + logger->assertLog("virtfsrwops_seek: create rwops error."); + } + else + { + retval = SDL_AllocRW(); + if (retval) + { +#ifdef USE_SDL2 + retval->size = &virtfsrwops_size; +#endif // USE_SDL2 + + retval->seek = &virtfsrwops_seek; + retval->read = &virtfsrwops_read; + retval->write = &virtfsrwops_write; + retval->close = &virtfsrwops_close; + retval->hidden.unknown.data1 = file; + } /* if */ +#ifdef DUMP_LEAKED_RESOURCES + openedRWops ++; +#endif // DUMP_LEAKED_RESOURCES + } /* else */ + + return retval; +} /* create_rwops */ + +SDL_RWops *VirtFs::MakeRWops(VirtFile *const handle) +{ + SDL_RWops *retval = nullptr; + if (!handle) + { + logger->assertLog("virtfsrwops_seek: NULL pointer passed to " + "RWopsmakeRWops()."); + } + else + { + retval = create_rwops(handle); + } + + return retval; +} /* RWopsmakeRWops */ + +#ifdef __APPLE__ +static bool checkFilePath(const std::string &restrict fname) +{ + if (fname.empty()) + return false; + if (!VirtFs::exists(fname) || VirtFs::isDirectory(fname)) + return false; + return true; +} +#endif // __APPLE__ + +#ifdef DEBUG_VIRTFS +#undef RWopsOpenRead +SDL_RWops *VirtFs::RWopsOpenRead(const std::string &restrict fname, + const char *restrict const file, + const unsigned line) +#else // DEBUG_VIRTFS +SDL_RWops *VirtFs::RWopsOpenRead(const std::string &restrict fname) +#endif // DEBUG_VIRTFS +{ + BLOCK_START("RWopsopenRead") +#ifdef __APPLE__ + if (!checkFilePath(fname)) + return nullptr; +#endif // __APPLE__ +#ifdef USE_FUZZER + if (Fuzzer::conditionTerminate(fname)) + return nullptr; +#endif // USE_FUZZER +#ifdef USE_PROFILER + +#ifdef DEBUG_VIRTFS + SDL_RWops *const ret = addDebugRWops( + create_rwops(VirtFs::openRead(fname)), + fname, + file, + line); +#else // DEBUG_VIRTFS + SDL_RWops *const ret = create_rwops(VirtFs::openRead(fname)); +#endif // DEBUG_VIRTFS + + BLOCK_END("RWopsopenRead") + return ret; +#else // USE_PROFILER + +#ifdef DEBUG_VIRTFS + return addDebugRWops( + create_rwops(VirtFs::openRead(fname)), + fname, + file, + line); +#else // DEBUG_VIRTFS + return create_rwops(VirtFs::openRead(fname)); +#endif // DEBUG_VIRTFS +#endif // USE_PROFILER +} /* RWopsopenRead */ + +SDL_RWops *VirtFs::RWopsOpenWrite(const std::string &restrict fname) +{ +#ifdef __APPLE__ + if (!checkFilePath(fname)) + return nullptr; +#endif // __APPLE__ + + return create_rwops(VirtFs::openWrite(fname)); +} /* RWopsopenWrite */ + +SDL_RWops *VirtFs::RWopsOpenAppend(const std::string &restrict fname) +{ +#ifdef __APPLE__ + if (!checkFilePath(fname)) + return nullptr; +#endif // __APPLE__ + + return create_rwops(VirtFs::openAppend(fname)); +} /* RWopsopenAppend */ + +#ifdef DUMP_LEAKED_RESOURCES +void VirtFs::reportRWops() +{ + if (openedRWops) + { + logger->assertLog("virtfsrwops_seek: leaking RWops: %d", + openedRWops); + } +} +#endif // DUMP_LEAKED_RESOURCES + +/* end of virtfsrwops.c ... */ diff --git a/src/fs/virtfs/virtfsrwops.h b/src/fs/virtfs/virtfsrwops.h new file mode 100644 index 000000000..2703044df --- /dev/null +++ b/src/fs/virtfs/virtfsrwops.h @@ -0,0 +1,75 @@ +/* + * The ManaPlus Client + * Copyright (C) 2013-2017 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* + * This code provides a glue layer between PhysicsFS and Simple Directmedia + * Layer's (SDL) RWops i/o abstraction. + * + * License: this code is public domain. I make no warranty that it is useful, + * correct, harmless, or environmentally safe. + * + * This particular file may be used however you like, including copying it + * verbatim into a closed-source project, exploiting it commercially, and + * removing any trace of my name from the source (although I hope you won't + * do that). I welcome enhancements and corrections to this file, but I do + * not require you to send me patches if you make changes. This code has + * NO WARRANTY. + * + * Unless otherwise stated, the rest of PhysicsFS falls under the zlib license. + * Please see LICENSE.txt in the root of the source tree. + * + * SDL falls under the LGPL license. You can get SDL at http://www.libsdl.org/ + * + * This file was written by Ryan C. Gordon. (icculus@icculus.org). + * + * Copyright (C) 2012-2017 The ManaPlus Developers + */ + +#ifndef SRC_FS_VIRTFSRWOPS_H +#define SRC_FS_VIRTFSRWOPS_H + +#include "localconsts.h" + +#include +#include + +struct VirtFile; + +namespace VirtFs +{ +#ifdef DEBUG_VIRTFS + SDL_RWops *RWopsOpenRead(const std::string &restrict fname, + const char *restrict const file, + const unsigned line); + void reportLeaks(); +#else // DEBUG_VIRTFS + SDL_RWops *RWopsOpenRead(const std::string &restrict fname); +#endif // DEBUG_VIRTFS + + SDL_RWops *RWopsOpenWrite(const std::string &restrict fname) A_WARN_UNUSED; + SDL_RWops *RWopsOpenAppend(const std::string &restrict fname) + A_WARN_UNUSED; + SDL_RWops *MakeRWops(VirtFile *const handle) A_WARN_UNUSED; +#ifdef DUMP_LEAKED_RESOURCES + void reportRWops(); +#endif // DUMP_LEAKED_RESOURCES +} // namespace VirtFs + +#endif // SRC_FS_VIRTFSRWOPS_H diff --git a/src/fs/virtfsrwops.cpp b/src/fs/virtfsrwops.cpp deleted file mode 100644 index d44959f9a..000000000 --- a/src/fs/virtfsrwops.cpp +++ /dev/null @@ -1,427 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This code provides a glue layer between PhysicsFS and Simple Directmedia - * Layer's (SDL) RWops i/o abstraction. - * - * License: this code is public domain. I make no warranty that it is useful, - * correct, harmless, or environmentally safe. - * - * This particular file may be used however you like, including copying it - * verbatim into a closed-source project, exploiting it commercially, and - * removing any trace of my name from the source (although I hope you won't - * do that). I welcome enhancements and corrections to this file, but I do - * not require you to send me patches if you make changes. This code has - * NO WARRANTY. - * - * Unless otherwise stated, the rest of PhysicsFS falls under the zlib license. - * Please see LICENSE.txt in the root of the source tree. - * - * SDL falls under the LGPL license. You can get SDL at http://www.libsdl.org/ - * - * This file was written by Ryan C. Gordon. (icculus@icculus.org). - * - * Copyright (C) 2012-2017 The ManaPlus Developers - */ - -#include "fs/virtfsrwops.h" - -#include "logger.h" - -#include "fs/virtfs/virtfs.h" - -#ifdef DEBUG_VIRTFS -#include "utils/debugmemoryobject.h" - -#include -#endif // DEBUG_VIRTFS - -#include "utils/fuzzer.h" - -#include "debug.h" - -#ifdef USE_SDL2 -#define RWOPSINT int64_t -#define RWOPSSIZE size_t -#else // USE_SDL2 -#define RWOPSINT int32_t -#define RWOPSSIZE int -#endif // USE_SDL2 - -#ifdef DUMP_LEAKED_RESOURCES -static int openedRWops = 0; -#endif // DUMP_LEAKED_RESOURCES - -#ifdef DEBUG_VIRTFS -namespace -{ - std::map mRWops; -} // namespace - -static SDL_RWops *addDebugRWops(SDL_RWops *restrict const rwops, - const char *restrict const name, - const char *restrict const file, - const unsigned line) -{ - if (!rwops) - return nullptr; - - mRWops[rwops] = new VirtFs::DebugMemoryObject(name, file, line); - return rwops; -} - -static void deleteDebugRWops(SDL_RWops *const rwops) -{ - if (!rwops) - return; - - std::map::iterator it = - mRWops.find(rwops); - if (it == mRWops.end()) - { - logger->log("bad RWops delete: %p", static_cast(rwops)); - } - else - { - VirtFs::DebugMemoryObject *const obj = (*it).second; - if (obj) - { - mRWops.erase(rwops); - delete obj; - } - } -} - -void VirtFs::reportLeaks() -{ - if (!mRWops.empty()) - { - logger->log("RWops leaks detected"); - std::map::iterator it = - mRWops.begin(); - const std::map::iterator - it_end = mRWops.end(); - for (; it != it_end; ++it) - { - VirtFs::DebugMemoryObject *obj = (*it).second; - if (obj) - { - logger->log("file: %s at %s", obj->mName.c_str(), - obj->mAddFile.c_str()); - delete obj; - } - } - mRWops.clear(); - } -} -#endif // DEBUG_VIRTFS - -static RWOPSINT virtfsrwops_seek(SDL_RWops *const rw, - const RWOPSINT offset, - const int whence) -{ - if (!rw) - return -1; - VirtFile *const handle = static_cast( - rw->hidden.unknown.data1); - RWOPSINT pos = 0; - - if (whence == SEEK_SET) - { - pos = offset; - } /* if */ - else if (whence == SEEK_CUR) - { - const int64_t current = VirtFs::tell(handle); - if (current == -1) - { - logger->assertLog( - "virtfsrwops_seek: Can't find position in file."); - return -1; - } /* if */ - - pos = CAST_S32(current); - if (static_cast(pos) != current) - { - logger->assertLog("virtfsrwops_seek: " - "Can't fit current file position in an int!"); - return -1; - } /* if */ - - if (offset == 0) /* this is a "tell" call. We're done. */ - return pos; - - pos += offset; - } /* else if */ - else if (whence == SEEK_END) - { - const int64_t len = VirtFs::fileLength(handle); - if (len == -1) - { - logger->assertLog("virtfsrwops_seek:Can't find end of file."); - return -1; - } /* if */ - - pos = static_cast(len); - if (static_cast(pos) != len) - { - logger->assertLog("virtfsrwops_seek: " - "Can't fit end-of-file position in an int!"); - return -1; - } /* if */ - - pos += offset; - } /* else if */ - else - { - logger->assertLog("virtfsrwops_seek: Invalid 'whence' parameter."); - return -1; - } /* else */ - - if (pos < 0) - { - logger->assertLog("virtfsrwops_seek: " - "Attempt to seek past start of file."); - return -1; - } /* if */ - - if (!VirtFs::seek(handle, static_cast(pos))) - { - logger->assertLog("virtfsrwops_seek: seek error."); - return -1; - } /* if */ - - return pos; -} /* virtfsrwops_seek */ - -static RWOPSSIZE virtfsrwops_read(SDL_RWops *const rw, - void *const ptr, - const RWOPSSIZE size, - const RWOPSSIZE maxnum) -{ - if (!rw) - return 0; - VirtFile *const handle = static_cast( - rw->hidden.unknown.data1); - const int64_t rc = VirtFs::read(handle, ptr, - CAST_U32(size), - CAST_U32(maxnum)); - if (rc != static_cast(maxnum)) - { - if (!VirtFs::eof(handle)) /* not EOF? Must be an error. */ - { - logger->assertLog("virtfsrwops_seek: read error."); - } - } /* if */ - - return CAST_S32(rc); -} /* virtfsrwops_read */ - -static RWOPSSIZE virtfsrwops_write(SDL_RWops *const rw, - const void *const ptr, - const RWOPSSIZE size, - const RWOPSSIZE num) -{ - if (!rw) - return 0; - VirtFile *const handle = static_cast( - rw->hidden.unknown.data1); - const int64_t rc = VirtFs::write(handle, ptr, - CAST_U32(size), - CAST_U32(num)); - if (rc != static_cast(num)) - { - logger->assertLog("virtfsrwops_seek: write error."); - } - - return CAST_S32(rc); -} /* virtfsrwops_write */ - -static int virtfsrwops_close(SDL_RWops *const rw) -{ - if (!rw) - return 0; - VirtFile *const handle = static_cast( - rw->hidden.unknown.data1); - if (!VirtFs::close(handle)) - { - logger->assertLog("virtfsrwops_seek: close error."); - return -1; - } /* if */ - - SDL_FreeRW(rw); -#ifdef DUMP_LEAKED_RESOURCES - if (openedRWops <= 0) - logger->assertLog("virtfsrwops_seek: closing already closed RWops"); - openedRWops --; -#endif // DUMP_LEAKED_RESOURCES -#ifdef DEBUG_VIRTFS - deleteDebugRWops(rw); -#endif // DEBUG_VIRTFS - - return 0; -} /* virtfsrwops_close */ - -#ifdef USE_SDL2 -static RWOPSINT virtfsrwops_size(SDL_RWops *const rw) -{ - VirtFile *const handle = static_cast( - rw->hidden.unknown.data1); - return VirtFs::fileLength(handle); -} /* virtfsrwops_size */ -#endif // USE_SDL2 - -static SDL_RWops *create_rwops(VirtFile *const file) -{ - SDL_RWops *retval = nullptr; - - if (!file) - { - logger->assertLog("virtfsrwops_seek: create rwops error."); - } - else - { - retval = SDL_AllocRW(); - if (retval) - { -#ifdef USE_SDL2 - retval->size = &virtfsrwops_size; -#endif // USE_SDL2 - - retval->seek = &virtfsrwops_seek; - retval->read = &virtfsrwops_read; - retval->write = &virtfsrwops_write; - retval->close = &virtfsrwops_close; - retval->hidden.unknown.data1 = file; - } /* if */ -#ifdef DUMP_LEAKED_RESOURCES - openedRWops ++; -#endif // DUMP_LEAKED_RESOURCES - } /* else */ - - return retval; -} /* create_rwops */ - -SDL_RWops *VirtFs::MakeRWops(VirtFile *const handle) -{ - SDL_RWops *retval = nullptr; - if (!handle) - { - logger->assertLog("virtfsrwops_seek: NULL pointer passed to " - "RWopsmakeRWops()."); - } - else - { - retval = create_rwops(handle); - } - - return retval; -} /* RWopsmakeRWops */ - -#ifdef __APPLE__ -static bool checkFilePath(const std::string &restrict fname) -{ - if (fname.empty()) - return false; - if (!VirtFs::exists(fname) || VirtFs::isDirectory(fname)) - return false; - return true; -} -#endif // __APPLE__ - -#ifdef DEBUG_VIRTFS -#undef RWopsOpenRead -SDL_RWops *VirtFs::RWopsOpenRead(const std::string &restrict fname, - const char *restrict const file, - const unsigned line) -#else // DEBUG_VIRTFS -SDL_RWops *VirtFs::RWopsOpenRead(const std::string &restrict fname) -#endif // DEBUG_VIRTFS -{ - BLOCK_START("RWopsopenRead") -#ifdef __APPLE__ - if (!checkFilePath(fname)) - return nullptr; -#endif // __APPLE__ -#ifdef USE_FUZZER - if (Fuzzer::conditionTerminate(fname)) - return nullptr; -#endif // USE_FUZZER -#ifdef USE_PROFILER - -#ifdef DEBUG_VIRTFS - SDL_RWops *const ret = addDebugRWops( - create_rwops(VirtFs::openRead(fname)), - fname, - file, - line); -#else // DEBUG_VIRTFS - SDL_RWops *const ret = create_rwops(VirtFs::openRead(fname)); -#endif // DEBUG_VIRTFS - - BLOCK_END("RWopsopenRead") - return ret; -#else // USE_PROFILER - -#ifdef DEBUG_VIRTFS - return addDebugRWops( - create_rwops(VirtFs::openRead(fname)), - fname, - file, - line); -#else // DEBUG_VIRTFS - return create_rwops(VirtFs::openRead(fname)); -#endif // DEBUG_VIRTFS -#endif // USE_PROFILER -} /* RWopsopenRead */ - -SDL_RWops *VirtFs::RWopsOpenWrite(const std::string &restrict fname) -{ -#ifdef __APPLE__ - if (!checkFilePath(fname)) - return nullptr; -#endif // __APPLE__ - - return create_rwops(VirtFs::openWrite(fname)); -} /* RWopsopenWrite */ - -SDL_RWops *VirtFs::RWopsOpenAppend(const std::string &restrict fname) -{ -#ifdef __APPLE__ - if (!checkFilePath(fname)) - return nullptr; -#endif // __APPLE__ - - return create_rwops(VirtFs::openAppend(fname)); -} /* RWopsopenAppend */ - -#ifdef DUMP_LEAKED_RESOURCES -void VirtFs::reportRWops() -{ - if (openedRWops) - { - logger->assertLog("virtfsrwops_seek: leaking RWops: %d", - openedRWops); - } -} -#endif // DUMP_LEAKED_RESOURCES - -/* end of virtfsrwops.c ... */ diff --git a/src/fs/virtfsrwops.h b/src/fs/virtfsrwops.h deleted file mode 100644 index 2703044df..000000000 --- a/src/fs/virtfsrwops.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2013-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This code provides a glue layer between PhysicsFS and Simple Directmedia - * Layer's (SDL) RWops i/o abstraction. - * - * License: this code is public domain. I make no warranty that it is useful, - * correct, harmless, or environmentally safe. - * - * This particular file may be used however you like, including copying it - * verbatim into a closed-source project, exploiting it commercially, and - * removing any trace of my name from the source (although I hope you won't - * do that). I welcome enhancements and corrections to this file, but I do - * not require you to send me patches if you make changes. This code has - * NO WARRANTY. - * - * Unless otherwise stated, the rest of PhysicsFS falls under the zlib license. - * Please see LICENSE.txt in the root of the source tree. - * - * SDL falls under the LGPL license. You can get SDL at http://www.libsdl.org/ - * - * This file was written by Ryan C. Gordon. (icculus@icculus.org). - * - * Copyright (C) 2012-2017 The ManaPlus Developers - */ - -#ifndef SRC_FS_VIRTFSRWOPS_H -#define SRC_FS_VIRTFSRWOPS_H - -#include "localconsts.h" - -#include -#include - -struct VirtFile; - -namespace VirtFs -{ -#ifdef DEBUG_VIRTFS - SDL_RWops *RWopsOpenRead(const std::string &restrict fname, - const char *restrict const file, - const unsigned line); - void reportLeaks(); -#else // DEBUG_VIRTFS - SDL_RWops *RWopsOpenRead(const std::string &restrict fname); -#endif // DEBUG_VIRTFS - - SDL_RWops *RWopsOpenWrite(const std::string &restrict fname) A_WARN_UNUSED; - SDL_RWops *RWopsOpenAppend(const std::string &restrict fname) - A_WARN_UNUSED; - SDL_RWops *MakeRWops(VirtFile *const handle) A_WARN_UNUSED; -#ifdef DUMP_LEAKED_RESOURCES - void reportRWops(); -#endif // DUMP_LEAKED_RESOURCES -} // namespace VirtFs - -#endif // SRC_FS_VIRTFSRWOPS_H diff --git a/src/integrity_unittest.cc b/src/integrity_unittest.cc index a2ef86a8a..cdd5fecab 100644 --- a/src/integrity_unittest.cc +++ b/src/integrity_unittest.cc @@ -28,7 +28,7 @@ #include "fs/files.h" #include "fs/virtfs/virtfs.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "fs/virtfstools.h" #include "input/inputactionmap.h" diff --git a/src/maingui.cpp b/src/maingui.cpp index d281dee1d..3725ee59a 100644 --- a/src/maingui.cpp +++ b/src/maingui.cpp @@ -27,7 +27,7 @@ #include "settings.h" #include "fs/virtfs/virtfs.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "utils/delete2.h" #ifdef ANDROID diff --git a/src/resources/atlas/atlasmanager.cpp b/src/resources/atlas/atlasmanager.cpp index d64193ccd..79edf043e 100644 --- a/src/resources/atlas/atlasmanager.cpp +++ b/src/resources/atlas/atlasmanager.cpp @@ -29,7 +29,7 @@ #endif // DEBUG_IMAGES #include "fs/virtfs/virtfs.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "utils/mathutils.h" #include "utils/sdlcheckutils.h" diff --git a/src/resources/loaders/imageloader.cpp b/src/resources/loaders/imageloader.cpp index 198bfaa4e..c4bf47c72 100644 --- a/src/resources/loaders/imageloader.cpp +++ b/src/resources/loaders/imageloader.cpp @@ -23,7 +23,7 @@ #include "resources/imagehelper.h" #include "fs/virtfs/virtfs.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "resources/image/image.h" diff --git a/src/resources/loaders/musicloader.cpp b/src/resources/loaders/musicloader.cpp index 01b7bcbea..df9908da2 100644 --- a/src/resources/loaders/musicloader.cpp +++ b/src/resources/loaders/musicloader.cpp @@ -23,7 +23,7 @@ #include "resources/sdlmusic.h" #include "fs/virtfs/virtfs.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "resources/loaders/musicloader.h" diff --git a/src/resources/loaders/soundloader.cpp b/src/resources/loaders/soundloader.cpp index 654938d4e..9ee106e0c 100644 --- a/src/resources/loaders/soundloader.cpp +++ b/src/resources/loaders/soundloader.cpp @@ -23,7 +23,7 @@ #include "resources/soundeffect.h" #include "fs/virtfs/virtfs.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "resources/loaders/soundloader.h" diff --git a/src/test/testlauncher.cpp b/src/test/testlauncher.cpp index 7e3586d44..133c897fd 100644 --- a/src/test/testlauncher.cpp +++ b/src/test/testlauncher.cpp @@ -26,7 +26,7 @@ #include "settings.h" #include "soundmanager.h" -#include "fs/virtfsrwops.h" +#include "fs/virtfs/virtfsrwops.h" #include "gui/skin.h" #include "gui/theme.h" -- cgit v1.2.3-60-g2f50