pcbjam/wasm/kiplatform/io.cpp

84 lines
2.1 KiB
C++
Raw Permalink Normal View History

/*
* WASM implementation of kiplatform/io.h
* Provides file I/O functions for WASM virtual filesystem
*/
#include <kiplatform/io.h>
#include <wx/string.h>
#include <wx/filename.h>
#include <wx/dir.h>
#include <stdio.h>
#include <sys/stat.h>
namespace KIPLATFORM
{
namespace IO
{
FILE* SeqFOpen( const wxString& aPath, const wxString& mode )
{
// WASM doesn't have special sequential read hints
// Just use standard fopen
return fopen( aPath.utf8_str(), mode.utf8_str() );
}
bool DuplicatePermissions( const wxString& aSrc, const wxString& aDest )
{
// WASM virtual filesystem doesn't have detailed permissions
return true;
}
bool MakeWriteable( const wxString& aFilePath )
{
// All files in WASM virtual filesystem are writeable
return true;
}
bool IsFileHidden( const wxString& aFileName )
{
// Check for Unix-style hidden files (starting with .)
wxFileName fn( aFileName );
wxString name = fn.GetFullName();
return !name.IsEmpty() && name[0] == '.';
}
void LongPathAdjustment( wxFileName& aFilename )
{
// No-op on non-Windows platforms
}
long long TimestampDir( const wxString& aDirPath, const wxString& aFilespec )
{
// Mirror the native implementations: accumulate (mtime, size) over files
// matching the spec so callers can detect library-directory changes. The
// Emscripten virtual filesystem supports stat(), so this works for MEMFS-
// backed local libraries (git/network libraries are handled JS-side).
long long timestamp = 0;
wxDir dir( aDirPath );
if( !dir.IsOpened() )
return timestamp;
wxString filename;
bool cont = dir.GetFirst( &filename, aFilespec, wxDIR_FILES );
while( cont )
{
wxString fullPath = aDirPath + wxFILE_SEP_PATH + filename;
struct stat entryStat;
if( stat( fullPath.fn_str(), &entryStat ) == 0 )
{
timestamp += static_cast<long long>( entryStat.st_mtime ) * 1000;
timestamp += entryStat.st_size;
}
cont = dir.GetNext( &filename );
}
return timestamp;
}
} // namespace IO
} // namespace KIPLATFORM