Draft
Conversation
Introduce a BlobCodec abstraction and a no-op Passthrough implementation, add build integration for zstd, and register new sources in CMake.
- CMake: add facebook/zstd CPM package (v1.5.7) and require/link libzstd_static (fatal if missing). Register new headers/sources in application and public util source lists.
- Add util/BlobCodec.h and BlobCodec.cpp: codec Type enum, Result struct, helpers type<->string, and factory create(). Currently create() returns Passthrough for Type::None; other types are left unimplemented.
- Add util/PassthroughBlobCodec.{h,cpp}: final class that performs no compression (passes bytes through) and checks expected decoded size on decode.
- Add src/private/ZstdBlobCodec.h/.cpp (private files added and wired into the application sources). Note: the added private files are included in the FileMenu population flow.
These changes prepare the codebase for future Zstd codec implementation and expose a codec factory for runtime selection. Passthrough provides a working baseline for none/no-compression scenarios.
Remove the old FileMenu GUI class and introduce ZstdBlobCodec implementing util::BlobCodec. Adds zstd-based encode/decode methods (using ZSTD_compressBound, ZSTD_compress, ZSTD_getFrameContentSize and ZSTD_decompress) with error handling and support for an adjustable compression level. Header updated to declare the codec class in mv::util and GUI-related includes/logic removed. Small API: getType(), getName(), encode(), decode(), setCompressionLevel(), getCompressionLevel().
Replace hardcoded BlobCodec creation with a thread-safe registry of factory functions. Add BlobCodec::registerCodec(Type, FactoryFunction) and change BlobCodec::create to return std::unique_ptr using the registered factories (stored in an anonymous namespace with a mutex). Update headers to declare FactoryFunction and forward-declare BlobCodec where needed, remove direct dependency on PassthroughBlobCodec, and extend rawDataToVariantMap to accept an optional BlobCodec* for encoding data blocks during serialization.
Change rawDataToVariantMap to accept a const BlobCodec* (header and implementation) for better const-correctness. Also apply minor whitespace/alignment cleanup in LinkedData.cpp and PointData.cpp. No functional behavior changes beyond the API const qualification.
Introduce a codec file-extension API to BlobCodec (pure virtual QString getFileExtension()) and add a default supportsInlineData() hook. Implement getFileExtension() for ZstdBlobCodec (".bin.zst") and PassthroughBlobCodec (".bin"). These changes allow callers to determine on-disk filename suffixes for blobs and to query whether a codec supports inline storage. Also include minor header/implementation declarations and a newline fix.
Expose a default BlobCodec for project serialization: add a forward declaration and pure-virtual getDefaultBlobCodec() to AbstractProjectManager and override it in ProjectManager. Implement getDefaultBlobCodec() to return a static ZstdBlobCodec instance (ProjectManager.cpp) and include the Zstd header. Adjust ZstdBlobCodec.h to use the mv::util::BlobCodec qualifier (remove the nested namespace wrapper). Also include a minor whitespace cleanup in Application.h.
Rename blob codec parameter to blobCodecOverride and fall back to the project's default BlobCodec when no override is provided. Persist the codec name in the variant map under "Codec" and use the codec's file extension when saving blocks to disk. Add a debug print in populateDataBufferFromVariantMap to log the codec if present. These changes make codec usage explicit, ensure saved block files use the correct extension, and retain codec metadata for deserialization.
Introduce BlobCodec::isRegistered(Type) to allow callers to query whether a factory is registered for a given codec type. The method is declared [[nodiscard]] with a brief doc comment and implemented with a std::scoped_lock on factoriesMutex to perform a thread-safe lookup. Also remove a Q_UNREACHABLE() from typeToString, leaving the existing fallback return to avoid triggering an assert/crash in builds.
Introduce overloads for BlobCodec::isRegistered(const QString&) and BlobCodec::create(const QString&) (implemented via typeFromString) and update BlobCodec.h with corresponding documentation. Update Serialization::populateDataBufferFromVariantMap to validate that a codec string is registered and throw a runtime_error if not, then create the codec instance when a "Codec" entry is present. Also include minor formatting/cleanup.
Add encodeToFile() and decodeFromFile() implementations and declarations on BlobCodec to support reading/writing encoded blobs to disk with error reporting. Update Serialization to fall back to a None codec when no Codec entry is present and adjust raw-data loading branch formatting. Register the Zstd codec in main() and include the new headers so the codec is available at runtime.
Refactor Serialization to perform blob encoding/decoding using QtConcurrent. Adds Encode/Decode job and result structs and a readBinaryFileToByteArray helper. rawDataToVariantMap now encodes blocks in parallel, stores encoded sizes, and writes encoded bytes to disk when requested (replaces qCompress usage with codec encoding and base64). populateDataBufferFromVariantMap decodes blocks in parallel, validates decoded sizes, and copies decoded data into the output buffer. Switches BlobCodec ownership to unique_ptr and improves error reporting. Also reduces DEFAULT_MAX_BLOCK_SIZE from max/2 to max/8.
…ltStudio/core into feature/revamp_archiving
Replace the previous blobCodec->encodeToFile call with saveRawDataToBinaryFile using result._encodedData.constData() and its size (cast to uint64_t). Removes a now-unused commented raw-save line and the prior encode error check, writing the already-encoded data directly to the target file.
Introduce direct-to-buffer decode APIs (BlobCodec::decodeTo, decodeFromFileTo) and implement them in BlobCodec.cpp to allow decoding into preallocated buffers. Refactor rawDataToVariantMap and populateDataBufferFromVariantMap to: create per-job codecs for thread-safety, use QtConcurrent for parallel encoding/decoding, store encoded blocks as files when requested (with UUID filenames), and improve error propagation. Change DEFAULT_MAX_BLOCK_SIZE to 4MB and adjust blob codec handling: register a Passthrough codec for Type::None, register Zstd codec with project-selected compression level at startup, and bump Zstd default compression level to 15. Also tweak ProjectManager to pass zero to archiver.compressDirectory, and add a couple of debug prints for thread counts.
Remove qDebug statements in Main.cpp that printed QThread::idealThreadCount and QThreadPool::globalInstance()->maxThreadCount to reduce noisy startup debug output.
Bump DEFAULT_MAX_BLOCK_SIZE in mv::util::Serialization.h from 4 MiB to 32 MiB. This raises the default allowed serialized block size to accommodate larger data chunks; review for memory and performance implications if needed.
Move PassthroughBlobCodec from util to private (new private/PassthroughBlobCodec.{h,cpp}), remove the old util implementation and headers, and update CMake lists accordingly. Make BlobCodec::decodeFromFile and decodeFromFileTo pure virtual and implement these file-based decode APIs for ZstdBlobCodec and the new private passthrough codec. Adjust includes in Main.cpp to the new private header. ProjectManager: extract project.json during open and comment out a decompression call. Serialization: stop rewriting the URI to a temporary path and keep the original URI string (previous behavior preserved in a commented line). These changes centralize the passthrough codec implementation, add file-decoding support, and update build/config and usage sites.
Introduce a codec factory/registry abstraction and UI settings for blob codecs. Adds BlobCodecFactory, CodecRegistry, CodecSettingsAction and concrete factories/settings for Zstd and Passthrough (new source/header files). Refactors BlobCodec to move registration/creation helpers into util/BlobCodecFactory.cpp and adds higher-level create/registry APIs. Update CMake lists to include new files and adapt Main, ProjectCompressionAction, and ProjectManager to use codec settings (removes the old compression level UI/logic and comments out related code). Minor fixes: ProjectMetaAction header/impl tweaks and added QCompleter member. This change centralizes codec creation and enables pluggable codec settings and factories.
Pass ConcurrencyMode::Sequential to rawDataToVariantMap calls and add minor debug/cleanup. Updated ClusterData::toVariantMap and Points::toVariantMap to call rawDataToVariantMap(..., nullptr, ConcurrencyMode::Sequential) for serial processing of raw buffers (indices, selection, dimension names, clusters). Removed a debug prettyPrintVariantMap call in ClusterData::fromVariantMap and added a qDebug log in Points::fromVariantMap. Also includes small whitespace/formatting cleanup.
Write the assembled hierarchy into the SerializationPlan's shared state instead of using an internal QVariant result. Remove the obsolete _result member and getResult() accessor from SerializationPlan. Update DataHierarchyManager to set (*toPlan.getSharedState())["Hierarchy"] and to return that map. In ProjectSaveWorkflow re-enable saveProjectMetaJson and add an archive QSyncTask (with exception handling) before finalize. These changes centralize serialization outputs in the shared state and simplify result handling.
Iterate dataset entries deterministically by sorting variant map keys instead of reconstructing via SortIndex; simplify populateDataHierarchy call to use Dataset<>. Adjust toVariantMap traversal to accept a sortIndex, assemble a datasetMap (setting Children and SortIndex) and return that map instead of mutating parentMap in place. Add a qDebug statement when assembling top-level items. Also remove a verbose print in TaskTreeSerializationPlanExecutor::execute. These changes make serialization ordering and map assembly explicit and deterministic.
Move temporary save directory ownership into ProjectSaveWorkflow (adds QTemporaryDir _temporaryDir, getTemporaryDir/getTemporaryDirPath) and remove temporary-dir fields from ProjectSaveContext. ProjectManager now records the workflow temporary dir path. Update setup/archive to use the workflow-owned temp dir. Improve data hierarchy loading by sorting dataset entries using their SortIndex (ascending) and simplify map assembly (remove debug/pretty-print). Add override specifier to getSerializationPlanExecutor. Also remove a warning log in Serialization::populateDataBufferFromVariantMap.
Comment out the call to setTemporaryDirPath in ProjectManager::saveProject so the temporary directory returned by ProjectSaveWorkflow is no longer applied. This change only removes the single assignment; other save workflow behavior and connections remain unchanged.
Uncomment setTemporaryDirPath when creating the ProjectSaveWorkflow and change the archive step to use mv::projects().getTemporaryDirPath(AbstractProjectManager::TemporaryDirType::Save) for compression. Add qDebug() statements in DataHierarchyManager (dataset loading) and ZstdBlobCodec (bytes read) to assist with debugging.
Remove the old SerializationScheduler and migrate serialization/decoding APIs to use SerializationPlan concurrency primitives. Deleted SerializationScheduler.{cpp,h} and removed them from CMake. Introduced SerializationPlan::ConcurrencyMode and updated Stage to carry concurrency mode; added helper stage adders and empty-stage guards. Updated util serialization APIs: rawDataToVariantMap and populateDataBufferFromVariantMap now use SerializationPlan::ConcurrencyMode; added decodeBlockFromFile and decodeBlockFromBase64, and refined DecodeBlockJob/DecodeBlockResult types and helpers in Serialization.h/.cpp. Updated callsites (PointData, ClusterData, Points, DatasetsLoadRecipeBuilder, SerializePlanWorkflow) to match the new signatures and removed legacy ConcurrencyMode arguments. Minor cleanups: removed a debug qDebug in ZstdBlobCodec and adjusted formatting/variable naming in Serialization.cpp.
Delete legacy private load contexts, recipe builders and related dataset load utilities, and update CMake sources list accordingly. Removed files include DataHierarchyLoadContext(.h/.cpp), DataHierarchyLoadRecipeBuilder(.h/.cpp), DataHierarchyLoadWorkflow(.h/.cpp), DatasetLoadContext(.h/.cpp), DatasetLoadRecipeFactory(.h/.cpp), DatasetsLoadContext(.h/.cpp), WorkspaceLoadContext(.h/.cpp) and WorkspaceLoadRecipeBuilder(.h/.cpp). The CMakeMvSourcesApplication.cmake was updated to remove the deleted headers/sources from PRIVATE_SERIALIZATION_HEADERS and PRIVATE_SERIALIZATION_SOURCES.
Removed an unused include from DataHierarchyManager.h to reduce header pollution. In Serialization.cpp, fixed decoding calls to pass decodeBlockJob._compressedSize (instead of _size) to the codec for both file and memory decode paths so the codec receives the correct compressed byte length and avoids incorrect reads.
Refactor and harden raw-data serialization/decoding and related callers. Key changes: - Serialization: introduce decodeDataBufferFromVariantMap(QByteArray&) and refactor populateDataBufferFromVariantMap to use it; decode functions now return decoded QByteArray results and validate block offsets/sizes (detect overlaps/gaps, bounds, mismatched sizes). Added DecodeBlockJob._size and adjusted DecodeBlockResult semantics. decodeBlockFromFile/decodeBlockFromBase64 signatures changed to accept a codec factory only. Updated Serialization.h accordingly. - Consumers: switch callers to the new API (ClusterData, PointData) and add explicit error handling when decoding fails. PointData now decodes into a QByteArray and copies into destination, logging failures. - Cluster serialization: removed/version-guarded QDataStream version header and simplified read/write path (suppressed debug prints). - DataHierarchyManager: change serialization plan stages (use Parallel via addStage and addSequentialStage for notifications) and add dataset change notifications after loading; silence some debug prints. - Serializable: reportSerializationError now logs a fallback qCritical() when no OperationContext is present. - Misc: remove/disable several debug QDataStream and event notifications to avoid noisy output. These changes improve safety of loading raw blobs from disk/inline data, enforce stricter consistency checks, and make failure modes explicit by throwing on decode errors.
Replace manual buffer population with decodeDataBufferFromVariantMap and wrap deserialization in try/catch to log failures instead of throwing. Sets QDataStream version and validates stream status after reading _clusters. Also removes large blocks of commented-out legacy code and dead DataHierarchyLoadWorkflow startup/cancellation code in DataHierarchyManager, cleaning up the loading path while preserving execution via the serialization plan executor.
Decouple workflows from QObject/signals and adjust serialization execution. - Removed QObject/Q_OBJECT usage and finished signal/emits from AbstractWorkflow, ProjectOpenWorkflow, ProjectSaveWorkflow and SerializePlanWorkflow; constructors no longer accept a parent QObject. - Commented out task/timer/modal UI handling in AbstractWorkflow and related finished/connect logic in ProjectManager to avoid relying on Qt signals for workflow completion. - Added virtual runWorkflowOnOwnerThread to AbstractSerializationPlanExecutor and implemented it in TaskTreeSerializationPlanExecutor; workflows are now created and started directly without a blocking QEventLoop (previous invoke/loop code commented as part of refactor). - Adjusted SerializePlanWorkflow and related callsites to use the new constructor signature (operationContext parameter repositioned). - Simplified serialization decode path in util::decodeDataBufferFromVariantMap (previous attempt to build a SerializationPlan for decode is commented out) and added operator== to DecodeBlockJob. - Minor: disabled unsafe memcpy in PointData::fromVariantMap and removed explicit parent task setup for DataHierarchy in Project::toVariantMap. This set of changes prepares the codebase for a non-Qt signal-based workflow coordination and non-blocking serialization execution; several legacy signal/loop usages are left commented for reference.
Refactor serialization/workflow subsystem to use WorkflowPlan and Workflow. - Add Workflow, WorkflowPlanExecutor and ProjectOpenWorkflowPlan (new files) and corresponding headers; update CMake to include new sources. - Remove legacy SerializePlanWorkflow, TaskTreeSerializationPlanExecutor and related headers/impls. - Rename AbstractWorkflow -> Workflow and adapt interfaces/implementations accordingly (util/*.h/cpp changes). - Update types across the codebase: AbstractProjectManager/ProjectManager/ProjectOpenContext/DataHierarchyManager/Serializable and other call sites now use Workflow, WorkflowPlan and AbstractWorkflowPlanExecutor instead of the old serialization plan types; ProjectManager now creates and executes a ProjectOpen workflow plan via the new executor. - Minor bugfix/style: re-enable decoded size check and memcpy formatting in PointData.cpp. - Add ProjectOpenContext temporary dir alias and other small adjustments to match the new workflow API. This change consolidates workflow execution under the new Workflow/WorkflowPlan API and removes the previous task-tree-based serialization workflow implementation.
After executing the project open workflow plan, set the ProjectManager state to Idle and emit the projectOpened(*_project) signal. This ensures listeners are notified and the internal state reflects that the open operation has completed.
Introduce per-stage execution APIs and implement parallel job execution. AbstractWorkflowPlanExecutor now declares runStage, runStageInSequence and runStageInParallel. WorkflowPlanExecutor implements these methods: runStage dispatches based on stage concurrency; runStageInSequence runs jobs serially; runStageInParallel dispatches jobs to QThreadPool via QtConcurrent, waits for completion and aggregates/rethrows the first exception. Cleanup and related changes: Workflow::start no longer directly iterated and ran jobs (preparing for the new executor-driven flow). WorkflowPlan::Stage accessor renamed from getMode to getConcurrencyMode and updated accordingly. Several header includes were adjusted/forward-declared to reduce coupling.
Replace Workflow::start() with beginRun() and add endRun() to start/stop an elapsed timer and emit a completion notification. Update Workflow constructor init order and add a QElapsedTimer member. Update WorkflowPlanExecutor to call beginRun()/endRun() around stage execution. Also change DataHierarchyManager to use a sequential "Load datasets" stage instead of a parallel stage.
Refactor workflow execution to return a concrete WorkflowResult and propagate it through the API. Key changes: - Introduced mv::util::WorkflowResult (renamed from WorkflowResultBase) and include it where needed. - AbstractWorkflowPlanExecutor::execute and WorkflowPlan::execute now return WorkflowResult; WorkflowPlanExecutor::execute returns the workflow result after running beginRun()/endRun(). - Workflow stores a WorkflowResult (including duration) and exposes getResult(); removed separate duration member and legacy callbacks. - Serialization decode path rewritten to build a WorkflowPlan for parallel block decoding; DecodeBlockJob now stores its DecodeBlockResult directly. - Updated usages to capture and use WorkflowResult (e.g. ProjectManager now reads duration to show notifications) and changed stage additions to use explicit concurrency mode. - Updated CMake sources/headers to refer to renamed WorkflowResult files. This change centralizes result/duration handling and lets callers receive execution outcomes directly from the executor.
Introduce a dedicated project save workflow and integrate it into the project flow. Added ProjectSaveWorkflowPlan.{h,cpp} and ProjectSaveContext.h to implement a multi-stage save plan (serialize project, meta, workspace, archive to temporary dir, finalize and update recent files). Updated CMake to include the new headers/sources. ProjectManager now uses createProjectSaveWorkflowPlan, executes it via the workflow executor, sets the temporary dir from the save context, and emits notifications on success.
Also: changed WorkflowContextBase from a class to a struct and switched ProjectOpen workflow/context handling to use shared_ptr contexts (adjusted ProjectOpenContext and ProjectOpenWorkflowPlan accordingly). Removed an empty enumerate stage from DataHierarchyManager, and applied minor formatting tweaks in PointData.
Initialize the _temporaryDirectory member in ProjectOpenContext's constructor by creating a QTemporaryDir at the application's temporary directory under an "OpenProject" subfolder (path cleaned with QDir::cleanPath). This ensures a dedicated temporary directory is available when opening a project.
Remove the Application::_serializationAborted member and its static accessor methods, and eliminate all uses and checks of that global flag throughout the codebase. Serialization routines (Serializable::fromJsonFile / toJsonFile and mv::util load/save raw binary helpers) no longer early-return based on a global abort flag. Calls that reset the flag (and a commented-out reset) in project/workspace workflow code were also removed. This cleans up global serialization state and delegates error control to local handling instead of a shared abort flag.
Introduce ProjectOpenParameters and ProjectSaveParameters structs in AbstractProjectManager with isValid() helpers and abstract getters (getProjectOpenParameters/getProjectSaveParameters). Implement getProjectSaveParameters in ProjectManager to encapsulate the save-file dialog and return the chosen path; saveProject() now uses these parameters. Move/adjust chooseProjectFileViaDialog visibility/signature and related declarations. Add CodecSettingsActionPtr typedef and modernize BlobCodec to accept/store the smart-pointer type, plus add handling for Type::Count in typeToString. Overall changes centralize dialog parameter handling and modernize codec action ownership.
Rework ProjectManager open/save logic: emit projectAboutToBeOpened earlier, use getProjectOpenParameters() for file selection (moved dialog logic into that function), and replace the old chooseProjectFileViaDialog API. Use qScopeGuard to ensure State is restored to Idle after open/save operations, set SavingProject state inside the save block, and switch to modal exec() for file dialogs. For save, set temporary dir from the workflow context, add explicit workflow error handling (throw on failure), and keep notification/logging on success. Remove the now-unused chooseProjectFileViaDialog declaration from the header. These changes improve state safety, error handling, and simplify dialog handling.
Delete the ScopedState RAII helper class from ManiVault/src/AbstractProjectManager.h. The removed nested class previously set the AbstractProjectManager state on construction, asserted a non-null project manager pointer, and reverted the state to State::Idle on destruction.
Include util/WorkflowPlan and add util::WorkflowPlan::ConcurrencyMode _concurrencyMode to ProjectOpenParameters and ProjectSaveParameters. This allows callers to specify sequential or parallel concurrency when opening or saving projects; comments and spacing were adjusted accordingly.
Initialize ProjectOpenParameters and ProjectSaveParameters defaults (file path = "", concurrency default = Parallel). Add a "Settings" vertical group in the Open and Save file dialogs that aggregates metadata fields and a new "Multi-threading" ToggleAction. Wire the toggle to set parameters._concurrencyMode (Parallel when checked, Sequential when unchecked) and update the dialog layouts to use the grouped settings widget. Also include small formatting/alignment fixes for parameter assignments.
Introduce a ProjectPublish workflow to handle opening/publishing project archives. Adds ProjectPublishContext (header + minimal implementation) and ProjectPublishWorkflowPlan (header + implementation) which create a temporary directory, extract project/workspace JSON from an archive, load project and workspace data, update contributors and recent projects, and manage cursor/cleanup. Also update CMakeMvSourcesApplication.cmake to include the new sources and headers.
Introduce ProjectPublishParameters and an isValid() check for save parameters, and add a virtual getProjectPublishParameters() to AbstractProjectManager. Implement getProjectPublishParameters() in ProjectManager and replace inlined file-dialog UI in publishProject/open/save flows with centralized dialog construction and a new addActionToFileDialog() helper. Also tighten publishProject state handling with a qScopeGuard, simplify Application cursor restore, and clean up variable naming and action wiring to reduce duplication and improve maintainability.
Rework file-dialog project settings UI and tweak some action popups. - Introduce projectSettingsAction (HorizontalGroupAction) and additionalProjectSettingsAction (VerticalGroupAction) to group title vs. other metadata (description, tags, comments, etc.) into a collapsible "additional" group for Open/Save/Publish dialogs. - Move description/tags/comments/related settings into the collapsed additional group and add that group under a compact projectSettingsAction; set show/label flags appropriately. - Add PopupSizeHint (QSize(400,0)) and ellipsis icon to additional groups and set a popup size for codec settings; keep existing publish settings popup sizing. - Replace manual QGridLayout widget insertion with a loop that calls addActionToFileDialog(...) for each settingsAction child to centralize insertion logic. - Add guard in ProjectManager::openProject to return early when filePath is empty to avoid opening an invalid project. - Minor whitespace fix in ProjectCompressionAction. These changes improve the organization and appearance of project settings in file dialogs and make popup sizing/placement more consistent.
Swap and enrich EncodeBlockJob/EncodeBlockResult definitions, add typed aliases (EncodeBlockJobs/EncodeBlockResults), and expand fields with clear comments. Replace the previous QVector-based synchronous encoding with a WorkflowPlan that runs per-block encode jobs (parallel stage), capturing results and errors into job results and then assembling the final blocks list with proper error propagation.
Introduce a set of workflow execution/reporting classes and wire them into CMake. Added WorkflowExecutionContext (with a thread_local current pointer), WorkflowExecutionScope (RAII scope for current context), WorkflowMessage, WorkflowProgressNode, WorkflowReportNode and WorkflowReporter, along with their source files. Updated CMakeMvSourcesPublic.cmake to expose the new headers/sources. Removed the old WorkflowRuntimeContext.h and repurposed/renamed its .cpp to WorkflowMessage.cpp.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request introduces significant infrastructure for codec and workflow support in ManiVault, along with integration of the Zstandard (zstd) compression library. Key changes include the addition of new codec and workflow classes, updates to the project manager interface for workflow handling, and the inclusion of zstd as an external dependency. Several obsolete serialization task references are removed, and new source/header files are registered in the build system.
Codec and Workflow Infrastructure:
BlobCodec,CodecRegistry,Workflow, and related factories and executors. These are registered in both the build system and theApplicationclass, which now provides access to a globalCodecRegistry. [1] [2] [3] [4] [5] [6]PassthroughBlobCodec,ZstdBlobCodec,WorkflowPlanExecutor, etc.) and registered them in the build system. [1] [2]Project Manager and Serialization Refactor:
AbstractProjectManagerto remove the oldProjectSerializationTaskand related methods, replacing them with an extensible workflow-based approach. Added new virtual methods for workflow access and management. [1] [2] [3] [4] [5] [6] [7]External Dependencies and Linking:
CPMAddPackage, and ensured static linking in the build system. [1] [2]TaskTreecomponent. [1] [2] [3]Actions and UI Integration:
These changes lay the groundwork for flexible, pluggable data codecs and workflow-driven project serialization, while modernizing the build and project management infrastructure.