dvander@141: #include dvander@141: #include "LibrarySys.h" dvander@141: dvander@141: LibrarySystem g_LibSys; dvander@141: dvander@141: CLibrary::~CLibrary() dvander@141: { dvander@141: if (m_lib) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: FreeLibrary(m_lib); dvander@141: #else if defined PLATFORM_POSIX dvander@141: dlclose(m_lib); dvander@141: #endif dvander@141: m_lib = NULL; dvander@141: } dvander@141: } dvander@141: dvander@141: CLibrary::CLibrary(LibraryHandle me) dvander@141: { dvander@141: m_lib = me; dvander@141: } dvander@141: dvander@141: void CLibrary::CloseLibrary() dvander@141: { dvander@141: delete this; dvander@141: } dvander@141: dvander@141: void *CLibrary::GetSymbolAddress(const char *symname) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: return GetProcAddress(m_lib, symname); dvander@141: #else if defined PLATFORM_POSIX dvander@141: return dlsym(m_lib, symname); dvander@141: #endif dvander@141: } dvander@141: dvander@141: dvander@141: /******************** dvander@141: ** Directory Code ** dvander@141: ********************/ dvander@141: dvander@141: dvander@141: CDirectory::CDirectory(const char *path) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: char newpath[PLATFORM_MAX_PATH]; dvander@141: snprintf(newpath, sizeof(newpath), "%s\\*.*", path); dvander@141: m_dir = FindFirstFileA(newpath, &m_fd); dvander@141: if (!IsValid()) dvander@141: { dvander@141: m_fd.cFileName[0] = '\0'; dvander@141: } dvander@141: #else if defined PLATFORM_POSIX dvander@141: m_dir = opendir(path); dvander@141: if (IsValid()) dvander@141: { dvander@141: /* :TODO: we need to read past "." and ".."! */ dvander@141: ep = readdir(dp); dvander@141: snprintf(m_origpath, PLATFORM_MAX_PATH, "%s", path); dvander@141: } else { dvander@141: ep = NULL; dvander@141: } dvander@141: #endif dvander@141: } dvander@141: dvander@141: CDirectory::~CDirectory() dvander@141: { dvander@141: if (IsValid()) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: FindClose(m_dir); dvander@141: #else if defined PLATFORM_POSIX dvander@141: closedir(m_dir); dvander@141: #endif dvander@141: } dvander@141: } dvander@141: dvander@141: void CDirectory::NextEntry() dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: if (FindNextFile(m_dir, &m_fd) == 0) dvander@141: { dvander@141: FindClose(m_dir); dvander@141: m_dir = INVALID_HANDLE_VALUE; dvander@141: } dvander@141: #else if defined PLATFORM_POSIX dvander@141: if ((ep=readdir(m_dir) == NULL) dvander@141: { dvander@141: closedir(m_dir); dvander@141: m_dir = NULL; dvander@141: } dvander@141: #endif dvander@141: } dvander@141: dvander@141: bool CDirectory::IsEntryDirectory() dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY); dvander@141: #else if defined PLATFORM_LINUX dvander@141: char temppath[PLATFORM_MAX_PATH]; dvander@141: snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName()); dvander@141: return g_LibrarySys.IsPathDirectory(temppath); dvander@141: #endif dvander@141: } dvander@141: dvander@141: bool CDirectory::IsEntryFile() dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE)); dvander@141: #else if defined PLATFORM_POSIX dvander@141: char temppath[PLATFORM_MAX_PATH]; dvander@141: snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName()); dvander@141: return g_LibrarySys.IsPathFile(temppath); dvander@141: #endif dvander@141: } dvander@141: dvander@141: const char *CDirectory::GetEntryName() dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: return m_fd.cFileName; dvander@141: #else if defined PLATFORM_LINUX dvander@141: return ep ? ep->d_name : ""; dvander@141: #endif dvander@141: } dvander@141: dvander@141: bool CDirectory::MoreFiles() dvander@141: { dvander@141: return IsValid(); dvander@141: } dvander@141: dvander@141: bool CDirectory::IsValid() dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: return (m_dir != INVALID_HANDLE_VALUE); dvander@141: #else if defined PLATFORM_LINUX dvander@141: return (m_dir != NULL); dvander@141: #endif dvander@141: } dvander@141: dvander@141: dvander@141: /************************* dvander@141: ** Library System Code ** dvander@141: *************************/ dvander@141: dvander@141: dvander@141: bool LibrarySystem::PathExists(const char *path) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: DWORD attr = GetFileAttributesA(path); dvander@141: dvander@141: return (attr != INVALID_FILE_ATTRIBUTES); dvander@141: #else if defined PLATFORM_POSIX dvander@141: struct stat s; dvander@141: dvander@141: return (stat(path, &s) == 0); dvander@141: #endif dvander@141: } dvander@141: dvander@141: bool LibrarySystem::IsPathFile(const char *path) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: DWORD attr = GetFileAttributes(path); dvander@141: dvander@141: if (attr == INVALID_FILE_ATTRIBUTES) dvander@141: { dvander@141: return false; dvander@141: } dvander@141: dvander@141: if (attr & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE)) dvander@141: { dvander@141: return false; dvander@141: } dvander@141: dvander@141: return true; dvander@141: #else if defined PLATFORM_LINUX dvander@141: struct stat s; dvander@141: dvander@141: if (stat(path, &s) != 0) dvander@141: { dvander@141: return false; dvander@141: } dvander@141: dvander@141: return S_ISREG(s.st_mode) ? true : false; dvander@141: #endif dvander@141: } dvander@141: dvander@141: bool LibrarySystem::IsPathDirectory(const char *path) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: DWORD attr = GetFileAttributes(path); dvander@141: dvander@141: if (attr == INVALID_FILE_ATTRIBUTES) dvander@141: { dvander@141: return false; dvander@141: } dvander@141: dvander@141: if (attr & FILE_ATTRIBUTE_DIRECTORY) dvander@141: { dvander@141: return true; dvander@141: } dvander@141: dvander@141: #else if defined PLATFORM_LINUX dvander@141: struct stat s; dvander@141: dvander@141: if (stat(path, &s) != 0) dvander@141: { dvander@141: return false; dvander@141: } dvander@141: dvander@141: if (S_ISDIR(s.st_mode)) dvander@141: { dvander@141: return true; dvander@141: } dvander@141: #endif dvander@141: dvander@141: return false; dvander@141: } dvander@141: dvander@141: IDirectory *LibrarySystem::OpenDirectory(const char *path) dvander@141: { dvander@141: CDirectory *dir = new CDirectory(path); dvander@141: dvander@141: if (!dir->IsValid()) dvander@141: { dvander@141: delete dir; dvander@141: return NULL; dvander@141: } dvander@141: dvander@141: return dir; dvander@141: } dvander@141: dvander@141: void LibrarySystem::GetPlatformError(char *error, size_t err_max) dvander@141: { dvander@141: if (error && err_max) dvander@141: { dvander@141: #if defined PLATFORM_WINDOWS dvander@141: DWORD dw = GetLastError(); dvander@141: FormatMessageA( dvander@141: FORMAT_MESSAGE_FROM_SYSTEM, dvander@141: NULL, dvander@141: dw, dvander@141: MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), dvander@141: (LPSTR)error, dvander@141: err_max, dvander@141: NULL); dvander@141: #else if defined PLATFORM_POSIX dvander@141: snprintf(error, err_max, "%s", strerror(errno)); dvander@141: #endif dvander@141: } dvander@141: } dvander@141: dvander@141: void LibrarySystem::CloseDirectory(IDirectory *dir) dvander@141: { dvander@141: delete dir; dvander@141: } dvander@141: dvander@141: ILibrary *LibrarySystem::OpenLibrary(const char *path, char *error, size_t err_max) dvander@141: { dvander@141: LibraryHandle lib; dvander@141: #if defined PLATFORM_WINDOWS dvander@141: lib = LoadLibraryA(path); dvander@141: if (!lib) dvander@141: { dvander@141: GetPlatformError(error, err_max); dvander@141: return false; dvander@141: } dvander@141: #else if defined PLATFORM_POSIX dvander@141: lib = dlopen(path, RTLD_NOW); dvander@141: if (!lib) dvander@141: { dvander@141: GetPlatformError(error, err_max); dvander@141: return false; dvander@141: } dvander@141: #endif dvander@141: dvander@141: return new CLibrary(lib); dvander@141: }