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.9"
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