1 /*
2  * This file is part of uudeview, the simple and friendly multi-part multi-
3  * file uudecoder  program  (c) 1994-2001 by Frank Pilhofer. The author may
4  * be contacted at fp@fpx.de
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16 
17 #ifndef __UUDEVIEW_H__
18 #define __UUDEVIEW_H__
19 
20 /*
21  * This include file features all the definitions that should
22  * be externally visible. This isn't much.
23  *
24  * $Id: uudeview.h,v 1.18 2003/09/29 23:27:47 fp Exp $
25  */
26 
27 #ifndef _ANSI_ARGS_
28 #ifdef PROTOTYPES
29 #define _ANSI_ARGS_(c)	c
30 #else
31 #define _ANSI_ARGS_(c)	()
32 #endif
33 #endif
34 
35 /*
36  * Message Types
37  */
38 
39 #define UUMSG_MESSAGE	(0)	/* just a message, nothing important */
40 #define UUMSG_NOTE	(1)	/* something that should be noticed */
41 #define UUMSG_WARNING	(2)	/* important msg, processing continues */
42 #define UUMSG_ERROR	(3)	/* processing has been terminated */
43 #define UUMSG_FATAL	(4)	/* decoder cannot process further requests */
44 #define UUMSG_PANIC	(5)	/* recovery impossible, app must terminate */
45 
46 /*
47  * Return Values
48  */
49 
50 #define UURET_OK	(0)	/* everything went fine */
51 #define UURET_IOERR	(1)	/* I/O Error - examine errno */
52 #define UURET_NOMEM	(2)	/* not enough memory */
53 #define UURET_ILLVAL	(3)	/* illegal value for operation */
54 #define UURET_NODATA	(4)	/* decoder didn't find any data */
55 #define UURET_NOEND	(5)	/* encoded data wasn't ended properly */
56 #define UURET_UNSUP	(6)	/* unsupported function (encoding) */
57 #define UURET_EXISTS	(7)	/* file exists (decoding) */
58 #define UURET_CONT	(8)	/* continue -- special from ScanPart */
59 #define UURET_CANCEL	(9)	/* operation canceled */
60 
61 /*
62  * File states, may be OR'ed
63  */
64 
65 #define UUFILE_READ	(0)	/* Read in, but not further processed */
66 #define UUFILE_MISPART	(1)	/* Missing Part(s) detected */
67 #define UUFILE_NOBEGIN	(2)	/* No 'begin' found */
68 #define UUFILE_NOEND	(4)	/* No 'end' found */
69 #define UUFILE_NODATA	(8)	/* File does not contain valid uudata */
70 #define UUFILE_OK	(16)	/* All Parts found, ready to decode */
71 #define UUFILE_ERROR	(32)	/* Error while decoding */
72 #define UUFILE_DECODED	(64)	/* Successfully decoded */
73 #define UUFILE_TMPFILE	(128)	/* Temporary decoded file exists */
74 
75 /*
76  * Encoding Types
77  */
78 
79 #define UU_ENCODED	(1)	/* UUencoded data   */
80 #define B64ENCODED	(2)	/* Mime-Base64 data */
81 #define XX_ENCODED	(3)	/* XXencoded data   */
82 #define BH_ENCODED	(4)	/* Binhex encoded   */
83 #define PT_ENCODED	(5)	/* Plain-Text encoded (MIME) */
84 #define QP_ENCODED	(6)	/* Quoted-Printable (MIME)   */
85 #define YENC_ENCODED	(7)	/* yEnc encoded */
86 
87 /*
88  * Option indices for GetOption / SetOption
89  */
90 
91 #define UUOPT_VERSION	(0)	/* version number MAJOR.MINORplPATCH (ro) */
92 #define UUOPT_FAST	(1)	/* assumes only one part per file */
93 #define UUOPT_DUMBNESS	(2)	/* switch off the program's intelligence */
94 #define UUOPT_BRACKPOL	(3)	/* give numbers in [] higher precendence */
95 #define UUOPT_VERBOSE	(4)	/* generate informative messages */
96 #define UUOPT_DESPERATE	(5)	/* try to decode incomplete files */
97 #define UUOPT_IGNREPLY	(6)	/* ignore RE:plies (off by default) */
98 #define UUOPT_OVERWRITE	(7)	/* whether it's OK to overwrite ex. files */
99 #define UUOPT_SAVEPATH	(8)	/* prefix to save-files on disk */
100 #define UUOPT_IGNMODE	(9)	/* ignore the original file mode */
101 #define UUOPT_DEBUG	(10)	/* print messages with FILE/LINE info */
102 #define UUOPT_ERRNO	(14)	/* get last error code for UURET_IOERR (ro) */
103 #define UUOPT_PROGRESS	(15)	/* retrieve progress information */
104 #define UUOPT_USETEXT	(16)	/* handle text messages */
105 #define UUOPT_PREAMB	(17)	/* handle Mime preambles/epilogues */
106 #define UUOPT_TINYB64	(18)	/* detect short B64 outside of Mime */
107 #define UUOPT_ENCEXT	(19)	/* extension for single-part encoded files */
108 #define UUOPT_REMOVE    (20)    /* remove input files after decoding */
109 #define UUOPT_MOREMIME  (21)    /* strict MIME adherence */
110 
111 /*
112  * Code for the "action" in the progress structure
113  */
114 
115 #define UUACT_IDLE	(0)	/* we don't do anything */
116 #define UUACT_SCANNING	(1)	/* scanning an input file */
117 #define UUACT_DECODING	(2)	/* decoding into a temp file */
118 #define UUACT_COPYING	(3)	/* copying temp to target */
119 #define UUACT_ENCODING	(4)	/* encoding a file */
120 
121 /*
122  * forward definition
123  */
124 
125 struct _uufile;
126 
127 /*
128  * Structure for holding the list of files that have been found
129  * uufile items are inserted into this list with UUInsertPartToList
130  * After inserting a bunch of files, UUCheckGlobalList must be called
131  * to update the states.
132  */
133 
134 typedef struct _uulist {
135   short    state;		/* Status as described by the macros above */
136   short    mode;		/* file mode as found on begin line        */
137 
138   int      begin;		/* part number where begin was detected    */
139   int      end;			/* part number where end was detected      */
140 
141   short    uudet;		/* Encoding type (see macros above)        */
142   int      flags;		/* flags, especially for single-part files */
143 
144   long     size;		/* approximate size of resulting file      */
145   char    *filename;		/* malloc'ed file name                     */
146   char    *subfname;		/* malloc'ed ID from subject line          */
147   char    *mimeid;		/* malloc'ed MIME-ID, if available         */
148   char    *mimetype;		/* malloc'ed Content-Type, if available    */
149 
150   char    *binfile;		/* name of temp file, if already decoded   */
151 
152   struct _uufile *thisfile;	/* linked list of this file's parts        */
153 
154   int     *haveparts;		/* the parts we have (max. 256 are listed) */
155   int     *misparts;		/* list of missing parts (max. 256)        */
156 
157   struct _uulist *NEXT;		/* next item of the list                   */
158   struct _uulist *PREV;		/* previous item of the list               */
159 } uulist;
160 
161 /*
162  * The "progress" structure which is passed to the Busy Callback
163  */
164 
165 typedef struct {
166   int  action;			/* see UUACT_* definitions above           */
167   char curfile[256];		/* the file we are working on, incl. path  */
168   int  partno;			/* part we're currently decoding           */
169   int  numparts;		/* total number of parts of this file      */
170   long fsize;			/* size of the current file                */
171   int  percent;			/* % of _current part_                     */
172   long foffset;			/* file offset -- internal use only        */
173   long totsize;			/* file total size -- internal use only    */
174 } uuprogress;
175 
176 
177 /*
178  * Externally visible Functions
179  */
180 
181 #ifndef UUEXPORT
182 #define UUEXPORT
183 #endif
184 
185 #ifdef __cplusplus
186 extern "C" {
187 #endif
188 
189 int	UUEXPORT UUInitialize		_ANSI_ARGS_((void));
190 int	UUEXPORT UUGetOption		_ANSI_ARGS_((int, int *, char *, int));
191 int	UUEXPORT UUSetOption		_ANSI_ARGS_((int, int, char *));
192 char *	UUEXPORT UUstrerror		_ANSI_ARGS_((int));
193 int	UUEXPORT UUSetMsgCallback	_ANSI_ARGS_((void *,
194 						     void (*) (void *,
195 							       char *,
196 							       int)));
197 int	UUEXPORT UUSetBusyCallback	_ANSI_ARGS_((void *,
198 						     int (*) (void *,
199 							      uuprogress *),
200 						     long));
201 int	UUEXPORT UUSetFileCallback	_ANSI_ARGS_((void *,
202 						     int (*) (void *, char *,
203 							      char *, int)));
204 int	UUEXPORT UUSetFNameFilter	_ANSI_ARGS_((void *,
205 						     char * (*) (void *,
206 								 char *)));
207 char *	UUEXPORT UUFNameFilter		_ANSI_ARGS_((char *));
208 int	UUEXPORT UULoadFile		_ANSI_ARGS_((char *, char *, int));
209 int	UUEXPORT UULoadFileWithPartNo	_ANSI_ARGS_((char *, char *, int, int));
210 uulist *UUEXPORT UUGetFileListItem	_ANSI_ARGS_((int));
211 int	UUEXPORT UURenameFile		_ANSI_ARGS_((uulist *, char *));
212 int	UUEXPORT UUDecodeToTemp		_ANSI_ARGS_((uulist *));
213 int	UUEXPORT UURemoveTemp		_ANSI_ARGS_((uulist *));
214 int	UUEXPORT UUDecodeFile		_ANSI_ARGS_((uulist *, char *));
215 int	UUEXPORT UUInfoFile		_ANSI_ARGS_((uulist *, void *,
216 						     int (*) (void *,
217 							      char *)));
218 int	UUEXPORT UUSmerge		_ANSI_ARGS_((int));
219 int	UUEXPORT UUCleanUp		_ANSI_ARGS_((void));
220 
221 int	UUEXPORT UUQuickDecode		_ANSI_ARGS_((FILE *, FILE *,
222 						     char *, long));
223 
224 int	UUEXPORT UUEncodeMulti		_ANSI_ARGS_((FILE *, FILE *,
225 						     char *, int,
226 						     char *, char *, int));
227 int	UUEXPORT UUEncodePartial	_ANSI_ARGS_((FILE *, FILE *,
228 						     char *, int,
229 						     char *, char *,
230 						     int, int, long,
231 						     unsigned long*));
232 int	UUEXPORT UUEncodeToStream	_ANSI_ARGS_((FILE *, FILE *,
233 						     char *, int,
234 						     char *, int));
235 int	UUEXPORT UUEncodeToFile		_ANSI_ARGS_((FILE *, char *, int,
236 						     char *, char *, long));
237 int	UUEXPORT UUE_PrepSingle		_ANSI_ARGS_((FILE *, FILE *,
238 						     char *, int,
239 						     char *, int,
240 						     char *, char *,
241 						     char *, int));
242 int	UUEXPORT UUE_PrepPartial	_ANSI_ARGS_((FILE *, FILE *,
243 						     char *, int,
244 						     char *, int,
245 						     int, long, long, char *,
246 						     char *, char *, int));
247 
248 int	UUEXPORT UUE_PrepSingleExt	_ANSI_ARGS_((FILE *, FILE *,
249 						     char *, int,
250 						     char *, int,
251 						     char *, char *,
252 						     char *, char *,
253 						     int));
254 int	UUEXPORT UUE_PrepPartialExt	_ANSI_ARGS_((FILE *, FILE *,
255 						     char *, int,
256 						     char *, int,
257 						     int, long, long, char *,
258 						     char *, char *, char *,
259 						     int));
260 #ifdef __cplusplus
261 }
262 #endif
263 #endif
264