/* filesystem/filesystem.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #ifdef _WIN32 #include #include #endif #include "filesystem/filesystem.h" #include "filesystem/diskfile.h" #include "filesystem/file.h" #include "sys/sys.h" namespace filesystem { SearchPath filesystem_searchpath; std::string filesystem_basename; std::string filesystem_modname; std::string filesystem_homedir; std::string filesystem_writedir; std::string filesystem_datadir; std::string const & writedir() { return filesystem_writedir; } std::string const & homedir() { return filesystem_homedir; } SearchPath & searchpath() { return filesystem_searchpath; } void init(std::string const & basename, std::string const & modname) { con_print << "^BInitializing filesystem..." << std::endl; // clear everything filesystem_searchpath.clear(); filesystem_basename.assign(basename); if (!filesystem_basename.size()) filesystem_basename.assign("base"); filesystem_modname.assign(modname); #ifndef _WIN32 filesystem_homedir.assign(getenv("HOME")); filesystem_homedir.append("/.osirion/"); #else char mydocuments[512]; memset(mydocuments, 0, sizeof(mydocuments)); SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocuments); filesystem_homedir.assign(mydocuments); if (filesystem_homedir.size()) { filesystem_homedir.append("\\My Games"); if (!sys::isdirectory(filesystem_homedir)) sys::mkdir(filesystem_homedir); filesystem_homedir.append("\\Osirion"); if (!sys::isdirectory(filesystem_homedir)) sys::mkdir(filesystem_homedir); filesystem_homedir.append("\\"); } else { filesystem_homedir.assign("home/"); } #endif std::string current_datadir("data/"); std::string package_datadir(PACKAGE_DATADIR); std::string dir; // set writedir depending on modname and add home paths to the searchpath filesystem_writedir.assign(filesystem_homedir); if (filesystem_modname.size()) { // append modname to writedir filesystem_writedir.append(filesystem_modname); filesystem_writedir += '/'; } else { // append basename to writedir filesystem_writedir.append(filesystem_basename); filesystem_writedir += '/'; } sys::mkdir(filesystem_homedir); sys::mkdir(filesystem_writedir); // modname search path if (filesystem_modname.size()) { // HOME/modname dir.assign(filesystem_homedir + filesystem_modname); if (sys::isdirectory(dir)) { dir += '/'; filesystem_searchpath.push_back(dir); } // CURRENT/data/modname dir.assign(current_datadir + filesystem_modname); if (sys::isdirectory(dir)) { dir += '/'; filesystem_searchpath.push_back(dir); } // PACKAGE_DATADIR/modname std::string dir(package_datadir + '/' + filesystem_modname); if (sys::isdirectory(dir)) { dir += '/'; filesystem_searchpath.push_back(dir); } } // basename search path // HOME/basename dir.assign(filesystem_homedir + filesystem_basename); if (sys::isdirectory(dir)) { dir += '/'; filesystem_searchpath.push_back(dir); } // PACKAGE_DATADIR/basename dir.assign(package_datadir + '/' + filesystem_basename); if (sys::isdirectory(dir)) { dir += '/'; filesystem_searchpath.push_back(dir); filesystem_datadir.assign(dir); } else { // CURRENT/data/basename dir.assign(current_datadir + filesystem_basename); if (sys::isdirectory(dir)) { dir += '/'; filesystem_searchpath.push_back(dir); filesystem_datadir.assign(dir); } else { con_warn << "data/" << basename << " not found!" << std::endl; } } // print search path for (SearchPath::iterator path = filesystem_searchpath.begin(); path != filesystem_searchpath.end(); ++path) { con_print << " " << (*path) << std::endl; } con_print << " " << filesystem_searchpath.size() << " directories added to searchpath" << std::endl; // create writedir con_print << " files are created in " << filesystem_writedir << std::endl; } void shutdown() { con_print << "^BShutting down filesystem..." << std::endl; filesystem_searchpath.clear(); filesystem_basename.clear(); filesystem_modname.clear(); filesystem_homedir.clear(); filesystem_writedir.clear(); } File *open(const char *filename) { // for now, File is always a DiskFile DiskFile *f = new DiskFile(); if (!f->open(filename)) { delete f; f = 0; return 0; } return f; } void close(File *file) { if (!file) return; file->close(); delete file; } }