xref: /freebsd/lib/libdpv/dpv.h (revision 80f7300d7b70c869f82fe9df0b35807703914f5f)
1041394f3SDevin Teske /*-
2041394f3SDevin Teske  * Copyright (c) 2013-2014 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  * $FreeBSD$
27041394f3SDevin Teske  */
28041394f3SDevin Teske 
29041394f3SDevin Teske #ifndef _DPV_H_
30041394f3SDevin Teske #define _DPV_H_
31041394f3SDevin Teske 
32041394f3SDevin Teske #include <sys/types.h>
33041394f3SDevin Teske 
34041394f3SDevin Teske #ifndef TRUE
35041394f3SDevin Teske #define TRUE 1
36041394f3SDevin Teske #endif
37041394f3SDevin Teske #ifndef FALSE
38041394f3SDevin Teske #define FALSE 0
39041394f3SDevin Teske #endif
40041394f3SDevin Teske 
419e35cfceSDevin Teske /* localeconv(3) */
429e35cfceSDevin Teske #define LC_NUMERIC_DEFAULT	"en_US.ISO8859-1"
439e35cfceSDevin Teske 
44041394f3SDevin Teske /* Data to process */
45041394f3SDevin Teske extern long long dpv_overall_read;
46041394f3SDevin Teske 
47041394f3SDevin Teske /* Interrupt flag */
48041394f3SDevin Teske extern int dpv_interrupt;	/* Set to TRUE in interrupt handler */
49041394f3SDevin Teske extern int dpv_abort;		/* Set to true in callback to abort */
50041394f3SDevin Teske 
51041394f3SDevin Teske /*
52041394f3SDevin Teske  * Display types for use with display_type member of dpv_config structure
53041394f3SDevin Teske  */
54041394f3SDevin Teske enum dpv_display {
55041394f3SDevin Teske 	DPV_DISPLAY_LIBDIALOG = 0,	/* Display using dialog(3) (default) */
56041394f3SDevin Teske 	DPV_DISPLAY_STDOUT,		/* Display on stdout */
57041394f3SDevin Teske 	DPV_DISPLAY_DIALOG,		/* Display using spawned dialog(1) */
58041394f3SDevin Teske 	DPV_DISPLAY_XDIALOG,		/* Display using spawned Xdialog(1) */
59041394f3SDevin Teske };
60041394f3SDevin Teske 
61041394f3SDevin Teske /*
62041394f3SDevin Teske  * Output types for use with output_type member of dpv_config structure
63041394f3SDevin Teske  */
64041394f3SDevin Teske enum dpv_output {
65041394f3SDevin Teske 	DPV_OUTPUT_NONE = 0,	/* No output (default) */
66041394f3SDevin Teske 	DPV_OUTPUT_FILE,	/* Read `output' member as file path */
67041394f3SDevin Teske 	DPV_OUTPUT_SHELL,	/* Read `output' member as shell cmd */
68041394f3SDevin Teske };
69041394f3SDevin Teske 
70041394f3SDevin Teske /*
71041394f3SDevin Teske  * Activity types for use with status member of dpv_file_node structure.
72041394f3SDevin Teske  * If you set a status other than DPV_STATUS_RUNNING on the current file in the
73041394f3SDevin Teske  * action callback of dpv_config structure, you'll end callbacks for that
74041394f3SDevin Teske  * dpv_file_node.
75041394f3SDevin Teske  */
76041394f3SDevin Teske enum dpv_status {
77041394f3SDevin Teske 	DPV_STATUS_RUNNING = 0,	/* Running (default) */
78041394f3SDevin Teske 	DPV_STATUS_DONE,	/* Completed */
79041394f3SDevin Teske 	DPV_STATUS_FAILED,	/* Oops, something went wrong */
80041394f3SDevin Teske };
81041394f3SDevin Teske 
82041394f3SDevin Teske /*
83041394f3SDevin Teske  * Anatomy of file option; pass an array of these as dpv() file_list argument
84041394f3SDevin Teske  * terminated with a NULL pointer.
85041394f3SDevin Teske  */
86041394f3SDevin Teske struct dpv_file_node {
87041394f3SDevin Teske 	enum dpv_status		status; /* status of read operation */
88041394f3SDevin Teske 	char			*msg;	/* display instead of "Done/Fail" */
89041394f3SDevin Teske 	char			*name;	/* name of file to read */
90041394f3SDevin Teske 	char			*path;	/* path to file */
91041394f3SDevin Teske 	long long		length;	/* expected size */
92041394f3SDevin Teske 	long long		read;	/* number units read (e.g., bytes) */
93041394f3SDevin Teske 	struct dpv_file_node	*next;	/* pointer to next (end with NULL) */
94041394f3SDevin Teske };
95041394f3SDevin Teske 
96041394f3SDevin Teske /*
97041394f3SDevin Teske  * Anatomy of config option to pass as dpv() config argument
98041394f3SDevin Teske  */
99041394f3SDevin Teske struct dpv_config {
100*80f7300dSDevin Teske 	uint8_t	keep_tite;		/* Prevent visually distracting exit */
101041394f3SDevin Teske 	enum dpv_display display_type;	/* Display (default TYPE_LIBDIALOG) */
102041394f3SDevin Teske 	enum dpv_output  output_type;	/* Output (default TYPE_NONE) */
103041394f3SDevin Teske 	int	debug;			/* Enable debugging output on stderr */
104041394f3SDevin Teske 	int	display_limit;		/* Files per `page'. Default -1 */
105041394f3SDevin Teske 	int	label_size;		/* Label size. Default 28 */
106041394f3SDevin Teske 	int	pbar_size;		/* Mini-progress size. See dpv(3) */
107041394f3SDevin Teske 	int	dialog_updates_per_second; /* Progress updates/s. Default 16 */
108041394f3SDevin Teske 	int	status_updates_per_second; /* dialog(3) status updates/second.
109041394f3SDevin Teske 	   	                            * Default 2 */
110041394f3SDevin Teske 	uint16_t options;	/* Special options. Default 0 */
111041394f3SDevin Teske 	char	*title;		/* widget title */
112041394f3SDevin Teske 	char	*backtitle;	/* Widget backtitle */
113041394f3SDevin Teske 	char	*aprompt;	/* Prompt append. Default NULL */
114041394f3SDevin Teske 	char	*pprompt;	/* Prompt prefix. Default NULL */
115041394f3SDevin Teske 	char	*msg_done;	/* Progress text. Default `Done' */
116041394f3SDevin Teske 	char	*msg_fail;	/* Progress text. Default `Fail' */
117041394f3SDevin Teske 	char	*msg_pending;	/* Progress text. Default `Pending' */
118041394f3SDevin Teske 	char	*output;	/* Output format string; see dpv(3) */
119041394f3SDevin Teske 	const char *status_solo; /* dialog(3) solo-status format.
120041394f3SDevin Teske 	                          * Default DPV_STATUS_SOLO */
121041394f3SDevin Teske 	const char *status_many; /* dialog(3) many-status format.
122041394f3SDevin Teske 	                          * Default DPV_STATUS_MANY */
123041394f3SDevin Teske 
124041394f3SDevin Teske 	/*
125041394f3SDevin Teske 	 * Function pointer; action to perform data transfer
126041394f3SDevin Teske 	 */
127041394f3SDevin Teske 	int (*action)(struct dpv_file_node *file, int out);
128041394f3SDevin Teske };
129041394f3SDevin Teske 
130041394f3SDevin Teske /*
131041394f3SDevin Teske  * Macros for dpv() options bitmask argument
132041394f3SDevin Teske  */
133041394f3SDevin Teske #define DPV_TEST_MODE		0x0001	/* Test mode (fake reading data) */
134041394f3SDevin Teske #define DPV_WIDE_MODE		0x0002	/* prefix/append bump dialog width */
135041394f3SDevin Teske #define DPV_NO_LABELS		0x0004	/* Hide file_node.name labels */
136041394f3SDevin Teske #define DPV_USE_COLOR		0x0008	/* Override to force color output */
137041394f3SDevin Teske #define DPV_NO_OVERRUN		0x0010	/* Stop transfers when they hit 100% */
138041394f3SDevin Teske 
139041394f3SDevin Teske /*
140041394f3SDevin Teske  * Limits (modify with extreme care)
141041394f3SDevin Teske  */
142041394f3SDevin Teske #define DPV_APROMPT_MAX		4096	/* Buffer size for `-a text' */
143041394f3SDevin Teske #define DPV_DISPLAY_LIMIT	10	/* Max file progress lines */
144041394f3SDevin Teske #define DPV_PPROMPT_MAX		4096	/* Buffer size for `-p text' */
145041394f3SDevin Teske #define DPV_STATUS_FORMAT_MAX	80	/* Buffer size for `-u format' */
146041394f3SDevin Teske 
147041394f3SDevin Teske /*
148041394f3SDevin Teske  * Extra display information
149041394f3SDevin Teske  */
150041394f3SDevin Teske #define DPV_STATUS_SOLO		"%'10lli bytes read @ %'9.1f bytes/sec."
151041394f3SDevin Teske #define DPV_STATUS_MANY		(DPV_STATUS_SOLO " [%i/%i busy/wait]")
152041394f3SDevin Teske 
153041394f3SDevin Teske /*
154041394f3SDevin Teske  * Strings
155041394f3SDevin Teske  */
156041394f3SDevin Teske #define DPV_DONE_DEFAULT	"Done"
157041394f3SDevin Teske #define DPV_FAIL_DEFAULT	"Fail"
158041394f3SDevin Teske #define DPV_PENDING_DEFAULT	"Pending"
159041394f3SDevin Teske 
160041394f3SDevin Teske __BEGIN_DECLS
161041394f3SDevin Teske void	dpv_free(void);
162041394f3SDevin Teske int	dpv(struct dpv_config *_config, struct dpv_file_node *_file_list);
163041394f3SDevin Teske __END_DECLS
164041394f3SDevin Teske 
165041394f3SDevin Teske #endif /* !_DPV_H_ */
166