Web file system implementation + fixes

This commit is contained in:
elasota
2021-04-19 01:02:10 -04:00
parent f15a87041a
commit 84a4d16aed
30 changed files with 373 additions and 81 deletions

View File

@@ -81,7 +81,7 @@ namespace PortabilityLayer
return static_cast<GpUFilePos_t>(ftell(m_file));
}
void CFileStream::Close()
void CFileStream::GP_ASYNCIFY_PARANOID_NAMED(Close)()
{
if (m_file)
{

View File

@@ -23,7 +23,7 @@ namespace PortabilityLayer
bool SeekEnd(GpUFilePos_t loc) override;
GpUFilePos_t Size() const override;
GpUFilePos_t Tell() const override;
void Close() override;
void GP_ASYNCIFY_PARANOID_NAMED(Close)() override;
void Flush() override;
private:

View File

@@ -459,7 +459,13 @@ namespace PortabilityLayer
break;
}
if (WaitForEvent(&evtHolder, 1))
bool haveEvent = false;
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
haveEvent = WaitForEvent(&evtHolder, 1);
}
if (haveEvent)
rcvEvt = &evtHolder;
else
rcvEvt = nullptr;

View File

@@ -39,17 +39,17 @@ namespace PortabilityLayer
bool CompositeFileExists(VirtualDirectory_t dirID, const PLPasStr &filename) override;
bool NonCompositeFileExists(VirtualDirectory_t dirID, const PLPasStr &filename, const char *extension) override;
bool DeleteNonCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename, const char *ext) override;
bool DeleteCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename) override;
bool DeleteNonCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename, const char *ext) GP_ASYNCIFY_PARANOID_OVERRIDE;
bool DeleteCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename) GP_ASYNCIFY_PARANOID_OVERRIDE;
PLError_t CreateFile(VirtualDirectory_t dirID, const PLPasStr &filename, const MacFileProperties &mfp) override;
PLError_t CreateFileAtCurrentTime(VirtualDirectory_t dirID, const PLPasStr &filename, const ResTypeID &fileCreator, const ResTypeID &fileType) override;
PLError_t CreateFile(VirtualDirectory_t dirID, const PLPasStr &filename, const MacFileProperties &mfp) GP_ASYNCIFY_PARANOID_OVERRIDE;
PLError_t CreateFileAtCurrentTime(VirtualDirectory_t dirID, const PLPasStr &filename, const ResTypeID &fileCreator, const ResTypeID &fileType) GP_ASYNCIFY_PARANOID_OVERRIDE;
PLError_t RawOpenFileData(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t creationDisposition, GpIOStream *&outStream) override;
PLError_t RawOpenFileResources(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t creationDisposition, GpIOStream *&outStream) override;
bool PromptSaveFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override;
bool PromptOpenFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override;
bool PromptSaveFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) GP_ASYNCIFY_PARANOID_OVERRIDE;
bool PromptOpenFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) GP_ASYNCIFY_PARANOID_OVERRIDE;
static FileManagerImpl *GetInstance();
@@ -506,4 +506,36 @@ namespace PortabilityLayer
if (m_stream)
m_stream->Close();
}
#if GP_ASYNCIFY_PARANOID
bool FileManager::PromptSaveFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI)
{
return static_cast<FileManagerImpl*>(this)->PromptSaveFile(dirID, extension, path, outPathLength, pathCapacity, initialFileName, promptText, composites, callbackAPI);
}
bool FileManager::PromptOpenFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI)
{
return static_cast<FileManagerImpl*>(this)->PromptOpenFile(dirID, extension, path, outPathLength, pathCapacity, promptText, composites, callbackAPI);
}
PLError_t FileManager::CreateFile(VirtualDirectory_t dirID, const PLPasStr &filename, const MacFileProperties &mfp)
{
return static_cast<FileManagerImpl*>(this)->CreateFile(dirID, filename, mfp);
}
PLError_t FileManager::CreateFileAtCurrentTime(VirtualDirectory_t dirID, const PLPasStr &filename, const ResTypeID &fileCreator, const ResTypeID &fileType)
{
return static_cast<FileManagerImpl*>(this)->CreateFileAtCurrentTime(dirID, filename, fileCreator, fileType);
}
bool FileManager::DeleteNonCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename, const char *ext)
{
return static_cast<FileManagerImpl*>(this)->DeleteNonCompositeFile(dirID, filename, ext);
}
bool FileManager::DeleteCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename)
{
return static_cast<FileManagerImpl*>(this)->DeleteCompositeFile(dirID, filename);
}
#endif
}

View File

@@ -46,17 +46,17 @@ namespace PortabilityLayer
virtual bool CompositeFileExists(VirtualDirectory_t dirID, const PLPasStr &filename) = 0;
virtual bool NonCompositeFileExists(VirtualDirectory_t dirID, const PLPasStr &filename, const char *extension) = 0;
virtual bool DeleteNonCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename, const char *ext) = 0;
virtual bool DeleteCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL bool DeleteNonCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename, const char *ext) GP_ASYNCIFY_PARANOID_PURE;
GP_ASYNCIFY_PARANOID_VIRTUAL bool DeleteCompositeFile(VirtualDirectory_t dirID, const PLPasStr &filename) GP_ASYNCIFY_PARANOID_PURE;
virtual PLError_t CreateFile(VirtualDirectory_t dirID, const PLPasStr &filename, const MacFileProperties &mfp) = 0;
virtual PLError_t CreateFileAtCurrentTime(VirtualDirectory_t dirID, const PLPasStr &filename, const ResTypeID &fileCreator, const ResTypeID &fileType) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL PLError_t CreateFile(VirtualDirectory_t dirID, const PLPasStr &filename, const MacFileProperties &mfp) GP_ASYNCIFY_PARANOID_PURE;
GP_ASYNCIFY_PARANOID_VIRTUAL PLError_t CreateFileAtCurrentTime(VirtualDirectory_t dirID, const PLPasStr &filename, const ResTypeID &fileCreator, const ResTypeID &fileType) GP_ASYNCIFY_PARANOID_PURE;
virtual PLError_t RawOpenFileData(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t createDisposition, GpIOStream *&outStream) = 0;
virtual PLError_t RawOpenFileResources(VirtualDirectory_t dirID, const PLPasStr &filename, EFilePermission filePermission, bool ignoreMeta, GpFileCreationDisposition_t createDisposition, GpIOStream *&outStream) = 0;
virtual bool PromptSaveFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0;
virtual bool PromptOpenFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL bool PromptSaveFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) GP_ASYNCIFY_PARANOID_PURE;
GP_ASYNCIFY_PARANOID_VIRTUAL bool PromptOpenFile(VirtualDirectory_t dirID, const char *extension, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, bool composites, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) GP_ASYNCIFY_PARANOID_PURE;
static FileManager *GetInstance();
};

View File

@@ -21,7 +21,7 @@ namespace PortabilityLayer
bool SeekEnd(GpUFilePos_t loc) override;
GpUFilePos_t Size() const override;
GpUFilePos_t Tell() const override;
void Close() override;
void GP_ASYNCIFY_PARANOID_NAMED(Close)() override;
void Flush() override;
private:
@@ -148,7 +148,7 @@ namespace PortabilityLayer
return m_expectedPosition - m_start;
}
void FileSectionStreamImpl::Close()
void FileSectionStreamImpl::GP_ASYNCIFY_PARANOID_NAMED(Close)()
{
this->~FileSectionStreamImpl();
free(this);

View File

@@ -22,7 +22,7 @@ namespace PortabilityLayer
bool SeekEnd(GpUFilePos_t loc) override;
GpUFilePos_t Size() const override;
GpUFilePos_t Tell() const override;
void Close() override;
void GP_ASYNCIFY_PARANOID_NAMED(Close)() override;
void Flush() override;
private:
@@ -222,7 +222,7 @@ namespace PortabilityLayer
return m_decompressedPos;
}
void InflateStreamImpl::Close()
void InflateStreamImpl::GP_ASYNCIFY_PARANOID_NAMED(Close)()
{
this->~InflateStreamImpl();
free(this);

View File

@@ -104,7 +104,7 @@ namespace PortabilityLayer
return static_cast<GpUFilePos_t>(m_loc);
}
void MemReaderStream::Close()
void MemReaderStream::GP_ASYNCIFY_PARANOID_NAMED(Close)()
{
}
@@ -128,7 +128,7 @@ namespace PortabilityLayer
return new (storage) MemBufferReaderStream(buffer, size);
}
void MemBufferReaderStream::Close()
void MemBufferReaderStream::GP_ASYNCIFY_PARANOID_NAMED(Close)()
{
this->~MemBufferReaderStream();
MemoryManager::GetInstance()->Release(this);

View File

@@ -23,7 +23,7 @@ namespace PortabilityLayer
bool SeekEnd(GpUFilePos_t loc) override;
GpUFilePos_t Size() const override;
GpUFilePos_t Tell() const override;
void Close() override;
void GP_ASYNCIFY_PARANOID_NAMED(Close)() override;
void Flush() override;
private:
@@ -41,7 +41,7 @@ namespace PortabilityLayer
static MemBufferReaderStream *Create(void *buffer, size_t size);
void Close() override;
void GP_ASYNCIFY_PARANOID_NAMED(Close)() override;
private:
MemBufferReaderStream() GP_DELETED;

View File

@@ -155,7 +155,7 @@ namespace PortabilityLayer
bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) override;
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) GP_ASYNCIFY_PARANOID_OVERRIDE;
void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) override;
void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) GP_ASYNCIFY_PARANOID_OVERRIDE;
void DrawMenuBar() override;
void SetMenuVisible(bool isVisible) override;
@@ -776,7 +776,14 @@ namespace PortabilityLayer
bool canDismiss = false;
while (!canDismiss)
{
if (WaitForEvent(&evt, 1))
bool haveEvent = false;
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
haveEvent = WaitForEvent(&evt, 1);
}
if (haveEvent)
{
if (evt.m_vosEvent.m_eventType == GpVOSEventTypes::kMouseInput)
{
@@ -1589,5 +1596,10 @@ namespace PortabilityLayer
{
static_cast<MenuManagerImpl*>(this)->MenuSelect(initialPoint, outMenu, outItem);
}
void MenuManager::PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem)
{
static_cast<MenuManagerImpl*>(this)->PopupMenuSelect(menu, popupMenuPos, initialPoint, initialItem, outItem);
}
#endif
}

View File

@@ -50,7 +50,7 @@ namespace PortabilityLayer
virtual bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) GP_ASYNCIFY_PARANOID_PURE;
virtual void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL void PopupMenuSelect(const THandle<Menu> &menu, const Vec2i &popupMenuPos, const Vec2i &initialPoint, size_t initialItem, uint16_t *outItem) GP_ASYNCIFY_PARANOID_PURE;
virtual void DrawMenuBar() = 0;
virtual void SetMenuVisible(bool isVisible) = 0;

View File

@@ -515,6 +515,12 @@ Boolean WaitMouseUp()
return isDown;
}
Boolean WaitMouseUp_DisarmAsyncify()
{
PL_ASYNCIFY_PARANOID_DISARM_FOR_SCOPE();
return WaitMouseUp();
}
short Random()
{
// Should return with range -32767..32767

View File

@@ -249,6 +249,7 @@ void DisposeDirectoryFiles(DirectoryFileListEntry *firstDFL);
void GetMouse(Window *window, Point *point);
Boolean StillDown();
Boolean WaitMouseUp();
Boolean WaitMouseUp_DisarmAsyncify();
short Random();
void GetTime(DateTimeRec *dateTime);

View File

@@ -116,7 +116,7 @@ namespace PortabilityLayer
IResourceArchive *GetAppResourceArchive() const override;
IResourceArchive *LoadResFile(CompositeFile *file) const override;
PLError_t CreateBlankResFile(VirtualDirectory_t virtualDir, const PLPasStr &filename) override;
PLError_t CreateBlankResFile(VirtualDirectory_t virtualDir, const PLPasStr &filename) GP_ASYNCIFY_PARANOID_OVERRIDE;
void DissociateHandle(MMHandleBlock *hdl) const override;
const ResourceArchiveRef *ResourceForHandle(MMHandleBlock *hdl) const override;
@@ -524,4 +524,11 @@ namespace PortabilityLayer
if (m_stream)
m_stream->Close();
}
#if GP_ASYNCIFY_PARANOID
PLError_t ResourceManager::CreateBlankResFile(VirtualDirectory_t virtualDir, const PLPasStr &filename)
{
return static_cast<ResourceManagerImpl*>(this)->CreateBlankResFile(virtualDir, filename);
}
#endif
}

View File

@@ -19,6 +19,7 @@
#include <assert.h>
#include <setjmp.h>
#include <stdlib.h>
static void TranslateMouseInputEvent(const GpVOSEvent &vosEventBase, uint32_t timestamp, PortabilityLayer::EventQueue *queue)
{
@@ -176,7 +177,7 @@ namespace PLSysCalls
{
// Asyncify disarm checks are for manually checking that a stack has no indirect calls.
// They should not be nested!
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID_VALIDATION
static bool g_asyncifyParanoidDisarmed = false;
void AsyncifyParanoidSetDisarmed(bool state)
@@ -198,7 +199,7 @@ namespace PLSysCalls
void Sleep(uint32_t ticks)
{
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID_VALIDATION
assert(g_asyncifyParanoidDisarmed);
#endif
if (ticks > 0)

View File

@@ -10,7 +10,7 @@ namespace PLSysCalls
void Sleep(uint32_t ticks);
void Exit(int exitCode);
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID
#if GP_DEBUG_CONFIG && GP_ASYNCIFY_PARANOID_VALIDATION
class AsyncifyDisarmScope
{
public:

View File

@@ -78,7 +78,7 @@ namespace PortabilityLayer
virtual IResourceArchive *GetAppResourceArchive() const = 0;
virtual IResourceArchive *LoadResFile(CompositeFile *file) const = 0;
virtual PLError_t CreateBlankResFile(VirtualDirectory_t virtualDir, const PLPasStr &filename) = 0;
GP_ASYNCIFY_PARANOID_VIRTUAL PLError_t CreateBlankResFile(VirtualDirectory_t virtualDir, const PLPasStr &filename) GP_ASYNCIFY_PARANOID_PURE;
virtual void DissociateHandle(MMHandleBlock *hdl) const = 0;
virtual const ResourceArchiveRef *ResourceForHandle(MMHandleBlock *hdl) const = 0;