fix(File): Remove WinAPI related shit

This commit is contained in:
Mohamed Ashraf 2026-03-02 14:27:09 +04:00
parent 141819a6c4
commit 0803f67f47

View file

@ -10,6 +10,20 @@
#include <fios2.h> #include <fios2.h>
#endif #endif
#if defined(__linux__)
#include <limits.h>
#include <sys/stat.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <vector>
#include <sys/types.h>
#include <string>
#include <unistd.h> // for access()
#include <fcntl.h>
#define MAX_PATH PATH_MAX
#endif
const wchar_t File::pathSeparator = L'\\'; const wchar_t File::pathSeparator = L'\\';
#ifdef _XBOX #ifdef _XBOX
const wstring File::pathRoot = L"GAME:"; // Path root after pathSeparator has been removed const wstring File::pathRoot = L"GAME:"; // Path root after pathSeparator has been removed
@ -97,16 +111,23 @@ this->parent = NULL;
//true if and only if the file or directory is successfully deleted; false otherwise //true if and only if the file or directory is successfully deleted; false otherwise
bool File::_delete() bool File::_delete()
{ {
#ifdef _UNICODE #if defined _UNICODE
BOOL result = DeleteFile( getPath().c_str() ); BOOL result = DeleteFile( getPath().c_str() );
#elif defined(__linux__)
// FIXME
BOOL result = 0;
#else #else
BOOL result = DeleteFile( wstringtofilename(getPath()) ); BOOL result = DeleteFile( wstringtofilename(getPath()) );
#endif #endif
if( result == 0 ) if( result == 0 )
{ {
#if !defined(__linux__)
DWORD error = GetLastError(); DWORD error = GetLastError();
#ifndef _CONTENT_PACKAGE #ifndef _CONTENT_PACKAGE
printf( "File::_delete - Error code %d (%#0.8X)\n", error, error ); printf( "File::_delete - Error code %d (%#0.8X)\n", error, error );
#endif
#else
printf("Unable to delete file :(");
#endif #endif
return false; return false;
} }
@ -119,9 +140,12 @@ bool File::_delete()
//true if and only if the directory was created; false otherwise //true if and only if the directory was created; false otherwise
bool File::mkdir() const bool File::mkdir() const
{ {
#ifdef _UNICODE #if defined (_UNICODE)
return CreateDirectory( getPath().c_str(), NULL) != 0; return CreateDirectory( getPath().c_str(), NULL) != 0;
#elif defined(__linux__)
std::wstring wpath = getPath();
std::string path(wpath.begin(), wpath.end());
return ::mkdir(path.c_str(), 0777) == 0; // rwxrwxrwx
#else #else
return CreateDirectory( wstringtofilename(getPath()), NULL) != 0; return CreateDirectory( wstringtofilename(getPath()), NULL) != 0;
#endif #endif
@ -175,6 +199,15 @@ bool File::mkdirs() const
return false; return false;
} }
} }
#elif defined(__linux__)
std::wstring wpath = getPath();
std::string path(wpath.begin(), wpath.end());
struct stat info;
if (stat(path.c_str(), &info) != 0 || !(info.st_mode & S_IFDIR)) {
if (::mkdir(path.c_str(), 0777) != 0) {
return false;
}
}
#else #else
if( GetFileAttributes( wstringtofilename(pathToHere) ) == -1 ) if( GetFileAttributes( wstringtofilename(pathToHere) ) == -1 )
{ {
@ -207,9 +240,12 @@ return (File *) parent;
bool File::exists() const bool File::exists() const
{ {
// TODO 4J Stu - Possible we could get an error result from something other than the file not existing? // TODO 4J Stu - Possible we could get an error result from something other than the file not existing?
#ifdef _UNICODE #if defined(_UNICODE)
return GetFileAttributes( getPath().c_str() ) != -1; return GetFileAttributes( getPath().c_str() ) != -1;
#elif defined(__linux__)
std::wstring wpath = getPath();
std::string path(wpath.begin(), wpath.end());
return access(path.c_str(), F_OK) != -1;
#else #else
return GetFileAttributes( wstringtofilename(getPath()) ) != -1; return GetFileAttributes( wstringtofilename(getPath()) ) != -1;
#endif #endif
@ -234,30 +270,51 @@ bool File::isFile() const
//true if and only if the renaming succeeded; false otherwise //true if and only if the renaming succeeded; false otherwise
bool File::renameTo(File dest) bool File::renameTo(File dest)
{ {
// 4J Stu - The wstringtofilename function returns a pointer to the same location in memory every time it is std::string sourcePath = wstringtofilename(getPath());
// called, therefore we were getting sourcePath and destPath having the same value. The solution here is to std::string destPath = wstringtofilename(dest.getPath());
// make a copy of the sourcePath by storing it in a std::string
string sourcePath = wstringtofilename(getPath());
const char *destPath = wstringtofilename(dest.getPath());
#ifdef _DURANGO
__debugbreak(); // TODO
BOOL result = false;
#else
BOOL result = MoveFile(sourcePath.c_str(), destPath);
#endif
if( result == 0 ) int result = rename(sourcePath.c_str(), destPath.c_str());
if(result != 0)
{ {
DWORD error = GetLastError(); perror("File::renameTo - Error renaming file");
#ifndef _CONTENT_PACKAGE
printf( "File::renameTo - Error code %d (%#0.8X)\n", error, error );
#endif
return false; return false;
} }
else else
{
return true; return true;
}
} }
#if defined(__linux__)
// DecalOverdose: Stolen from my other project
void listFiles(const char *directory) {
DIR *dp;
struct dirent *entry;
struct stat fileStat;
dp = opendir(directory);
if (dp == NULL) {
perror("opendir");
return;
}
while ((entry = readdir(dp)) != NULL) {
char fullPath[1024];
snprintf(fullPath, sizeof(fullPath), "%s/%s", directory, entry->d_name);
if (stat(fullPath, &fileStat) == 0) {
if (S_ISREG(fileStat.st_mode)) {
printf("File: %s\n", entry->d_name);
}
} else {
perror("stat");
}
}
closedir(dp);
}
#endif // __linux__
//Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname. //Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname.
//If this abstract pathname does not denote a directory, then this method returns null. Otherwise an array of File objects is returned, //If this abstract pathname does not denote a directory, then this method returns null. Otherwise an array of File objects is returned,
//one for each file or directory in the directory. Pathnames denoting the directory itself and the directory's parent directory //one for each file or directory in the directory. Pathnames denoting the directory itself and the directory's parent directory
@ -368,7 +425,11 @@ vector<File *> *File::listFiles() const
delete pBuf; delete pBuf;
#else #else
#if defined(__linux__)
struct stat wfd;
#else // _WIN32
WIN32_FIND_DATA wfd; WIN32_FIND_DATA wfd;
#endif // __linux__
#ifdef _UNICODE #ifdef _UNICODE
WCHAR path[MAX_PATH]; WCHAR path[MAX_PATH];
@ -385,6 +446,9 @@ vector<File *> *File::listFiles() const
while( FindNextFile( hFind, &wfd) ); while( FindNextFile( hFind, &wfd) );
FindClose( hFind); FindClose( hFind);
} }
#elif defined(__linux__)
char path[MAX_PATH];
::listFiles(path);
#else #else
char path[MAX_PATH]; char path[MAX_PATH];
sprintf( path, "%s\\*", wstringtofilename( getPath() ) ); sprintf( path, "%s\\*", wstringtofilename( getPath() ) );
@ -480,6 +544,9 @@ vector<File *> *File::listFiles(FileFilter *filter) const
} while( FindNextFile( hFind, &wfd) ); } while( FindNextFile( hFind, &wfd) );
FindClose( hFind); FindClose( hFind);
} }
#elif defined(__linux__)
char path[MAX_PATH];
::listFiles(path);
#else #else
char path[MAX_PATH]; char path[MAX_PATH];
WIN32_FIND_DATA wfd; WIN32_FIND_DATA wfd;
@ -511,8 +578,12 @@ vector<File *> *File::listFiles(FileFilter *filter) const
//true if and only if the file denoted by this abstract pathname exists and is a directory; false otherwise //true if and only if the file denoted by this abstract pathname exists and is a directory; false otherwise
bool File::isDirectory() const bool File::isDirectory() const
{ {
#ifdef _UNICODE #if defined(_UNICODE)
return exists() && ( GetFileAttributes( getPath().c_str() ) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY; return exists() && ( GetFileAttributes( getPath().c_str() ) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY;
#elif defined(__linux__)
std::wstring wpath = getPath();
std::string path(wpath.begin(), wpath.end());
return access(path.c_str(), F_OK) != -1;
#else #else
return exists() && ( GetFileAttributes( wstringtofilename(getPath()) ) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY; return exists() && ( GetFileAttributes( wstringtofilename(getPath()) ) & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY;
#endif #endif
@ -586,9 +657,20 @@ __int64 File::length()
return 0; return 0;
} }
return statData.fileSize; return statData.fileSize;
#elif defined(__linux__)
struct stat fileInfoBuffer;
std::wstring wpath = getPath();
std::string path(wpath.begin(), wpath.end());
int result = stat(path.c_str(), &fileInfoBuffer);
if(result == 0) {
return fileInfoBuffer.st_size;
} else {
return 0;
}
#else #else
WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer; WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer;
#ifdef _UNICODE #ifdef _UNICODE
BOOL result = GetFileAttributesEx( BOOL result = GetFileAttributesEx(
getPath().c_str(), // file or directory name getPath().c_str(), // file or directory name
@ -626,6 +708,7 @@ __int64 File::length()
//or 0L if the file does not exist or if an I/O error occurs //or 0L if the file does not exist or if an I/O error occurs
__int64 File::lastModified() __int64 File::lastModified()
{ {
#if !defined(__linux__)
WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer; WIN32_FILE_ATTRIBUTE_DATA fileInfoBuffer;
#ifdef _UNICODE #ifdef _UNICODE
BOOL result = GetFileAttributesEx( BOOL result = GetFileAttributesEx(
@ -655,6 +738,17 @@ __int64 File::lastModified()
//Fail or a Directory //Fail or a Directory
return 0l; return 0l;
} }
#else
struct stat fileStat;
struct stat fileInfoBuffer;
std::wstring wpath = getPath();
std::string path(wpath.begin(), wpath.end());
if (stat(path.c_str(), &fileStat) == 0 && !S_ISDIR(fileStat.st_mode)) {
return static_cast<__int64>(fileStat.st_mtime);
} else {
return 0l;
}
#endif
} }
const wstring File::getPath() const const wstring File::getPath() const