X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Flibsigrok-internal.h;h=89cfb599c950d9dca6c483a79d9ca24b55ae0caa;hb=b84cba4dbf2a78806848f9dbaf10238a18daf735;hp=63fcff919c93f8c2c8455f44d084533aae1a9bba;hpb=950043c30ecd2a0d1d15a14f0d07f29b06157fc6;p=libsigrok.git diff --git a/src/libsigrok-internal.h b/src/libsigrok-internal.h index 63fcff91..89cfb599 100644 --- a/src/libsigrok-internal.h +++ b/src/libsigrok-internal.h @@ -143,6 +143,15 @@ libusb_handle_events_timeout(ctx, tv) #endif +/* Static definitions of structs ending with an all-zero entry are a + * problem when compiling with -Wmissing-field-initializers: GCC + * suppresses the warning only with { 0 }, clang wants { } */ +#ifdef __clang__ +#define ALL_ZERO { } +#else +#define ALL_ZERO { 0 } +#endif + struct sr_context { #ifdef HAVE_LIBUSB_1_0 libusb_context *libusb_ctx; @@ -159,6 +168,132 @@ struct sr_context { #endif }; +/** Input module metadata keys. */ +enum sr_input_meta_keys { + /** The input filename, if there is one. */ + SR_INPUT_META_FILENAME = 0x01, + /** The input file's size in bytes. */ + SR_INPUT_META_FILESIZE = 0x02, + /** The first 128 bytes of the file, provided as a GString. */ + SR_INPUT_META_HEADER = 0x04, + /** The file's MIME type. */ + SR_INPUT_META_MIMETYPE = 0x08, + + /** The module cannot identify a file without this metadata. */ + SR_INPUT_META_REQUIRED = 0x80, +}; + +/** Input (file) module struct. */ +struct sr_input { + /** + * A pointer to this input module's 'struct sr_input_module'. + */ + const struct sr_input_module *module; + GString *buf; + struct sr_dev_inst *sdi; + void *priv; +}; + +/** Input (file) module driver. */ +struct sr_input_module { + /** + * A unique ID for this input module, suitable for use in command-line + * clients, [a-z0-9-]. Must not be NULL. + */ + const char *id; + + /** + * A unique name for this input module, suitable for use in GUI + * clients, can contain UTF-8. Must not be NULL. + */ + const char *name; + + /** + * A short description of the input module. Must not be NULL. + * + * This can be displayed by frontends, e.g. when selecting the input + * module for saving a file. + */ + const char *desc; + + /** + * Zero-terminated list of metadata items the module needs to be able + * to identify an input stream. Can be all-zero, if the module cannot + * identify streams at all, i.e. has to be forced into use. + * + * Each item is one of: + * SR_INPUT_META_FILENAME + * SR_INPUT_META_FILESIZE + * SR_INPUT_META_HEADER + * SR_INPUT_META_MIMETYPE + * + * If the high bit (SR_INPUT META_REQUIRED) is set, the module cannot + * identify a stream without the given metadata. + */ + const uint8_t metadata[8]; + + /** + * Returns a NULL-terminated list of options this module can take. + * Can be NULL, if the module has no options. + */ + struct sr_option *(*options) (void); + + /** + * Check if this input module can load and parse the specified stream. + * + * @param[in] metadata Metadata the module can use to identify the stream. + * + * @retval TRUE This module knows the format. + * @retval FALSE This module does not know the format. + */ + int (*format_match) (GHashTable *metadata); + + /** + * Initialize the input module. + * + * @param in A pointer to a valid 'struct sr_input' that the caller + * has to allocate and provide to this function. It is also + * the responsibility of the caller to free it later. + * @param[in] filename The name (and path) of the file to use. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*init) (struct sr_input *in, GHashTable *options); + + /** + * Load a file, parsing the input according to the file's format. + * + * This function will send datafeed packets to the session bus, so + * the calling frontend must have registered its session callbacks + * beforehand. + * + * The packet types sent across the session bus by this function must + * include at least SR_DF_HEADER, SR_DF_END, and an appropriate data + * type such as SR_DF_LOGIC. It may also send a SR_DF_TRIGGER packet + * if appropriate. + * + * @param in A pointer to a valid 'struct sr_input' that the caller + * has to allocate and provide to this function. It is also + * the responsibility of the caller to free it later. + * @param f The name (and path) of the file to use. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*receive) (const struct sr_input *in, GString *buf); + + /** + * This function is called after the caller is finished using + * the input module, and can be used to free any internal + * resources the module may keep. + * + * @retval SR_OK Success + * @retval other Negative error code. + */ + int (*cleanup) (struct sr_input *in); +}; + /** Output module instance. */ struct sr_output { /** A pointer to this output's module. */ @@ -205,11 +340,8 @@ struct sr_output_module { /** * Returns a NULL-terminated list of options this module can take. * Can be NULL, if the module has no options. - * - * If cached is TRUE, no new GVariants are created for the def and - * values fields; instead, the current values are returned. */ - struct sr_option *(*options) (void); + const struct sr_option *(*options) (void); /** * This function is called once, at the beginning of an output stream.