WinComm/forms/formsrv.h
Scott Duensing 17394e4f5d Replace form store with stream-from-disk and dynamic form IDs
Form IDs were baked into .form files at conversion time, preventing a
form from being displayed more than once.  dfm2form now writes a
placeholder ID (0), and formServerSendForm streams the file directly
from disk, assigning a unique ID on the fly via rewriteFormId.  This
eliminates formServerLoadFile, the in-memory form store, and the -i
flag from dfm2form.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 19:14:36 -06:00

80 lines
3.1 KiB
C

// formsrv.h - Remote forms server library
//
// Streams .form files from disk to a remote client via a transport
// interface, assigning dynamic form IDs. Receives EVENT messages from
// the client and dispatches them to a callback.
#ifndef FORMSRV_H
#define FORMSRV_H
#include <stdint.h>
#include <stdbool.h>
// ---------------------------------------------------------------------------
// Transport interface
// ---------------------------------------------------------------------------
typedef struct {
// Read a complete message into buf. Returns bytes read, 0 if no
// message is available. Must not block.
int (*readMessage)(char *buf, int32_t maxLen, void *ctx);
// Write a null-terminated message string. Transport adds framing
// (e.g., CR+LF for serial).
void (*writeMessage)(const char *buf, void *ctx);
// Opaque context pointer passed to readMessage/writeMessage.
void *ctx;
} FormTransportT;
// ---------------------------------------------------------------------------
// Event callback
// ---------------------------------------------------------------------------
typedef void (*EventCallbackT)(int32_t formId, int32_t ctrlId,
const char *eventName, const char *data,
void *userData);
// ---------------------------------------------------------------------------
// Server handle (opaque)
// ---------------------------------------------------------------------------
typedef struct FormServerS FormServerT;
// ---------------------------------------------------------------------------
// API
// ---------------------------------------------------------------------------
FormServerT *formServerCreate(FormTransportT *transport);
void formServerDestroy(FormServerT *server);
// Stream a .form file to the client, assigning a dynamic form ID.
// Returns the assigned form ID, or -1 on error.
int32_t formServerSendForm(FormServerT *server, const char *path);
// Send FORM.SHOW / FORM.HIDE / FORM.DESTROY commands.
void formServerShowForm(FormServerT *server, int32_t formId);
void formServerHideForm(FormServerT *server, int32_t formId);
void formServerDestroyForm(FormServerT *server, int32_t formId);
// Send a CTRL.SET command to update a property on a control.
void formServerSetProp(FormServerT *server, int32_t formId,
int32_t ctrlId, const char *prop,
const char *value);
// Send an EVENT.BIND command.
void formServerBindEvent(FormServerT *server, int32_t formId,
int32_t ctrlId, const char *eventName);
// Send an EVENT.UNBIND command.
void formServerUnbindEvent(FormServerT *server, int32_t formId,
int32_t ctrlId, const char *eventName);
// Set the callback for incoming events.
void formServerSetEventCallback(FormServerT *server,
EventCallbackT cb, void *userData);
// Poll for one incoming event. Returns true if an event was processed.
bool formServerPollEvent(FormServerT *server);
#endif // FORMSRV_H