commit before doing some hefty shapekey change, will break compilation
[blender-staging.git] / source / blender / blenlib / BLI_bfile.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (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  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2009 by Stichting Blender Foundation.
21  * All rights reserved.
22  *
23  * ***** END GPL LICENSE BLOCK *****
24  * BFILE* based abstraction of file access.
25  */
26
27 #ifndef BLI_BFILE_H
28 #define BLI_BFILE_H
29
30 /* For fopen's FILE */
31 #include <stdio.h>
32
33 /**
34  Defines for the bflags param.
35  */
36 /* Special handling: */
37 /* For "symmetry" of flags */
38 #define BFILE_NORMAL (0)
39 /* No supervision, just translate // if needed, RISKY */
40 #define BFILE_RAW    (1<<0)
41 /* Path is based in env vars specified by "envvars" */
42 #define BFILE_CONFIG (1<<1)
43 /* Path is for current session temp files */
44 #define BFILE_TEMP   (1<<2)
45
46 /* Config handling, special cases: */
47 #define BFILE_USERONLY (1<<3)
48 #define BFILE_SYSONLY  (1<<4)
49
50 /* Compression to apply on close: */
51 #define BFILE_GZIP (1<<5)
52
53 /**
54  For the envvars param.
55  */
56 typedef enum BEnvVarFamilies {
57         BENV_NONE,
58         BENV_BASE,
59         BENV_DATAFILES,
60         BENV_PYTHON,
61         BENV_PLUGINS
62 } BEnvVarFam;
63
64 /**
65  File descriptor for Blender abstracted file access.
66  */
67 typedef struct {
68         FILE *stream;
69         int fd;
70
71         /* Anything below should not be touched directly */
72         int uflags;       /* Special options requested by upper level, copy of bflags */
73         BEnvVarFam evars; /* What kind of file, describe the env vars to use */
74         char *fpath;      /* Final/requested path name */
75         char *tpath;      /* Temp path name if applicable */
76         int classf;       /* Own flags, common classification of open and fopen */
77         int error;        /* An op caused an error, unsafe to replace older files */
78 } BFILE;
79
80 /**
81  Open a BFILE* with fopen()-like syntax.
82  */
83 BFILE *BLI_bfile_fopen(const char *path, const char *mode, int bflags, BEnvVarFam envvars);
84
85 /**
86  Open a BFILE* with open()-like syntax.
87  */
88 BFILE *BLI_bfile_open(const char *pathname, int flags, int bflags, BEnvVarFam envvars);
89
90 /**
91  Get the FILE* associated with the BFILE*.
92  */
93 FILE *BLI_bfile_file_from_bfile(BFILE *bfile);
94
95 /**
96  Get the fd associated with the BFILE*.
97  */
98 int BLI_bfile_fd_from_bfile(BFILE *bfile);
99
100 /**
101  write()-like using BFILE*.
102  */
103 ssize_t BLI_bfile_write(BFILE *f, const void *buf, size_t count);
104
105 /**
106  read()-like using BFILE*.
107  */
108 ssize_t BLI_bfile_read(BFILE *f, void *buf, size_t count);
109
110 /**
111  fwrite()-like using BFILE*.
112  */
113 size_t BLI_bfile_fwrite(const void *ptr, size_t size, size_t nmemb, BFILE *f);
114
115 /**
116  fread()-like using BFILE*.
117  */
118 size_t BLI_bfile_fread(void *ptr, size_t size, size_t nmemb, BFILE *f);
119
120 /**
121  Close a BFILE, to match close() and fclose().
122  */
123 void BLI_bfile_close(BFILE *bfile);
124
125 /**
126  Clear error status.
127  Call it only if the error has been really handled.
128  */
129 void BLI_bfile_clear_error(BFILE *bfile);
130
131 /**
132  Set the error status.
133  Call it to mark writing by a 3rd party failed (libjpeg reported error, ie).
134  */
135 void BLI_bfile_set_error(BFILE *bfile, int error);
136
137 /*
138 TODO
139 Maybe also provide more OS/libc things like:
140 fflush
141 fprintf and related
142 fscanf
143 fgetc/fputc and related
144 fseek and related
145
146 Probably good to do:
147 readdir (compacted list showing all files for a "directory" (user versions on top of system's))
148 */
149
150 #endif /* ifndef BLI_BFILE_H */