root/include/crm/common/output_internal.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright 2019-2021 the Pacemaker project contributors
   3  *
   4  * The version control history for this file may have further details.
   5  *
   6  * This source code is licensed under the GNU Lesser General Public License
   7  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
   8  */
   9 
  10 #ifndef PCMK__OUTPUT_INTERNAL__H
  11 #  define PCMK__OUTPUT_INTERNAL__H
  12 
  13 #ifdef __cplusplus
  14 extern "C" {
  15 #endif
  16 
  17 /**
  18  * \file
  19  * \brief Formatted output for pacemaker tools
  20  */
  21 
  22 #  include <stdbool.h>
  23 #  include <stdio.h>
  24 #  include <libxml/tree.h>
  25 #  include <libxml/HTMLtree.h>
  26 
  27 #  include <glib.h>
  28 #  include <crm/common/results.h>
  29 
  30 #  define PCMK__API_VERSION "2.14"
  31 
  32 #if defined(PCMK__WITH_ATTRIBUTE_OUTPUT_ARGS)
  33 #  define PCMK__OUTPUT_ARGS(ARGS...) __attribute__((output_args(ARGS)))
  34 #else
  35 #  define PCMK__OUTPUT_ARGS(ARGS...)
  36 #endif
  37 
  38 typedef struct pcmk__output_s pcmk__output_t;
  39 
  40 /*!
  41  * \internal
  42  * \brief The type of a function that creates a ::pcmk__output_t.
  43  *
  44  * Instances of this type are passed to pcmk__register_format(), stored in an
  45  * internal data structure, and later accessed by pcmk__output_new().  For 
  46  * examples, see pcmk__mk_xml_output() and pcmk__mk_text_output().
  47  *
  48  * \param[in] argv The list of command line arguments.
  49  */
  50 typedef pcmk__output_t * (*pcmk__output_factory_t)(char **argv);
  51 
  52 /*!
  53  * \internal
  54  * \brief The type of a custom message formatting function.
  55  *
  56  * These functions are defined by various libraries to support formatting of
  57  * types aside from the basic types provided by a ::pcmk__output_t.
  58  *
  59  * The meaning of the return value will be different for each message.
  60  * In general, however, 0 should be returned on success and a positive value
  61  * on error.
  62  *
  63  * \note These functions must not call va_start or va_end - that is done
  64  *       automatically before the custom formatting function is called.
  65  */
  66 typedef int (*pcmk__message_fn_t)(pcmk__output_t *out, va_list args);
  67 
  68 /*!
  69  * \internal
  70  * \brief Internal type for tracking custom messages.
  71  *
  72  * Each library can register functions that format custom message types.  These
  73  * are commonly used to handle some library-specific type.  Registration is
  74  * done by first defining a table of ::pcmk__message_entry_t structures and
  75  * then passing that table to pcmk__register_messages().  Separate handlers
  76  * can be defined for the same message, but for different formats (xml vs.
  77  * text).  Unknown formats will be ignored.
  78  *
  79  * Additionally, a "default" value for fmt_table can be used.  In this case,
  80  * fn will be registered for all supported formats.  It is also possible to
  81  * register a default and then override that registration with a format-specific
  82  * function if necessary.
  83  *
  84  * \note The ::pcmk__message_entry_t table is processed in one pass, in order,
  85  * from top to bottom.  This means later entries with the same message_id will
  86  * override previous ones.  Thus, any default entry must come before any
  87  * format-specific entries for the same message_id.
  88  */
  89 typedef struct pcmk__message_entry_s {
  90     /*!
  91      * \brief The message to be handled.
  92      *
  93      * This must be the same ID that is passed to the message function of
  94      * a ::pcmk__output_t.  Unknown message IDs will be ignored.
  95      */
  96     const char *message_id;
  97 
  98     /*!
  99      * \brief The format type this handler is for.
 100      *
 101      * This name must match the fmt_name of the currently active formatter in
 102      * order for the registered function to be called.  It is valid to have
 103      * multiple entries for the same message_id but with different fmt_name
 104      * values.
 105      */
 106     const char *fmt_name;
 107 
 108     /*!
 109      * \brief The function to be called for message_id given a match on
 110      *        fmt_name.  See comments on ::pcmk__message_fn_t.
 111      */
 112     pcmk__message_fn_t fn;
 113 } pcmk__message_entry_t;
 114 
 115 /*!
 116  * \internal
 117  * \brief This structure contains everything needed to add support for a
 118  *        single output formatter to a command line program.
 119  */
 120 typedef struct pcmk__supported_format_s {
 121     /*!
 122      * \brief The name of this output formatter, which should match the
 123      *        fmt_name parameter in some ::pcmk__output_t structure.
 124      */
 125     const char *name;
 126 
 127     /*!
 128      * \brief A function that creates a ::pcmk__output_t.
 129      */
 130     pcmk__output_factory_t create;
 131 
 132     /*!
 133      * \brief Format-specific command line options.  This can be NULL if
 134      *        no command line options should be supported.
 135      */
 136     GOptionEntry *options;
 137 } pcmk__supported_format_t;
 138 
 139 /* The following three blocks need to be updated each time a new base formatter
 140  * is added.
 141  */
 142 
 143 extern GOptionEntry pcmk__html_output_entries[];
 144 extern GOptionEntry pcmk__log_output_entries[];
 145 extern GOptionEntry pcmk__none_output_entries[];
 146 extern GOptionEntry pcmk__text_output_entries[];
 147 extern GOptionEntry pcmk__xml_output_entries[];
 148 
 149 pcmk__output_t *pcmk__mk_html_output(char **argv);
 150 pcmk__output_t *pcmk__mk_log_output(char **argv);
 151 pcmk__output_t *pcmk__mk_none_output(char **argv);
 152 pcmk__output_t *pcmk__mk_text_output(char **argv);
 153 pcmk__output_t *pcmk__mk_xml_output(char **argv);
 154 
 155 #define PCMK__SUPPORTED_FORMAT_HTML { "html", pcmk__mk_html_output, pcmk__html_output_entries }
 156 #define PCMK__SUPPORTED_FORMAT_LOG  { "log", pcmk__mk_log_output, pcmk__log_output_entries }
 157 #define PCMK__SUPPORTED_FORMAT_NONE { "none", pcmk__mk_none_output, pcmk__none_output_entries }
 158 #define PCMK__SUPPORTED_FORMAT_TEXT { "text", pcmk__mk_text_output, pcmk__text_output_entries }
 159 #define PCMK__SUPPORTED_FORMAT_XML  { "xml", pcmk__mk_xml_output, pcmk__xml_output_entries }
 160 
 161 /*!
 162  * \brief This structure contains everything that makes up a single output
 163  *        formatter.
 164  *
 165  * Instances of this structure may be created by calling pcmk__output_new()
 166  * with the name of the desired formatter.  They should later be freed with
 167  * pcmk__output_free().
 168  */
 169 struct pcmk__output_s {
 170     /*!
 171      * \brief The name of this output formatter.
 172      */
 173     const char *fmt_name;
 174 
 175     /*!
 176      * \brief Should this formatter supress most output?
 177      *
 178      * \note This setting is not respected by all formatters.  In general,
 179      *       machine-readable output formats will not support this while
 180      *       user-oriented formats will.  Callers should use is_quiet()
 181      *       to test whether to print or not.
 182      */
 183     bool quiet;
 184 
 185     /*!
 186      * \brief A copy of the request that generated this output.
 187      *
 188      * In the case of command line usage, this would be the command line
 189      * arguments.  For other use cases, it could be different.
 190      */
 191     gchar *request;
 192 
 193     /*!
 194      * \brief Where output should be written.
 195      *
 196      * This could be a file handle, or stdout or stderr.  This is really only
 197      * useful internally.
 198      */
 199     FILE *dest;
 200 
 201     /*!
 202      * \brief Custom messages that are currently registered on this formatter.
 203      *
 204      * Keys are the string message IDs, values are ::pcmk__message_fn_t function
 205      * pointers.
 206      */
 207     GHashTable *messages;
 208 
 209     /*!
 210      * \brief Implementation-specific private data.
 211      *
 212      * Each individual formatter may have some private data useful in its
 213      * implementation.  This points to that data.  Callers should not rely on
 214      * its contents or structure.
 215      */
 216     void *priv;
 217 
 218     /*!
 219      * \internal
 220      * \brief Take whatever actions are necessary to prepare out for use.  This is
 221      *        called by pcmk__output_new().  End users should not need to call this.
 222      *
 223      * \note For formatted output implementers - This function should be written in
 224      *       such a way that it can be called repeatedly on an already initialized
 225      *       object without causing problems, or on a previously finished object
 226      *       without crashing.
 227      *
 228      * \param[in,out] out The output functions structure.
 229      *
 230      * \return true on success, false on error.
 231      */
 232     bool (*init) (pcmk__output_t *out);
 233 
 234     /*!
 235      * \internal
 236      * \brief Free the private formatter-specific data.
 237      *
 238      * This is called from pcmk__output_free() and does not typically need to be
 239      * called directly.
 240      *
 241      * \param[in,out] out The output functions structure.
 242      */
 243     void (*free_priv) (pcmk__output_t *out);
 244 
 245     /*!
 246      * \internal
 247      * \brief Take whatever actions are necessary to end formatted output.
 248      *
 249      * This could include flushing output to a file, but does not include freeing
 250      * anything.  The finish method can potentially be fairly complicated, adding
 251      * additional information to the internal data structures or doing whatever
 252      * else.  It is therefore suggested that finish only be called once.
 253      *
 254      * \note The print parameter will only affect those formatters that do all
 255      *       their output at the end.  Console-oriented formatters typically print
 256      *       a line at a time as they go, so this parameter will not affect them.
 257      *       Structured formatters will honor it, however.
 258      *
 259      * \note The copy_dest parameter does not apply to all formatters.  Console-
 260      *       oriented formatters do not build up a structure as they go, and thus
 261      *       do not have anything to return.  Structured formatters will honor it,
 262      *       however.  Note that each type of formatter will return a different
 263      *       type of value in this parameter.  To use this parameter, call this
 264      *       function like so:
 265      *
 266      * \code
 267      * xmlNode *dest = NULL;
 268      * out->finish(out, exit_code, false, (void **) &dest);
 269      * \endcode
 270      *
 271      * \param[in,out] out         The output functions structure.
 272      * \param[in]     exit_status The exit value of the whole program.
 273      * \param[in]     print       Whether this function should write any output.
 274      * \param[out]    copy_dest   A destination to store a copy of the internal
 275      *                            data structure for this output, or NULL if no
 276      *                            copy is required.  The caller should free this
 277      *                            memory when done with it.
 278      */
 279     void (*finish) (pcmk__output_t *out, crm_exit_t exit_status, bool print,
 280                     void **copy_dest);
 281 
 282     /*!
 283      * \internal
 284      * \brief Finalize output and then immediately set back up to start a new set
 285      *        of output.
 286      *
 287      * This is conceptually the same as calling finish and then init, though in
 288      * practice more be happening behind the scenes.
 289      *
 290      * \note This function differs from finish in that no exit_status is added.
 291      *       The idea is that the program is not shutting down, so there is not
 292      *       yet a final exit code.  Call finish on the last time through if this
 293      *       is needed.
 294      *
 295      * \param[in,out] out The output functions structure.
 296      */
 297     void (*reset) (pcmk__output_t *out);
 298 
 299     /*!
 300      * \internal
 301      * \brief Register a custom message.
 302      *
 303      * \param[in,out] out        The output functions structure.
 304      * \param[in]     message_id The name of the message to register.  This name
 305      *                           will be used as the message_id parameter to the
 306      *                           message function in order to call the custom
 307      *                           format function.
 308      * \param[in]     fn         The custom format function to call for message_id.
 309      */
 310     void (*register_message) (pcmk__output_t *out, const char *message_id,
 311                               pcmk__message_fn_t fn);
 312 
 313     /*!
 314      * \internal
 315      * \brief Call a previously registered custom message.
 316      *
 317      * \param[in,out] out        The output functions structure.
 318      * \param[in]     message_id The name of the message to call.  This name must
 319      *                           be the same as the message_id parameter of some
 320      *                           previous call to register_message.
 321      * \param[in] ...            Arguments to be passed to the registered function.
 322      *
 323      * \return A standard Pacemaker return code.  Generally: 0 if a function was
 324      *         registered for the message, that function was called, and returned
 325      *         successfully; EINVAL if no function was registered; or pcmk_rc_no_output
 326      *         if a function was called but produced no output.
 327      */
 328     int (*message) (pcmk__output_t *out, const char *message_id, ...);
 329 
 330     /*!
 331      * \internal
 332      * \brief Format the output of a completed subprocess.
 333      *
 334      * \param[in,out] out         The output functions structure.
 335      * \param[in]     exit_status The exit value of the subprocess.
 336      * \param[in]     proc_stdout stdout from the completed subprocess.
 337      * \param[in]     proc_stderr stderr from the completed subprocess.
 338      */
 339     void (*subprocess_output) (pcmk__output_t *out, int exit_status,
 340                                const char *proc_stdout, const char *proc_stderr);
 341 
 342     /*!
 343      * \internal
 344      * \brief Format version information.  This is useful for the --version
 345      *        argument of command line tools.
 346      *
 347      * \param[in,out] out      The output functions structure.
 348      * \param[in]     extended Add additional version information.
 349      */
 350     void (*version) (pcmk__output_t *out, bool extended);
 351 
 352     /*!
 353      * \internal
 354      * \brief Format an informational message that should be shown to
 355      *        to an interactive user.  Not all formatters will do this.
 356      *
 357      * \note A newline will automatically be added to the end of the format
 358      *       string, so callers should not include a newline.
 359      *
 360      * \param[in,out] out The output functions structure.
 361      * \param[in]     buf The message to be printed.
 362      * \param[in]     ... Arguments to be formatted.
 363      *
 364      * \return A standard Pacemaker return code.  Generally: pcmk_rc_ok
 365      *         if output was produced and pcmk_rc_no_output if it was not.
 366      *         As not all formatters implement this function, those that
 367      *         do not will always just return pcmk_rc_no_output.
 368      */
 369     int (*info) (pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 370 
 371     /*!
 372      * \internal
 373      * \brief Format an error message that should be shown to an interactive
 374      *        user.  Not all formatters will do this.
 375      *
 376      * \note A newline will automatically be added to the end of the format
 377      *       string, so callers should not include a newline.
 378      *
 379      * \param[in,out] out The output functions structure.
 380      * \param[in]     buf The message to be printed.
 381      * \param[in]     ... Arguments to be formatted.
 382      */
 383     void (*err) (pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 384 
 385     /*!
 386      * \internal
 387      * \brief Format already formatted XML.
 388      *
 389      * \param[in,out] out  The output functions structure.
 390      * \param[in]     name A name to associate with the XML.
 391      * \param[in]     buf  The XML in a string.
 392      */
 393     void (*output_xml) (pcmk__output_t *out, const char *name, const char *buf);
 394 
 395     /*!
 396      * \internal
 397      * \brief Start a new list of items.
 398      *
 399      * \note For text output, this corresponds to another level of indentation.  For
 400      *       XML output, this corresponds to wrapping any following output in another
 401      *       layer of tags.
 402      *
 403      * \note If singular_noun and plural_noun are non-NULL, calling end_list will
 404      *       result in a summary being added.
 405      *
 406      * \param[in,out] out           The output functions structure.
 407      * \param[in]     singular_noun When outputting the summary for a list with
 408      *                              one item, the noun to use.
 409      * \param[in]     plural_noun   When outputting the summary for a list with
 410      *                              more than one item, the noun to use.
 411      * \param[in]     format        The format string.
 412      * \param[in]     ...           Arguments to be formatted.
 413      */
 414     void (*begin_list) (pcmk__output_t *out, const char *singular_noun,
 415                         const char *plural_noun, const char *format, ...)
 416                         G_GNUC_PRINTF(4, 5);
 417 
 418     /*!
 419      * \internal
 420      * \brief Format a single item in a list.
 421      *
 422      * \param[in,out] out     The output functions structure.
 423      * \param[in]     name    A name to associate with this item.
 424      * \param[in]     format  The format string.
 425      * \param[in]     ...     Arguments to be formatted.
 426      */
 427     void (*list_item) (pcmk__output_t *out, const char *name, const char *format, ...)
 428                       G_GNUC_PRINTF(3, 4);
 429 
 430     /*!
 431      * \internal
 432      * \brief Increment the internal counter of the current list's length.
 433      *
 434      * Typically, this counter is maintained behind the scenes as a side effect
 435      * of calling list_item().  However, custom functions that maintain lists
 436      * some other way will need to manage this counter manually.  This is
 437      * useful for implementing custom message functions and should not be
 438      * needed otherwise.
 439      *
 440      * \param[in,out] out The output functions structure.
 441      */
 442     void (*increment_list) (pcmk__output_t *out);
 443 
 444     /*!
 445      * \internal
 446      * \brief Conclude a list.
 447      *
 448      * \note If begin_list was called with non-NULL for both the singular_noun
 449      *       and plural_noun arguments, this function will output a summary.
 450      *       Otherwise, no summary will be added.
 451      *
 452      * \param[in,out] out The output functions structure.
 453      */
 454     void (*end_list) (pcmk__output_t *out);
 455 
 456     /*!
 457      * \internal
 458      * \brief Should anything be printed to the user?
 459      *
 460      * \note This takes into account both the \p quiet value as well as the
 461      *       current formatter.
 462      *
 463      * \param[in] out The output functions structure.
 464      *
 465      * \return true if output should be supressed, false otherwise.
 466      */
 467     bool (*is_quiet) (pcmk__output_t *out);
 468 
 469     /*!
 470      * \internal
 471      * \brief Output a spacer.  Not all formatters will do this.
 472      *
 473      * \param[in] out The output functions structure.
 474      */
 475     void (*spacer) (pcmk__output_t *out);
 476 
 477     /*!
 478      * \internal
 479      * \brief Output a progress indicator.  This is likely only useful for
 480      *        plain text, console based formatters.
 481      *
 482      * \param[in] out The output functions structure.
 483      * \param[in] end If true, output a newline afterwards.  This should
 484      *                only be used the last time this function is called.
 485      *
 486      */
 487     void (*progress) (pcmk__output_t *out, bool end);
 488 
 489     /*!
 490      * \internal
 491      * \brief Prompt the user for input.  Not all formatters will do this.
 492      *
 493      * \note This function is part of pcmk__output_t, but unlike all other
 494      *       function it does not take that as an argument.  In general, a
 495      *       prompt will go directly to the screen and therefore bypass any
 496      *       need to use the formatted output code to decide where and how
 497      *       to display.
 498      *
 499      * \param[in]  prompt The prompt to display.  This is required.
 500      * \param[in]  echo   If true, echo the user's input to the screen.  Set
 501      *                    to false for password entry.
 502      * \param[out] dest   Where to store the user's response.  This is
 503      *                    required.
 504      */
 505     void (*prompt) (const char *prompt, bool echo, char **dest);
 506 };
 507 
 508 /*!
 509  * \internal
 510  * \brief Call a formatting function for a previously registered message.
 511  *
 512  * \note This function is for implementing custom formatters.  It should not
 513  *       be called directly.  Instead, call out->message.
 514  *
 515  * \param[in,out] out        The output functions structure.
 516  * \param[in]     message_id The message to be handled.  Unknown messages
 517  *                           will be ignored.
 518  * \param[in]     ...        Arguments to be passed to the registered function.
 519  */
 520 int
 521 pcmk__call_message(pcmk__output_t *out, const char *message_id, ...);
 522 
 523 /*!
 524  * \internal
 525  * \brief Free a ::pcmk__output_t structure that was previously created by
 526  *        pcmk__output_new().
 527  *
 528  * \note While the create and finish functions are designed in such a way that
 529  *       they can be called repeatedly, this function will completely free the
 530  *       memory of the object.  Once this function has been called, producing
 531  *       more output requires starting over from pcmk__output_new().
 532  *
 533  * \param[in,out] out         The output structure.
 534  */
 535 void pcmk__output_free(pcmk__output_t *out);
 536 
 537 /*!
 538  * \internal
 539  * \brief Create a new ::pcmk__output_t structure.
 540  *
 541  * \param[in,out] out      The destination of the new ::pcmk__output_t.
 542  * \param[in]     fmt_name How should output be formatted?
 543  * \param[in]     filename Where should formatted output be written to?  This
 544  *                         can be a filename (which will be overwritten if it
 545  *                         already exists), or NULL or "-" for stdout.  For no
 546  *                         output, pass a filename of "/dev/null".
 547  * \param[in]     argv     The list of command line arguments.
 548  *
 549  * \return Standard Pacemaker return code
 550  */
 551 int pcmk__output_new(pcmk__output_t **out, const char *fmt_name,
 552                      const char *filename, char **argv);
 553 
 554 /*!
 555  * \internal
 556  * \brief Register a new output formatter, making it available for use
 557  *        the same as a base formatter.
 558  *
 559  * \param[in,out] group   A ::GOptionGroup that formatted output related command
 560  *                        line arguments should be added to.  This can be NULL
 561  *                        for use outside of command line programs.
 562  * \param[in]     name    The name of the format.  This will be used to select a
 563  *                        format from command line options and for displaying help.
 564  * \param[in]     create  A function that creates a ::pcmk__output_t.
 565  * \param[in]     options Format-specific command line options.  These will be
 566  *                        added to the context.  This argument can also be NULL.
 567  *
 568  * \return 0 on success or an error code on error.
 569  */
 570 int
 571 pcmk__register_format(GOptionGroup *group, const char *name,
 572                       pcmk__output_factory_t create, GOptionEntry *options);
 573 
 574 /*!
 575  * \internal
 576  * \brief Register an entire table of output formatters at once.
 577  *
 578  * \param[in,out] group A ::GOptionGroup that formatted output related command
 579  *                      line arguments should be added to.  This can be NULL
 580  *                      for use outside of command line programs.
 581  * \param[in]     table An array of ::pcmk__supported_format_t which should
 582  *                      all be registered.  This array must be NULL-terminated.
 583  *
 584  */
 585 void
 586 pcmk__register_formats(GOptionGroup *group, pcmk__supported_format_t *table);
 587 
 588 /*!
 589  * \internal
 590  * \brief Unregister a previously registered table of custom formatting
 591  *        functions and destroy the internal data structures associated with them.
 592  */
 593 void
 594 pcmk__unregister_formats(void);
 595 
 596 /*!
 597  * \internal
 598  * \brief Register a function to handle a custom message.
 599  *
 600  * \note This function is for implementing custom formatters.  It should not
 601  *       be called directly.  Instead, call out->register_message.
 602  *
 603  * \param[in,out] out        The output functions structure.
 604  * \param[in]     message_id The message to be handled.
 605  * \param[in]     fn         The custom format function to call for message_id.
 606  */
 607 void
 608 pcmk__register_message(pcmk__output_t *out, const char *message_id,
 609                        pcmk__message_fn_t fn);
 610 
 611 /*!
 612  * \internal
 613  * \brief Register an entire table of custom formatting functions at once.
 614  *
 615  * This table can contain multiple formatting functions for the same message ID
 616  * if they are for different format types.
 617  *
 618  * \param[in,out] out   The output functions structure.
 619  * \param[in]     table An array of ::pcmk__message_entry_t values which should
 620  *                      all be registered.  This array must be NULL-terminated.
 621  */
 622 void
 623 pcmk__register_messages(pcmk__output_t *out, pcmk__message_entry_t *table);
 624 
 625 /* Functions that are useful for implementing custom message formatters */
 626 
 627 /*!
 628  * \internal
 629  * \brief A printf-like function.
 630  *
 631  * This function writes to out->dest and indents the text to the current level
 632  * of the text formatter's nesting.  This should be used when implementing
 633  * custom message functions instead of printf.
 634  *
 635  * \param[in,out] out The output functions structure.
 636  */
 637 void
 638 pcmk__indented_printf(pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 639 
 640 /*!
 641  * \internal
 642  * \brief A vprintf-like function.
 643  *
 644  * This function is like pcmk__indented_printf(), except it takes a va_list instead
 645  * of a list of arguments.  This should be used when implementing custom message
 646  * functions instead of vprintf.
 647  *
 648  * \param[in,out] out    The output functions structure.
 649  * \param[in]     format The format string.
 650  * \param[in]     args   A list of arguments to apply to the format string.
 651  */
 652 void
 653 pcmk__indented_vprintf(pcmk__output_t *out, const char *format, va_list args) G_GNUC_PRINTF(2, 0);
 654 
 655 
 656 /*!
 657  * \internal
 658  * \brief A printf-like function.
 659  *
 660  * This function writes to out->dest without indenting the text.  This should be
 661  * used with implementing custom message functions instead of printf.
 662  *
 663  * \param[in,out] out The output functions structure.
 664  */
 665 void
 666 pcmk__formatted_printf(pcmk__output_t *out, const char *format, ...) G_GNUC_PRINTF(2, 3);
 667 
 668 /*!
 669  * \internal
 670  * \brief A vprintf-like function.
 671  *
 672  * This function is like pcmk__formatted_printf(), except it takes a va_list instead
 673  * of a list of arguments.  This should be used when implementing custom message
 674  * functions instead of vprintf.
 675  *
 676  * \param[in,out] out    The output functions structure.
 677  * \param[in]     format The format string.
 678  * \param[in]     args   A list of arguments to apply to the format string.
 679  */
 680 void
 681 pcmk__formatted_vprintf(pcmk__output_t *out, const char *format, va_list args) G_GNUC_PRINTF(2, 0);
 682 
 683 /*!
 684  * \internal
 685  * \brief Prompt the user for input.
 686  *
 687  * \param[in]  prompt The prompt to display
 688  * \param[in]  echo   If true, echo the user's input to the screen.  Set
 689  *                    to false for password entry.
 690  * \param[out] dest   Where to store the user's response.
 691  */
 692 void
 693 pcmk__text_prompt(const char *prompt, bool echo, char **dest);
 694 
 695 /*!
 696  * \internal
 697  * \brief Set the log level used by the formatted output logger.
 698  *
 699  * \param[in,out] out       The output functions structure.
 700  * \param[in]     log_level The log level constant (LOG_INFO, LOG_ERR, etc.)
 701  *                          to use.
 702  *
 703  * \note By default, LOG_INFO is used.
 704  * \note Almost all formatted output messages will respect this setting.
 705  *       However, out->err will always log at LOG_ERR.
 706  */
 707 void
 708 pcmk__output_set_log_level(pcmk__output_t *out, int log_level);
 709 
 710 /*!
 711  * \internal
 712  * \brief Create and return a new XML node with the given name, as a child of the
 713  *        current list parent.  The new node is then added as the new list parent,
 714  *        meaning all subsequent nodes will be its children.  This is used when
 715  *        implementing custom functions.
 716  *
 717  * \param[in,out] out  The output functions structure.
 718  * \param[in]     name The name of the node to be created.
 719  * \param[in]     ...     Name/value pairs to set as XML properties.
 720  */
 721 xmlNodePtr
 722 pcmk__output_xml_create_parent(pcmk__output_t *out, const char *name, ...)
 723 G_GNUC_NULL_TERMINATED;
 724 
 725 /*!
 726  * \internal
 727  * \brief Add the given node as a child of the current list parent.  This is
 728  *        used when implementing custom message functions.
 729  *
 730  * \param[in,out] out  The output functions structure.
 731  * \param[in]     node An XML node to be added as a child.
 732  */
 733 void
 734 pcmk__output_xml_add_node(pcmk__output_t *out, xmlNodePtr node);
 735 
 736 /*!
 737  * \internal
 738  * \brief Create and return a new XML node with the given name, as a child of the
 739  *        current list parent.  This is used when implementing custom functions.
 740  *
 741  * \param[in,out] out  The output functions structure.
 742  * \param[in]     name The name of the node to be created.
 743  * \param[in]     ...     Name/value pairs to set as XML properties.
 744  */
 745 xmlNodePtr
 746 pcmk__output_create_xml_node(pcmk__output_t *out, const char *name, ...)
 747 G_GNUC_NULL_TERMINATED;
 748 
 749 /*!
 750  * \internal
 751  * \brief Like pcmk__output_create_xml_node(), but add the given text content to the
 752  *        new node.
 753  *
 754  * \param[in,out] out     The output functions structure.
 755  * \param[in]     name    The name of the node to be created.
 756  * \param[in]     content The text content of the node.
 757  */
 758 xmlNodePtr
 759 pcmk__output_create_xml_text_node(pcmk__output_t *out, const char *name, const char *content);
 760 
 761 /*!
 762  * \internal
 763  * \brief Push a parent XML node onto the stack.  This is used when implementing
 764  *        custom message functions.
 765  *
 766  * The XML output formatter maintains an internal stack to keep track of which nodes
 767  * are parents in order to build up the tree structure.  This function can be used
 768  * to temporarily push a new node onto the stack.  After calling this function, any
 769  * other formatting functions will have their nodes added as children of this new
 770  * parent.
 771  *
 772  * \param[in,out] out  The output functions structure.
 773  * \param[in]     node The node to be added/
 774  */
 775 void
 776 pcmk__output_xml_push_parent(pcmk__output_t *out, xmlNodePtr node);
 777 
 778 /*!
 779  * \internal
 780  * \brief Pop a parent XML node onto the stack.  This is used when implementing
 781  *        custom message functions.
 782  *
 783  * This function removes a parent node from the stack.  See pcmk__xml_push_parent()
 784  * for more details.
 785  *
 786  * \note Little checking is done with this function.  Be sure you only pop parents
 787  * that were previously pushed.  In general, it is best to keep the code between
 788  * push and pop simple.
 789  *
 790  * \param[in,out] out The output functions structure.
 791  */
 792 void
 793 pcmk__output_xml_pop_parent(pcmk__output_t *out);
 794 
 795 /*!
 796  * \internal
 797  * \brief Peek a parent XML node onto the stack.  This is used when implementing
 798  *        custom message functions.
 799  *
 800  * This function peeks a parent node on stack.  See pcmk__xml_push_parent()
 801  * for more details. It has no side-effect and can be called for an empty stack.
 802  *
 803  * \note Little checking is done with this function.
 804  *
 805  * \param[in,out] out The output functions structure.
 806  *
 807  * \return NULL if stack is empty, otherwise the parent of the stack.
 808  */
 809 xmlNodePtr
 810 pcmk__output_xml_peek_parent(pcmk__output_t *out);
 811 
 812 /*!
 813  * \internal
 814  * \brief Create a new XML node consisting of the provided text inside an HTML
 815  *        element node of the given name.
 816  *
 817  * \param[in,out] out          The output functions structure.
 818  * \param[in]     element_name The name of the new HTML element.
 819  * \param[in]     id           The CSS ID selector to apply to this element.
 820  *                             If NULL, no ID is added.
 821  * \param[in]     class_name   The CSS class selector to apply to this element.
 822  *                             If NULL, no class is added.
 823  * \param[in]     text         The text content of the node.
 824  */
 825 xmlNodePtr
 826 pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, const char *id,
 827                               const char *class_name, const char *text);
 828 
 829 /*!
 830  * \internal
 831  * \brief Add an HTML tag to the <head> section.
 832  *
 833  * The arguments after name are a NULL-terminated list of keys and values,
 834  * all of which will be added as attributes to the given tag.  For instance,
 835  * the following code would generate the tag "<meta http-equiv='refresh' content='19'>":
 836  *
 837  * \code
 838  * pcmk__html_add_header("meta", "http-equiv", "refresh", "content", "19", NULL);
 839  * \endcode
 840  *
 841  * \param[in]     name   The HTML tag for the new node.
 842  * \param[in]     ...    A NULL-terminated key/value list of attributes.
 843  */
 844 void
 845 pcmk__html_add_header(const char *name, ...)
 846 G_GNUC_NULL_TERMINATED;
 847 
 848 /*!
 849  * \internal
 850  * \brief Handle end-of-program error reporting
 851  *
 852  * \param[in,out] error A GError object potentially containing some error.
 853  *                      If NULL, do nothing.
 854  * \param[in]     out   The output functions structure.  If NULL, any errors
 855  *                      will simply be printed to stderr.
 856  */
 857 void pcmk__output_and_clear_error(GError *error, pcmk__output_t *out);
 858 
 859 #define PCMK__OUTPUT_SPACER_IF(out_obj, cond)   \
 860     if (cond) {                                 \
 861         out->spacer(out);                       \
 862     }
 863 
 864 #define PCMK__OUTPUT_LIST_HEADER(out_obj, cond, retcode, title...)  \
 865     if (retcode == pcmk_rc_no_output) {                             \
 866         PCMK__OUTPUT_SPACER_IF(out_obj, cond);                      \
 867         retcode = pcmk_rc_ok;                                       \
 868         out_obj->begin_list(out_obj, NULL, NULL, title);            \
 869     }
 870 
 871 #define PCMK__OUTPUT_LIST_FOOTER(out_obj, retcode)  \
 872     if (retcode == pcmk_rc_ok) {                    \
 873         out_obj->end_list(out_obj);                 \
 874     }
 875 
 876 #ifdef __cplusplus
 877 }
 878 #endif
 879 
 880 #endif

/* [previous][next][first][last][top][bottom][index][help] */