summaryrefslogtreecommitdiff
path: root/src/game-server/resourcemanager.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-22 18:45:57 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-22 18:45:57 +0000
commitac5375e554e882e0b56eeed9b6e51c06c8d37656 (patch)
tree8c0095d23e880ab112dacc7e94505aac86d04dd7 /src/game-server/resourcemanager.cpp
parent88e3d219588052a8ab222ab4f6f2b27c9c29c1b2 (diff)
downloadmanaserv-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.cpp149
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;
+}