/* * WASM implementation of kiplatform/io.h * Provides file I/O functions for WASM virtual filesystem */ #include #include #include #include #include #include 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( entryStat.st_mtime ) * 1000; timestamp += entryStat.st_size; } cont = dir.GetNext( &filename ); } return timestamp; } } // namespace IO } // namespace KIPLATFORM