From 66a111dd235efe710611323d5c7eff10e14561a8 Mon Sep 17 00:00:00 2001 From: elasota Date: Thu, 12 Nov 2020 02:35:07 -0500 Subject: [PATCH] Restrict file browser UI by file type --- GpApp/House.cpp | 2 +- GpApp/SavedGames.cpp | 4 ++-- PortabilityLayer/FileBrowserUI.cpp | 31 ++++++++++++++++++++++++++---- PortabilityLayer/FileBrowserUI.h | 4 +++- PortabilityLayer/FileManager.cpp | 12 ++++++------ PortabilityLayer/FileManager.h | 4 ++-- 6 files changed, 41 insertions(+), 16 deletions(-) diff --git a/GpApp/House.cpp b/GpApp/House.cpp index 05d8fb0..eeb3fdd 100644 --- a/GpApp/House.cpp +++ b/GpApp/House.cpp @@ -99,7 +99,7 @@ Boolean CreateNewHouse (void) char savePath[sizeof(theSpec.m_name) + 1]; size_t savePathLength = 0; - if (!fm->PromptSaveFile(theSpec.m_dir, savePath, savePathLength, sizeof(theSpec.m_name), PSTR("My House"), PSTR("Create House"), GetHouseDetailsAPI())) + if (!fm->PromptSaveFile(theSpec.m_dir, 'gliH', savePath, savePathLength, sizeof(theSpec.m_name), PSTR("My House"), PSTR("Create House"), GetHouseDetailsAPI())) return false; assert(savePathLength < sizeof(theSpec.m_name) - 1); diff --git a/GpApp/SavedGames.cpp b/GpApp/SavedGames.cpp index fca7fb9..040932c 100644 --- a/GpApp/SavedGames.cpp +++ b/GpApp/SavedGames.cpp @@ -163,7 +163,7 @@ void SaveGame2 (void) char savePath[sizeof(spec.m_name) + 1]; size_t savePathLength = 0; - if (!fm->PromptSaveFile(spec.m_dir, savePath, savePathLength, sizeof(spec.m_name), PLPasStr(gameNameStr), PSTR("Save Game"), GetSavedGameDetailsAPI())) + if (!fm->PromptSaveFile(spec.m_dir, 'gliG', savePath, savePathLength, sizeof(spec.m_name), PLPasStr(gameNameStr), PSTR("Save Game"), GetSavedGameDetailsAPI())) { mm->Release(savedGame); return; @@ -272,7 +272,7 @@ Boolean OpenSavedGame (void) char savePath[sizeof(spec.m_name) + 1]; size_t savePathLength = 0; - if (!fm->PromptOpenFile(spec.m_dir, savePath, savePathLength, sizeof(spec.m_name), PSTR("Open Saved Game"), GetSavedGameDetailsAPI())) + if (!fm->PromptOpenFile(spec.m_dir, 'gliG', savePath, savePathLength, sizeof(spec.m_name), PSTR("Open Saved Game"), GetSavedGameDetailsAPI())) return false; assert(savePathLength < sizeof(spec.m_name) - 1); diff --git a/PortabilityLayer/FileBrowserUI.cpp b/PortabilityLayer/FileBrowserUI.cpp index e03eff5..e3b645b 100644 --- a/PortabilityLayer/FileBrowserUI.cpp +++ b/PortabilityLayer/FileBrowserUI.cpp @@ -6,12 +6,14 @@ #include "FontFamily.h" #include "GpApplicationName.h" #include "GpBuildVersion.h" +#include "GpIOStream.h" #include "GpRenderedFontMetrics.h" #include "HostFileSystem.h" #include "HostDirectoryCursor.h" #include "HostSystemServices.h" #include "IGpFont.h" #include "WindowManager.h" +#include "MacFileInfo.h" #include "MemoryManager.h" #include "PLStandardColors.h" #include "RenderedFont.h" @@ -175,11 +177,11 @@ namespace PortabilityLayer size_t oldSize = m_entries.MMBlock()->m_size; if (!mm->ResizeHandle(m_entries.MMBlock(), oldSize + sizeof(FileEntry))) - return false; + return false; FileEntry &entry = (*m_entries)[m_numEntries++]; entry.m_nameStr = NameStr_t(nameLen, name); - entry.m_fileDetails = details; + entry.m_fileDetails = details; return true; } @@ -562,7 +564,7 @@ namespace PortabilityLayer return hit; } - bool FileBrowserUI::Prompt(Mode mode, VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) + bool FileBrowserUI::Prompt(Mode mode, VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) { int dialogID = 0; bool isObstructive = false; @@ -607,6 +609,27 @@ namespace PortabilityLayer if (!memcmp(nameExt, ".gpf", 4)) { + GpIOStream *metadataStream = fs->OpenFile(dirID, fileName, false, GpFileCreationDispositions::kOpenExisting); + if (!metadataStream) + continue; + + MacFilePropertiesSerialized serializedMetadata; + if (metadataStream->Read(&serializedMetadata, sizeof(serializedMetadata)) != sizeof(serializedMetadata)) + { + metadataStream->Close(); + continue; + } + + metadataStream->Close(); + + MacFileProperties metadata; + serializedMetadata.Deserialize(metadata); + + char ftype[4]; + fileType.ExportAsChars(ftype); + if (memcmp(metadata.m_fileType, ftype, 4)) + continue; + if (!uiImpl.AppendName(fileName, nameLength - 4, callbackAPI.m_loadFileDetailsCallback(dirID, PLPasStr(nameLength - 4, fileName)))) { dirCursor->Destroy(); @@ -779,7 +802,7 @@ namespace PortabilityLayer outPathLength = uiFileName.Length(); } - dialog->Destroy(); + dialog->Destroy(); return confirmed; } diff --git a/PortabilityLayer/FileBrowserUI.h b/PortabilityLayer/FileBrowserUI.h index fd5eaed..df3bb7f 100644 --- a/PortabilityLayer/FileBrowserUI.h +++ b/PortabilityLayer/FileBrowserUI.h @@ -11,6 +11,8 @@ struct Rect; namespace PortabilityLayer { + class ResTypeID; + struct FileBrowserUI_DetailsCallbackAPI { void(*m_drawLabelsCallback)(DrawSurface *surface, const Point &basePoint); @@ -30,6 +32,6 @@ namespace PortabilityLayer Mode_Open, }; - static bool Prompt(Mode mode, VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI); + static bool Prompt(Mode mode, VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI); }; } diff --git a/PortabilityLayer/FileManager.cpp b/PortabilityLayer/FileManager.cpp index 1293dde..3f68789 100644 --- a/PortabilityLayer/FileManager.cpp +++ b/PortabilityLayer/FileManager.cpp @@ -35,8 +35,8 @@ namespace PortabilityLayer 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, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override; - bool PromptOpenFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override; + bool PromptSaveFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override; + bool PromptOpenFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) override; static FileManagerImpl *GetInstance(); @@ -176,18 +176,18 @@ namespace PortabilityLayer return RawOpenFileFork(dirID, filename, ".gpa", permission, ignoreMeta, createDisposition, outStream); } - bool FileManagerImpl::PromptSaveFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI) + bool FileManagerImpl::PromptSaveFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI) { ExtendedFileName_t extFN; if (!ConstructFilename(extFN, initialFileName, "")) return false; - return FileBrowserUI::Prompt(FileBrowserUI::Mode_Save, dirID, path, outPathLength, pathCapacity, initialFileName, promptText, detailsAPI); + return FileBrowserUI::Prompt(FileBrowserUI::Mode_Save, dirID, fileType, path, outPathLength, pathCapacity, initialFileName, promptText, detailsAPI); } - bool FileManagerImpl::PromptOpenFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI) + bool FileManagerImpl::PromptOpenFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &detailsAPI) { - return FileBrowserUI::Prompt(FileBrowserUI::Mode_Open, dirID, path, outPathLength, pathCapacity, PSTR(""), promptText, detailsAPI); + return FileBrowserUI::Prompt(FileBrowserUI::Mode_Open, dirID, fileType, path, outPathLength, pathCapacity, PSTR(""), promptText, detailsAPI); } FileManagerImpl *FileManagerImpl::GetInstance() diff --git a/PortabilityLayer/FileManager.h b/PortabilityLayer/FileManager.h index 94b1111..e23088a 100644 --- a/PortabilityLayer/FileManager.h +++ b/PortabilityLayer/FileManager.h @@ -36,8 +36,8 @@ namespace PortabilityLayer 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, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0; - virtual bool PromptOpenFile(VirtualDirectory_t dirID, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0; + virtual bool PromptSaveFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &initialFileName, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0; + virtual bool PromptOpenFile(VirtualDirectory_t dirID, const ResTypeID &fileType, char *path, size_t &outPathLength, size_t pathCapacity, const PLPasStr &promptText, const FileBrowserUI_DetailsCallbackAPI &callbackAPI) = 0; static FileManager *GetInstance(); };