+ sr_resource_open_callback resource_open_cb;
+ sr_resource_close_callback resource_close_cb;
+ sr_resource_read_callback resource_read_cb;
+ void *resource_cb_data;
+};
+
+/** 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 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;
+ gboolean sdi_ready;
+ 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;
+
+ /**
+ * A NULL terminated array of strings containing a list of file name
+ * extensions typical for the input file format, or NULL if there is
+ * no typical extension for this file format.
+ */
+ const char *const *exts;
+
+ /**
+ * 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
+ *
+ * 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.
+ */
+ const 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 SR_OK This module knows the format.
+ * @retval SR_ERR_NA There wasn't enough data for this module to
+ * positively identify the format.
+ * @retval SR_ERR_DATA This module knows the format, but cannot handle it.
+ * This means the stream is either corrupt, or indicates a feature
+ * that the module does not support.
+ * @retval SR_ERR This module does not know the format.
+ */
+ int (*format_match) (GHashTable *metadata);
+
+ /**
+ * Initialize the input module.
+ *
+ * @retval SR_OK Success
+ * @retval other Negative error code.
+ */
+ int (*init) (struct sr_input *in, GHashTable *options);
+
+ /**
+ * Send data to the specified input instance.
+ *
+ * When an input module instance is created with sr_input_new(), this
+ * function is used to feed data to the instance.
+ *
+ * As enough data gets fed into this function to completely populate
+ * the device instance associated with this input instance, this is
+ * guaranteed to return the moment it's ready. This gives the caller
+ * the chance to examine the device instance, attach session callbacks
+ * and so on.
+ *
+ * @retval SR_OK Success
+ * @retval other Negative error code.
+ */
+ int (*receive) (struct sr_input *in, GString *buf);
+
+ /**
+ * Signal the input module no more data will come.
+ *
+ * This will cause the module to process any data it may have buffered.
+ * The SR_DF_END packet will also typically be sent at this time.
+ */
+ int (*end) (struct sr_input *in);
+
+ /**
+ * 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.
+ *
+ * This function is optional.
+ *
+ * @retval SR_OK Success
+ * @retval other Negative error code.
+ */
+ void (*cleanup) (struct sr_input *in);