GDTF Share catalog browser

The browser consumes only the documented GDTF Share getList.php catalog and existing authentication/download endpoints. Catalog browsing does not download, inspect, mutate, or publish GDTF/MVR resources.

Domain and cache

mvr/gdtf_catalog_parser preserves the official root timestamp as a scalar string and file size as optional bytes alongside existing revision, identity, source, creator, dates, rating, and mode/DMX footprint records. Numeric/string fields, null UUIDs, unavailable ratings, nested arrays, and legacy field aliases remain supported. Invalid/absent sizes stay absent. Rating text is preserved even when it is N/A; the Rating row stays visible, showing meaningful numeric values or -- for missing/unavailable ratings and empty selections.

core/gdtf_catalog_service owns validated cache snapshots. Cache version 2 keeps list_data and adds optional catalog_timestamp; older versions and files without this metadata remain readable, deriving the marker from the payload when present. The one-hour TTL measures local successful validation, separately from the upstream catalog marker. Unchanged refreshes still renew the TTL and persist the current marker, but retain existing payload/records. Fingerprint equality recognizes identical payloads; comparison of parsed public metadata recognizes equivalent JSON formatting/scalar representations. The marker alone never hides changed records. Reordered rows count as a change. Failed, empty, or unusable online responses do not overwrite the cache.

Opening and background ownership

gui/gdtf_share_download_workflow first obtains GetParsedCatalogSnapshot(). Usable caches open immediately without an online overlay or dialog reparse. Fresh caches supply no refresh callback. Stale caches supply the dialog's background callback; missing caches retain first-load sign-in/network handling.

The callback captures a credential value copy and creates its own GdtfShareClient and service on the worker. Its private cookie/session cannot race the UI-owned download client or workflow state. It invokes no GUI callbacks or credential prompts; failed background authentication preserves the cache. The worker returns service-parsed records through a wx thread event. The dialog joins the worker before destruction and applies results on the UI thread. Closing during refresh can wait for the existing bounded network timeouts. Download remains disabled during refresh; filters and pagination stay active. The independent download session may still need authentication after refresh.

Equivalent visible records update status/time only. Changed records rebuild the index and results once, restoring the selected RID and its page when it still matches the active filters. Removed/filtered selections clear details.

Search and presentation

core/gdtf_catalog_browser_model has no wxWidgets or network dependency. SearchIndex normalizes manufacturer, fixture, UUID, revision, and mode names once per displayed snapshot. General query tokens are whitespace-separated and conjunctive: every token must occur in a row, regardless of order. Dedicated manufacturer/fixture substring filters also apply conjunctively. ASCII case and punctuation normalization preserve existing filtering conventions; UTF-8 bytes are preserved, but non-ASCII case folding is not provided.

The same model formats file sizes and distinguishes meaningful rating text from missing/unavailable data. gui/gdtf_catalog_details_panel owns translated labels, selectable read-only UUID/RID fields, UTC date display, and the mode/footprint table. The list shows only Manufacturer, Fixture, Revision, Source, Last Modified, and GDTF Version. Source retains the API's Manuf./User value; Creator is the actual contributor username. Absent data uses a dash rather than default zero.

Regression checks

Targeted native tests are GdtfCatalogBrowserModel, GdtfCatalogCache, and GdtfCatalogDialog (requires a native GUI or Xvfb). The dialog regression exercises browsing during a paused refresh, changed/unchanged/failing refreshes, parsed snapshot reuse, selected RID/page retention, and Download gating. It also verifies that dialog destruction joins an active worker safely. GdtfCatalogBrowserBoundary and MainWindowGdtfDownloadBoundary protect domain, presentation, and orchestration ownership. Existing import-matching and GDTF Share security regressions protect the adjacent consumers and session contract.

Catalog storage and legacy migration use the persistent cache service.

Back to top