diff options
author | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-09-22 18:45:57 +0000 |
---|---|---|
committer | Guillaume Melquiond <guillaume.melquiond@gmail.com> | 2007-09-22 18:45:57 +0000 |
commit | ac5375e554e882e0b56eeed9b6e51c06c8d37656 (patch) | |
tree | 8c0095d23e880ab112dacc7e94505aac86d04dd7 /src/game-server/resourcemanager.cpp | |
parent | 88e3d219588052a8ab222ab4f6f2b27c9c29c1b2 (diff) | |
download | manaserv-ac5375e554e882e0b56eeed9b6e51c06c8d37656.tar.gz manaserv-ac5375e554e882e0b56eeed9b6e51c06c8d37656.tar.bz2 manaserv-ac5375e554e882e0b56eeed9b6e51c06c8d37656.tar.xz manaserv-ac5375e554e882e0b56eeed9b6e51c06c8d37656.zip |
Cleaned both configuration and resource managers.
Diffstat (limited to 'src/game-server/resourcemanager.cpp')
-rw-r--r-- | src/game-server/resourcemanager.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/game-server/resourcemanager.cpp b/src/game-server/resourcemanager.cpp new file mode 100644 index 00000000..f274ded8 --- /dev/null +++ b/src/game-server/resourcemanager.cpp @@ -0,0 +1,149 @@ +/* + * The Mana World + * Copyright 2004-2007 The Mana World Development Team + * + * This file is part of The Mana World. + * + * The Mana World 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. + * + * The Mana World 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 The Mana World; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * $Id$ + */ + +#ifdef _WIN32 +#include <io.h> +#include <direct.h> +#else +#include <unistd.h> +#include <dirent.h> +#endif + +#include <physfs.h> + +#include "game-server/resourcemanager.hpp" + +#include "utils/logger.h" + +#define TMWSERV_DATADIR "" + +void ResourceManager::initialize() +{ + PHYSFS_permitSymbolicLinks(1); + // Add the main data directory to our PhysicsFS search path + PHYSFS_addToSearchPath("data", 1); + PHYSFS_addToSearchPath(TMWSERV_DATADIR "data", 1); + +#ifdef _WIN32 + // Define the path in which to search + std::string searchString = std::string("data/*.zip"); + + // Create our find file data structure + struct _finddata_t findFileInfo; + + // Find the first zipped file + long handle = + static_cast<long>(::_findfirst(searchString.c_str(), &findFileInfo)); + long file = handle; + + // Loop until all files we're searching for are found + while (file >= 0) { + // Define the file path string + std::string filePath = std::string("data/") + + std::string(findFileInfo.name); + + LOG_INFO("Adding to PhysicsFS: " << findFileInfo.name); + + // Add the zip file to our PhysicsFS search path + PHYSFS_addToSearchPath(filePath.c_str(), 1); + + // Find the next file + file = ::_findnext(handle, &findFileInfo); + } + + // Shutdown findfile stuff + ::_findclose(handle); +#else + // Retrieve the current path + char programPath[256]; + getcwd(programPath, 256); + strncat(programPath, "/data", 256 - strlen(programPath) - 1); + + // Create our directory structure + DIR *dir = opendir(programPath); + + // Return if the directory is invalid + if (dir == NULL) { + return; + } + + struct dirent *direntry; + while ((direntry = readdir(dir)) != NULL) + { + char *ext = strstr(direntry->d_name, ".zip"); + + if (ext != NULL && strcmp(ext, ".zip") == 0) + { + // Define the file path string + std::string filePath = std::string(programPath) + + std::string("/") + std::string(direntry->d_name); + + LOG_INFO("Adding to PhysicsFS: " << filePath); + + // Add the zip file to our PhysicsFS search path + PHYSFS_addToSearchPath(filePath.c_str(), 1); + } + } + + closedir(dir); +#endif +} + +bool ResourceManager::exists(std::string const &path) +{ + return PHYSFS_exists(path.c_str()); +} + +char *ResourceManager::loadFile(std::string const &fileName, int &fileSize) +{ + // Attempt to open the specified file using PhysicsFS + PHYSFS_file* file = PHYSFS_openRead(fileName.c_str()); + + // If the handler is an invalid pointer indicate failure + if (file == NULL) + { + LOG_WARN("Failed to load '" << fileName << "': " + << PHYSFS_getLastError()); + return NULL; + } + + // Get the size of the file + fileSize = PHYSFS_fileLength(file); + + // Allocate memory and load the file + char *buffer = (char *)malloc(fileSize + 1); + if (PHYSFS_read(file, buffer, 1, fileSize) != fileSize) + { + free(buffer); + LOG_WARN("Failed to load '" << fileName << "': " + << PHYSFS_getLastError()); + return NULL; + } + + // Close the file and let the user deallocate the memory + PHYSFS_close(file); + + // Add a trailing nul character, so that the file can be used as a string + buffer[fileSize] = 0; + return buffer; +} |