1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/core/systems/LibrarySys.cpp Sun Nov 05 02:47:13 2006 +0000
1.3 @@ -0,0 +1,278 @@
1.4 +#include <stdio.h>
1.5 +#include "LibrarySys.h"
1.6 +
1.7 +LibrarySystem g_LibSys;
1.8 +
1.9 +CLibrary::~CLibrary()
1.10 +{
1.11 + if (m_lib)
1.12 + {
1.13 +#if defined PLATFORM_WINDOWS
1.14 + FreeLibrary(m_lib);
1.15 +#else if defined PLATFORM_POSIX
1.16 + dlclose(m_lib);
1.17 +#endif
1.18 + m_lib = NULL;
1.19 + }
1.20 +}
1.21 +
1.22 +CLibrary::CLibrary(LibraryHandle me)
1.23 +{
1.24 + m_lib = me;
1.25 +}
1.26 +
1.27 +void CLibrary::CloseLibrary()
1.28 +{
1.29 + delete this;
1.30 +}
1.31 +
1.32 +void *CLibrary::GetSymbolAddress(const char *symname)
1.33 +{
1.34 +#if defined PLATFORM_WINDOWS
1.35 + return GetProcAddress(m_lib, symname);
1.36 +#else if defined PLATFORM_POSIX
1.37 + return dlsym(m_lib, symname);
1.38 +#endif
1.39 +}
1.40 +
1.41 +
1.42 +/********************
1.43 + ** Directory Code **
1.44 + ********************/
1.45 +
1.46 +
1.47 +CDirectory::CDirectory(const char *path)
1.48 +{
1.49 +#if defined PLATFORM_WINDOWS
1.50 + char newpath[PLATFORM_MAX_PATH];
1.51 + snprintf(newpath, sizeof(newpath), "%s\\*.*", path);
1.52 + m_dir = FindFirstFileA(newpath, &m_fd);
1.53 + if (!IsValid())
1.54 + {
1.55 + m_fd.cFileName[0] = '\0';
1.56 + }
1.57 +#else if defined PLATFORM_POSIX
1.58 + m_dir = opendir(path);
1.59 + if (IsValid())
1.60 + {
1.61 + /* :TODO: we need to read past "." and ".."! */
1.62 + ep = readdir(dp);
1.63 + snprintf(m_origpath, PLATFORM_MAX_PATH, "%s", path);
1.64 + } else {
1.65 + ep = NULL;
1.66 + }
1.67 +#endif
1.68 +}
1.69 +
1.70 +CDirectory::~CDirectory()
1.71 +{
1.72 + if (IsValid())
1.73 + {
1.74 +#if defined PLATFORM_WINDOWS
1.75 + FindClose(m_dir);
1.76 +#else if defined PLATFORM_POSIX
1.77 + closedir(m_dir);
1.78 +#endif
1.79 + }
1.80 +}
1.81 +
1.82 +void CDirectory::NextEntry()
1.83 +{
1.84 +#if defined PLATFORM_WINDOWS
1.85 + if (FindNextFile(m_dir, &m_fd) == 0)
1.86 + {
1.87 + FindClose(m_dir);
1.88 + m_dir = INVALID_HANDLE_VALUE;
1.89 + }
1.90 +#else if defined PLATFORM_POSIX
1.91 + if ((ep=readdir(m_dir) == NULL)
1.92 + {
1.93 + closedir(m_dir);
1.94 + m_dir = NULL;
1.95 + }
1.96 +#endif
1.97 +}
1.98 +
1.99 +bool CDirectory::IsEntryDirectory()
1.100 +{
1.101 +#if defined PLATFORM_WINDOWS
1.102 + return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
1.103 +#else if defined PLATFORM_LINUX
1.104 + char temppath[PLATFORM_MAX_PATH];
1.105 + snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
1.106 + return g_LibrarySys.IsPathDirectory(temppath);
1.107 +#endif
1.108 +}
1.109 +
1.110 +bool CDirectory::IsEntryFile()
1.111 +{
1.112 +#if defined PLATFORM_WINDOWS
1.113 + return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE));
1.114 +#else if defined PLATFORM_POSIX
1.115 + char temppath[PLATFORM_MAX_PATH];
1.116 + snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
1.117 + return g_LibrarySys.IsPathFile(temppath);
1.118 +#endif
1.119 +}
1.120 +
1.121 +const char *CDirectory::GetEntryName()
1.122 +{
1.123 +#if defined PLATFORM_WINDOWS
1.124 + return m_fd.cFileName;
1.125 +#else if defined PLATFORM_LINUX
1.126 + return ep ? ep->d_name : "";
1.127 +#endif
1.128 +}
1.129 +
1.130 +bool CDirectory::MoreFiles()
1.131 +{
1.132 + return IsValid();
1.133 +}
1.134 +
1.135 +bool CDirectory::IsValid()
1.136 +{
1.137 +#if defined PLATFORM_WINDOWS
1.138 + return (m_dir != INVALID_HANDLE_VALUE);
1.139 +#else if defined PLATFORM_LINUX
1.140 + return (m_dir != NULL);
1.141 +#endif
1.142 +}
1.143 +
1.144 +
1.145 +/*************************
1.146 + ** Library System Code **
1.147 + *************************/
1.148 +
1.149 +
1.150 +bool LibrarySystem::PathExists(const char *path)
1.151 +{
1.152 +#if defined PLATFORM_WINDOWS
1.153 + DWORD attr = GetFileAttributesA(path);
1.154 +
1.155 + return (attr != INVALID_FILE_ATTRIBUTES);
1.156 +#else if defined PLATFORM_POSIX
1.157 + struct stat s;
1.158 +
1.159 + return (stat(path, &s) == 0);
1.160 +#endif
1.161 +}
1.162 +
1.163 +bool LibrarySystem::IsPathFile(const char *path)
1.164 +{
1.165 +#if defined PLATFORM_WINDOWS
1.166 + DWORD attr = GetFileAttributes(path);
1.167 +
1.168 + if (attr == INVALID_FILE_ATTRIBUTES)
1.169 + {
1.170 + return false;
1.171 + }
1.172 +
1.173 + if (attr & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))
1.174 + {
1.175 + return false;
1.176 + }
1.177 +
1.178 + return true;
1.179 +#else if defined PLATFORM_LINUX
1.180 + struct stat s;
1.181 +
1.182 + if (stat(path, &s) != 0)
1.183 + {
1.184 + return false;
1.185 + }
1.186 +
1.187 + return S_ISREG(s.st_mode) ? true : false;
1.188 +#endif
1.189 +}
1.190 +
1.191 +bool LibrarySystem::IsPathDirectory(const char *path)
1.192 +{
1.193 +#if defined PLATFORM_WINDOWS
1.194 + DWORD attr = GetFileAttributes(path);
1.195 +
1.196 + if (attr == INVALID_FILE_ATTRIBUTES)
1.197 + {
1.198 + return false;
1.199 + }
1.200 +
1.201 + if (attr & FILE_ATTRIBUTE_DIRECTORY)
1.202 + {
1.203 + return true;
1.204 + }
1.205 +
1.206 +#else if defined PLATFORM_LINUX
1.207 + struct stat s;
1.208 +
1.209 + if (stat(path, &s) != 0)
1.210 + {
1.211 + return false;
1.212 + }
1.213 +
1.214 + if (S_ISDIR(s.st_mode))
1.215 + {
1.216 + return true;
1.217 + }
1.218 +#endif
1.219 +
1.220 + return false;
1.221 +}
1.222 +
1.223 +IDirectory *LibrarySystem::OpenDirectory(const char *path)
1.224 +{
1.225 + CDirectory *dir = new CDirectory(path);
1.226 +
1.227 + if (!dir->IsValid())
1.228 + {
1.229 + delete dir;
1.230 + return NULL;
1.231 + }
1.232 +
1.233 + return dir;
1.234 +}
1.235 +
1.236 +void LibrarySystem::GetPlatformError(char *error, size_t err_max)
1.237 +{
1.238 + if (error && err_max)
1.239 + {
1.240 +#if defined PLATFORM_WINDOWS
1.241 + DWORD dw = GetLastError();
1.242 + FormatMessageA(
1.243 + FORMAT_MESSAGE_FROM_SYSTEM,
1.244 + NULL,
1.245 + dw,
1.246 + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
1.247 + (LPSTR)error,
1.248 + err_max,
1.249 + NULL);
1.250 +#else if defined PLATFORM_POSIX
1.251 + snprintf(error, err_max, "%s", strerror(errno));
1.252 +#endif
1.253 + }
1.254 +}
1.255 +
1.256 +void LibrarySystem::CloseDirectory(IDirectory *dir)
1.257 +{
1.258 + delete dir;
1.259 +}
1.260 +
1.261 +ILibrary *LibrarySystem::OpenLibrary(const char *path, char *error, size_t err_max)
1.262 +{
1.263 + LibraryHandle lib;
1.264 +#if defined PLATFORM_WINDOWS
1.265 + lib = LoadLibraryA(path);
1.266 + if (!lib)
1.267 + {
1.268 + GetPlatformError(error, err_max);
1.269 + return false;
1.270 + }
1.271 +#else if defined PLATFORM_POSIX
1.272 + lib = dlopen(path, RTLD_NOW);
1.273 + if (!lib)
1.274 + {
1.275 + GetPlatformError(error, err_max);
1.276 + return false;
1.277 + }
1.278 +#endif
1.279 +
1.280 + return new CLibrary(lib);
1.281 +}