/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2007, 2009, 2010, 2012, 2014 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#ifndef OUTPUT_DRIVER_PROVIDER_H
#define OUTPUT_DRIVER_PROVIDER_H 1
-#include <libpspp/compiler.h>
#include <stdbool.h>
-#include <output/driver.h>
+
+#include "data/settings.h"
+#include "libpspp/compiler.h"
+#include "output/driver.h"
struct output_item;
+struct output_iterator;
struct string_map;
+struct file_handle;
+struct page_setup;
/* A configured output driver. */
struct output_driver
{
const struct output_driver_class *class; /* Driver class. */
char *name; /* Name of this driver. */
- enum output_device_type device_type; /* One of OUTPUT_DEVICE_*. */
+ enum settings_output_devices device_type; /* One of SETTINGS_DEVICE_*. */
};
void output_driver_init (struct output_driver *,
const struct output_driver_class *,
- const char *name, enum output_device_type);
+ const char *, enum settings_output_devices);
+
void output_driver_destroy (struct output_driver *);
const char *output_driver_get_name (const struct output_driver *);
+char *output_driver_substitute_heading_vars (const char *, int page_number);
+
/* One kind of output driver.
Output driver implementations must not call msg() to report errors. This
with error(), which will never call into the output drivers. */
struct output_driver_class
{
- const char *name; /* Name of this driver class. */
-
- /* Creates a new output driver of this class. NAME and TYPE should be
- passed directly to output_driver_init. Returns the new output driver if
- successful, otherwise a null pointer.
-
- It is up to the driver class to decide how to interpret OPTIONS. The
- functions in output/options.h can be useful. OPTIONS may be modified
- but the caller is responsible for destroying it.
-
- The returned driver should not have been registered (with
- output_driver_register). The caller will register the driver (if this
- is desirable). */
- struct output_driver *(*create) (const char *name,
- enum output_device_type type,
- struct string_map *options);
+ /* Name of this driver class. */
+ const char *name;
/* Closes and frees DRIVER. */
void (*destroy) (struct output_driver *driver);
void (*submit) (struct output_driver *driver,
const struct output_item *item);
+ /* Changes DRIVER's output page setup to PS, if possible. This may be NUL
+ if the driver doesn't support page setup. */
+ void (*setup) (struct output_driver *driver, const struct page_setup *ps);
+
/* Ensures that any output items passed to the 'submit' function for DRIVER
have actually been displayed.
it doesn't make sense for DRIVER to be used this way, then this function
need not do anything. */
void (*flush) (struct output_driver *driver);
+
+ /* Ordinarily, the core driver code will skip passing hidden output items
+ to 'submit'. If this member is true, the core driver hands them to the
+ driver to let it handle them itself. */
+ bool handles_show;
+
+ /* Ordinarily, the core driver code will flatten groups of output items
+ before passing them to 'submit'. If this member is true, the core
+ driver code leaves them in place for the driver to handle. */
+ bool handles_groups;
};
-void output_driver_register (struct output_driver *);
-void output_driver_unregister (struct output_driver *);
-bool output_driver_is_registered (const struct output_driver *);
-
-/* Common drivers. */
-extern const struct output_driver_class ascii_class;
-extern const struct output_driver_class html_class;
-extern const struct output_driver_class odt_class;
-extern const struct output_driver_class csv_class;
-#ifdef HAVE_CAIRO
-extern const struct output_driver_class cairo_class;
-#endif
+/* An abstract way for the output subsystem to create an output driver. */
+struct output_driver_factory
+ {
+ /* The file extension, without the leading dot, e.g. "pdf". */
+ const char *extension;
+
+ /* The default file name, including extension.
+
+ If this is "-", that implies that by default output will be directed to
+ stdout. */
+ const char *default_file_name;
+
+ /* Creates a new output driver of this class. NAME and TYPE should be
+ passed directly to output_driver_init. Returns the new output driver if
+ successful, otherwise a null pointer.
+
+ It is up to the driver class to decide how to interpret OPTIONS. The
+ create function should delete pairs that it understands from OPTIONS,
+ because the caller may issue errors about unknown options for any pairs
+ that remain. The functions in output/options.h can be useful.
+
+ The returned driver should not have been registered (with
+ output_driver_register). The caller will register the driver (if this
+ is desirable). */
+ struct output_driver *(*create) (struct file_handle *,
+ enum settings_output_devices type,
+ struct string_map *options);
+ };
#endif /* output/driver-provider.h */