mirror of
https://github.com/elasota/Aerofoil.git
synced 2025-12-13 19:49:36 +00:00
Web file system implementation + fixes
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user