xref: /freebsd/lib/libdpv/dpv.h (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1041394f3SDevin Teske /*-
2*1a5f047aSDevin Teske  * Copyright (c) 2013-2016 Devin Teske <dteske@FreeBSD.org>
3041394f3SDevin Teske  * All rights reserved.
4041394f3SDevin Teske  *
5041394f3SDevin Teske  * Redistribution and use in source and binary forms, with or without
6041394f3SDevin Teske  * modification, are permitted provided that the following conditions
7041394f3SDevin Teske  * are met:
8041394f3SDevin Teske  * 1. Redistributions of source code must retain the above copyright
9041394f3SDevin Teske  *    notice, this list of conditions and the following disclaimer.
10041394f3SDevin Teske  * 2. Redistributions in binary form must reproduce the above copyright
11041394f3SDevin Teske  *    notice, this list of conditions and the following disclaimer in the
12041394f3SDevin Teske  *    documentation and/or other materials provided with the distribution.
13041394f3SDevin Teske  *
14041394f3SDevin Teske  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15041394f3SDevin Teske  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16041394f3SDevin Teske  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17041394f3SDevin Teske  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18041394f3SDevin Teske  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19041394f3SDevin Teske  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20041394f3SDevin Teske  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21041394f3SDevin Teske  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22041394f3SDevin Teske  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23041394f3SDevin Teske  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24041394f3SDevin Teske  * SUCH DAMAGE.
25041394f3SDevin Teske  */
26041394f3SDevin Teske 
27041394f3SDevin Teske #ifndef _DPV_H_
28041394f3SDevin Teske #define _DPV_H_
29041394f3SDevin Teske 
30041394f3SDevin Teske #include <sys/types.h>
31041394f3SDevin Teske 
32041394f3SDevin Teske #ifndef TRUE
33041394f3SDevin Teske #define TRUE 1
34041394f3SDevin Teske #endif
35041394f3SDevin Teske #ifndef FALSE
36041394f3SDevin Teske #define FALSE 0
37041394f3SDevin Teske #endif
38041394f3SDevin Teske 
399e35cfceSDevin Teske /* localeconv(3) */
409e35cfceSDevin Teske #define LC_NUMERIC_DEFAULT	"en_US.ISO8859-1"
419e35cfceSDevin Teske 
42041394f3SDevin Teske /* Data to process */
43041394f3SDevin Teske extern long long dpv_overall_read;
44041394f3SDevin Teske 
45041394f3SDevin Teske /* Interrupt flag */
46041394f3SDevin Teske extern int dpv_interrupt;	/* Set to TRUE in interrupt handler */
47041394f3SDevin Teske extern int dpv_abort;		/* Set to true in callback to abort */
48041394f3SDevin Teske 
49041394f3SDevin Teske /*
50041394f3SDevin Teske  * Display types for use with display_type member of dpv_config structure
51041394f3SDevin Teske  */
52041394f3SDevin Teske enum dpv_display {
53041394f3SDevin Teske 	DPV_DISPLAY_LIBDIALOG = 0,	/* Display using dialog(3) (default) */
54041394f3SDevin Teske 	DPV_DISPLAY_STDOUT,		/* Display on stdout */
55041394f3SDevin Teske 	DPV_DISPLAY_DIALOG,		/* Display using spawned dialog(1) */
56041394f3SDevin Teske 	DPV_DISPLAY_XDIALOG,		/* Display using spawned Xdialog(1) */
57041394f3SDevin Teske };
58041394f3SDevin Teske 
59041394f3SDevin Teske /*
60041394f3SDevin Teske  * Output types for use with output_type member of dpv_config structure
61041394f3SDevin Teske  */
62041394f3SDevin Teske enum dpv_output {
63041394f3SDevin Teske 	DPV_OUTPUT_NONE = 0,	/* No output (default) */
64041394f3SDevin Teske 	DPV_OUTPUT_FILE,	/* Read `output' member as file path */
65041394f3SDevin Teske 	DPV_OUTPUT_SHELL,	/* Read `output' member as shell cmd */
66041394f3SDevin Teske };
67041394f3SDevin Teske 
68041394f3SDevin Teske /*
69041394f3SDevin Teske  * Activity types for use with status member of dpv_file_node structure.
70041394f3SDevin Teske  * If you set a status other than DPV_STATUS_RUNNING on the current file in the
71041394f3SDevin Teske  * action callback of dpv_config structure, you'll end callbacks for that
72041394f3SDevin Teske  * dpv_file_node.
73041394f3SDevin Teske  */
74041394f3SDevin Teske enum dpv_status {
75041394f3SDevin Teske 	DPV_STATUS_RUNNING = 0,	/* Running (default) */
76041394f3SDevin Teske 	DPV_STATUS_DONE,	/* Completed */
77041394f3SDevin Teske 	DPV_STATUS_FAILED,	/* Oops, something went wrong */
78041394f3SDevin Teske };
79041394f3SDevin Teske 
80041394f3SDevin Teske /*
81041394f3SDevin Teske  * Anatomy of file option; pass an array of these as dpv() file_list argument
82041394f3SDevin Teske  * terminated with a NULL pointer.
83041394f3SDevin Teske  */
84041394f3SDevin Teske struct dpv_file_node {
85041394f3SDevin Teske 	enum dpv_status		status; /* status of read operation */
86041394f3SDevin Teske 	char			*msg;	/* display instead of "Done/Fail" */
87041394f3SDevin Teske 	char			*name;	/* name of file to read */
88041394f3SDevin Teske 	char			*path;	/* path to file */
89041394f3SDevin Teske 	long long		length;	/* expected size */
90041394f3SDevin Teske 	long long		read;	/* number units read (e.g., bytes) */
91041394f3SDevin Teske 	struct dpv_file_node	*next;	/* pointer to next (end with NULL) */
92041394f3SDevin Teske };
93041394f3SDevin Teske 
94041394f3SDevin Teske /*
95041394f3SDevin Teske  * Anatomy of config option to pass as dpv() config argument
96041394f3SDevin Teske  */
97041394f3SDevin Teske struct dpv_config {
9880f7300dSDevin Teske 	uint8_t	keep_tite;		/* Prevent visually distracting exit */
99041394f3SDevin Teske 	enum dpv_display display_type;	/* Display (default TYPE_LIBDIALOG) */
100041394f3SDevin Teske 	enum dpv_output  output_type;	/* Output (default TYPE_NONE) */
101041394f3SDevin Teske 	int	debug;			/* Enable debugging output on stderr */
102041394f3SDevin Teske 	int	display_limit;		/* Files per `page'. Default -1 */
103041394f3SDevin Teske 	int	label_size;		/* Label size. Default 28 */
104041394f3SDevin Teske 	int	pbar_size;		/* Mini-progress size. See dpv(3) */
105041394f3SDevin Teske 	int	dialog_updates_per_second; /* Progress updates/s. Default 16 */
106041394f3SDevin Teske 	int	status_updates_per_second; /* dialog(3) status updates/second.
107041394f3SDevin Teske 	   	                            * Default 2 */
108041394f3SDevin Teske 	uint16_t options;	/* Special options. Default 0 */
109041394f3SDevin Teske 	char	*title;		/* widget title */
110041394f3SDevin Teske 	char	*backtitle;	/* Widget backtitle */
111041394f3SDevin Teske 	char	*aprompt;	/* Prompt append. Default NULL */
112041394f3SDevin Teske 	char	*pprompt;	/* Prompt prefix. Default NULL */
113041394f3SDevin Teske 	char	*msg_done;	/* Progress text. Default `Done' */
114041394f3SDevin Teske 	char	*msg_fail;	/* Progress text. Default `Fail' */
115041394f3SDevin Teske 	char	*msg_pending;	/* Progress text. Default `Pending' */
116041394f3SDevin Teske 	char	*output;	/* Output format string; see dpv(3) */
117041394f3SDevin Teske 	const char *status_solo; /* dialog(3) solo-status format.
118041394f3SDevin Teske 	                          * Default DPV_STATUS_SOLO */
119041394f3SDevin Teske 	const char *status_many; /* dialog(3) many-status format.
120041394f3SDevin Teske 	                          * Default DPV_STATUS_MANY */
121041394f3SDevin Teske 
122041394f3SDevin Teske 	/*
123041394f3SDevin Teske 	 * Function pointer; action to perform data transfer
124041394f3SDevin Teske 	 */
125041394f3SDevin Teske 	int (*action)(struct dpv_file_node *file, int out);
126041394f3SDevin Teske };
127041394f3SDevin Teske 
128041394f3SDevin Teske /*
129041394f3SDevin Teske  * Macros for dpv() options bitmask argument
130041394f3SDevin Teske  */
131041394f3SDevin Teske #define DPV_TEST_MODE		0x0001	/* Test mode (fake reading data) */
132041394f3SDevin Teske #define DPV_WIDE_MODE		0x0002	/* prefix/append bump dialog width */
133041394f3SDevin Teske #define DPV_NO_LABELS		0x0004	/* Hide file_node.name labels */
134041394f3SDevin Teske #define DPV_USE_COLOR		0x0008	/* Override to force color output */
135041394f3SDevin Teske #define DPV_NO_OVERRUN		0x0010	/* Stop transfers when they hit 100% */
136041394f3SDevin Teske 
137041394f3SDevin Teske /*
138041394f3SDevin Teske  * Limits (modify with extreme care)
139041394f3SDevin Teske  */
140041394f3SDevin Teske #define DPV_APROMPT_MAX		4096	/* Buffer size for `-a text' */
141041394f3SDevin Teske #define DPV_DISPLAY_LIMIT	10	/* Max file progress lines */
142041394f3SDevin Teske #define DPV_PPROMPT_MAX		4096	/* Buffer size for `-p text' */
143041394f3SDevin Teske #define DPV_STATUS_FORMAT_MAX	80	/* Buffer size for `-u format' */
144041394f3SDevin Teske 
145041394f3SDevin Teske /*
146041394f3SDevin Teske  * Extra display information
147041394f3SDevin Teske  */
148041394f3SDevin Teske #define DPV_STATUS_SOLO		"%'10lli bytes read @ %'9.1f bytes/sec."
149041394f3SDevin Teske #define DPV_STATUS_MANY		(DPV_STATUS_SOLO " [%i/%i busy/wait]")
150041394f3SDevin Teske 
151041394f3SDevin Teske /*
152041394f3SDevin Teske  * Strings
153041394f3SDevin Teske  */
154041394f3SDevin Teske #define DPV_DONE_DEFAULT	"Done"
155041394f3SDevin Teske #define DPV_FAIL_DEFAULT	"Fail"
156041394f3SDevin Teske #define DPV_PENDING_DEFAULT	"Pending"
157041394f3SDevin Teske 
158041394f3SDevin Teske __BEGIN_DECLS
159041394f3SDevin Teske void	dpv_free(void);
160041394f3SDevin Teske int	dpv(struct dpv_config *_config, struct dpv_file_node *_file_list);
161041394f3SDevin Teske __END_DECLS
162041394f3SDevin Teske 
163041394f3SDevin Teske #endif /* !_DPV_H_ */
164