2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/CFile/cfile.h $
15 * <insert description of file here>
18 * Revision 1.4 2004/07/04 11:26:21 taylor
19 * cleanup CFILE code a little, warning fixes, remove redundant dir checks
21 * Revision 1.3 2003/02/20 17:41:07 theoddone33
22 * Userdir patch from Taylor Richards
24 * Revision 1.2 2002/06/09 04:41:12 relnev
25 * added copyright header
27 * Revision 1.1.1.1 2002/05/03 03:28:11 root
31 * 11 9/08/99 12:03a Dave
32 * Make squad logos render properly in D3D all the time. Added intel anim
35 * 10 8/31/99 9:46a Dave
36 * Support for new cfile cbanims directory.
38 * 9 5/19/99 4:07p Dave
39 * Moved versioning code into a nice isolated common place. Fixed up
40 * updating code on the pxo screen. Fixed several stub problems.
42 * 8 3/28/99 5:58p Dave
43 * Added early demo code. Make objects move. Nice and framerate
44 * independant, but not much else. Don't use yet unless you're me :)
46 * 7 3/24/99 4:05p Dave
47 * Put in support for assigning the player to a specific squadron with a
48 * specific logo. Preliminary work for doing pos/orient checksumming in
49 * multiplayer to reduce bandwidth.
51 * 6 1/12/99 3:15a Dave
52 * Barracks screen support for selecting squad logos. We need real artwork
55 * 5 10/29/98 10:41a Dave
56 * Change the way cfile initializes exe directory.
58 * 4 10/13/98 9:19a Andsager
59 * Add localization support to cfile. Optional parameter with cfopen that
60 * looks for localized files.
62 * 3 10/12/98 9:54a Dave
63 * Fixed a few file organization things.
65 * 2 10/07/98 10:52a Dave
68 * 1 10/07/98 10:48a Dave
70 * 84 9/09/98 5:53p Dave
71 * Put in new tracker packets in API. Change cfile to be able to checksum
74 * 83 8/12/98 4:53p Dave
75 * Put in 32 bit checksumming for PXO missions. No validation on the
76 * actual tracker yet, though.
78 * 82 5/19/98 1:19p Allender
79 * new low level reliable socket reading code. Make all missions/campaign
80 * load/save to data missions folder (i.e. we are rid of the player
83 * 81 5/13/98 10:22p John
84 * Added cfile functions to read/write rle compressed blocks of data.
85 * Made palman use it for .clr files. Made alphacolors calculate on the
86 * fly rather than caching to/from disk.
88 * 80 5/01/98 10:21a John
89 * Added code to find all pack files in all trees. Added code to create
90 * any directories that we write to.
92 * 79 4/30/98 10:29p John
93 * Added code to refresh filelist if cd-rom changed or packfiles created
96 * 78 4/30/98 10:06p John
97 * Started adding code for splitting the maps data tree for hardware
100 * 77 4/30/98 9:43p John
101 * Restructured some stuff.
103 * 76 4/30/98 8:23p John
104 * Fixed some bugs with Fred caused by my new cfile code.
106 * 75 4/30/98 4:53p John
107 * Restructured and cleaned up cfile code. Added capability to read off
108 * of CD-ROM drive and out of multiple pack files.
110 * 74 4/20/98 6:04p Dave
111 * Implement multidata cache flushing and xferring mission files to
112 * multidata. Make sure observers can't change hud config. Fix pilot image
113 * viewing in popup. Put in game status field. Tweaked multi options.
115 * 73 4/01/98 6:06p Hoffoss
116 * Added a command briefing directory for those voice files.
118 * 72 3/31/98 4:51p Dave
119 * Removed medals screen and multiplayer buttons from demo version. Put in
120 * new pilot popup screen. Make ships in mp team vs. team have proper team
121 * ids. Make mp respawns a permanent option saved in the player file.
123 * 71 3/26/98 6:01p Dave
124 * Put in file checksumming routine in cfile. Made pilot pic xferring more
125 * robust. Cut header size of voice data packets in half. Put in
126 * restricted game host query system.
128 * 70 3/10/98 2:27p Hoffoss
129 * Added change directory with history stack functions, so you can switch
130 * to a new directory, do something, and restore to what it was. useful
133 * 69 3/07/98 3:48p Lawrance
134 * get save game working, allow restore from main menu
136 * 68 2/26/98 10:07p Hoffoss
137 * Rewrote state saving and restoring to fix bugs and simplify the code.
139 * 67 2/20/98 4:43p Dave
140 * Finished support for multiplayer player data files. Split off
141 * multiplayer campaign functionality.
143 * 66 2/19/98 6:26p Dave
144 * Fixed a few file xfer bugs. Tweaked mp team select screen. Put in
145 * initial support for player data uploading.
147 * 65 2/06/98 3:47p Allender
148 * subtitling for movies
150 * 64 2/05/98 10:15p Lawrance
151 * Add support for .svg filenames.
153 * 63 1/12/98 10:07p Hoffoss
154 * Made tab cycle properly in debriefing screen and put in aux. pilot
157 * 62 1/11/98 2:45p John
158 * Changed .lst to .clt
160 * 61 1/11/98 2:14p John
161 * Changed a lot of stuff that had to do with bitmap loading. Made cfile
162 * not do callbacks, I put that in global code. Made only bitmaps that
163 * need to load for a level load.
165 * 60 1/02/98 4:41p Allender
166 * added new mission folder for "player" missions
168 * 59 12/28/97 12:42p John
169 * Put in support for reading archive files; Made missionload use the
170 * cf_get_file_list function. Moved demos directory out of data tree.
172 * 58 12/17/97 10:16p Allender
173 * implemented a "no callback" flag to tell the cfile code not to use the
174 * cf_callback on files which specify this flag
176 * 57 12/08/97 6:23p Lawrance
179 * 56 12/07/97 4:30p John
180 * Fixed bug with cfile versioning if two files use it at once. Added
181 * code to cfile so I could display a loading box while loading.
183 * 55 11/24/97 9:28a Hoffoss
184 * Moved define of CF_TYPE_MULTI_PLAYERS so it's in order. I started to
185 * add it because I couldn't find it, so that's indication enough it
188 * 54 11/20/97 1:07a Lawrance
189 * add support for voice/debriefings directory
191 * 53 11/19/97 7:27p Hoffoss
192 * Added version checking read functions.
194 * 52 11/18/97 10:53a Hoffoss
196 * 51 11/17/97 6:07p Hoffoss
197 * Make get_file_list() allow filtering via a callback function.
199 * 50 11/16/97 2:29p John
200 * added versioning to nebulas; put nebula code into freespace.
202 * 49 11/15/97 6:10p Lawrance
203 * add in support for new voice directories
205 * 48 11/11/97 4:54p Dave
206 * Put in support for single vs. multiplayer pilots. Put in initial player
207 * selection screen (no command line option yet). Started work on
208 * multiplayer campaign file save gaming.
210 * 47 11/07/97 4:00p Hoffoss
211 * Capitalized directory names, changed the player/image directory to work
212 * like the rest, and forced the player/images directory to be created.
214 * 46 11/06/97 5:38p Hoffoss
215 * Added a new player image directory and added support for it.
217 * 45 11/04/97 7:46p Lawrance
218 * Add support for data\interface\HUD directory
220 * 44 10/29/97 6:22p Hoffoss
221 * Added some new file listing functions.
223 * 43 10/28/97 10:54a Lawrance
224 * support for 8b22k and 16b11k directories under the sound directory
226 * 42 10/14/97 11:34p Lawrance
227 * add function to get full path for a given filename
229 * 41 9/24/97 5:30p Lawrance
230 * add directory for voices
232 * 40 9/20/97 8:16a John
233 * Made .clr files go into the Cache directory. Replaced cfopen(name,NULL)
234 * to delete a file with cf_delete.
236 * 39 9/09/97 6:50p Hoffoss
237 * Fixed bug with mission saving.
239 * 38 9/05/97 4:52p Lawrance
240 * fix prototype for cfread_angles() and cfwrite_angles()
242 * 37 8/29/97 4:47p Dave
243 * Added an extension for state transfer status files.
245 * 36 8/21/97 12:14p Dave
246 * Changed demo file extension from .keg to .fsd
248 * 35 8/19/97 5:51p Hoffoss
249 * Fixes to cfopen to not check the default directory first, but check it
250 * last. Also tracks info as to where a file is located when opened.
252 * 34 8/17/97 10:22p Hoffoss
253 * Fixed several bugs in Fred with Undo feature. In the process, recoded
254 * a lot of CFile.cpp.
256 * 33 8/17/97 12:47p Hoffoss
257 * Changed code so I can force missions to load from the missions
258 * directory regardless of it's extension.
260 * 32 8/13/97 1:39p Adam
261 * make .ani files available in the data/effects directory
263 * 31 8/13/97 12:24p Lawrance
264 * Add support for effects directory
266 * 30 7/30/97 5:23p Dave
267 * Added file extensions for demo stuff
269 * 29 7/28/97 10:42p Lawrance
270 * added ctmpfile(), analog to tmpfile()
272 * 28 7/16/97 5:29p John
273 * added palette table caching and made scaler and liner no light tmapper
274 * do alpha blending in 8 bpp mode.
276 * 27 6/05/97 4:53p John
277 * First rev of new antialiased font stuff.
279 * 26 6/05/97 1:22p Allender
280 * added .ntl as an extension for nettest program
282 * 25 4/25/97 11:31a Allender
283 * Campaign state now saved in campaign save file in player directory.
284 * Made some global variables follow naming convention. Solidified
285 * continuing campaigns based on new structure
287 * 24 4/17/97 9:01p Allender
288 * start of campaign stuff. Campaigns now stored in external file (no
289 * filenames in code). Continuing campaign won't work at this point
291 * 23 4/03/97 4:26p Lawrance
292 * adding .wav search to music directory
294 * 22 4/01/97 9:26a Allender
295 * added support for descent style fonts although they are not used in the
298 * 21 3/04/97 8:17a John
299 * Fixed movie code to not require a file handle. Used CFILE instead.
300 * Took cfile_get_handle or whatever out.
302 * 20 3/03/97 8:57a Lawrance
303 * took out cf_returnfp()
305 * 19 3/01/97 2:09p Lawrance
306 * supporting memory mapped files, moved cfile implementation details into
309 * 18 2/17/97 3:00p Lawrance
310 * added .ani type to MAPS_EXT and INTERFACE_EXT
312 * 17 2/07/97 9:00a Lawrance
313 * added cfread_uint() and cwrite_uint()
315 * 16 2/04/97 9:29a Allender
316 * added cfwrite* functions
318 * 15 1/22/97 10:48a Lawrance
319 * supporting AVI playback
321 * 14 12/23/96 10:56a John
322 * Totally restructured the POF stuff to support multiple
323 * detail levels in one POF file.
326 * 13 11/20/96 10:00a Hoffoss
327 * Added cfile_chdir() function.
329 * 12 11/13/96 10:14a Allender
330 * added small routines to read basic data types. Also changed code to
331 * try to find extensions in more than 1 directory.
333 * 11 11/11/96 3:21p Allender
334 * added extension for movies
345 // same thing that's in FS2_Open (credit: Mike Harris)
347 #define DIR_SEPARATOR_CHAR '/'
348 #define DIR_SEPARATOR_STR "/"
350 #define DIR_SEPARATOR_CHAR '\\'
351 #define DIR_SEPARATOR_STR "\\"
356 #define CF_SEEK_SET (0)
357 #define CF_SEEK_CUR (1)
358 #define CF_SEEK_END (2)
360 typedef struct CFILE {
361 int id; // Index into cfile.cpp specific structure
362 int version; // version of this file
365 // extra info that can be returned when getting a file listing
371 #define CF_MAX_FILENAME_LENGTH 32 // Includes null terminater, so real length is 31
372 #define CF_MAX_PATHNAME_LENGTH 256 // Includes null terminater, so real length is 255
374 #define CF_TYPE_ANY -1 // Used to check in any directory
376 #define CF_TYPE_INVALID 0
377 #define CF_TYPE_ROOT 1 // Root must be 1!!
378 #define CF_TYPE_DATA 2
379 #define CF_TYPE_MAPS 3
380 #define CF_TYPE_TEXT 4
381 #define CF_TYPE_MISSIONS 5
382 #define CF_TYPE_MODELS 6
383 #define CF_TYPE_TABLES 7
384 #define CF_TYPE_SOUNDS 8
385 #define CF_TYPE_SOUNDS_8B22K 9
386 #define CF_TYPE_SOUNDS_16B11K 10
387 #define CF_TYPE_VOICE 11
388 #define CF_TYPE_VOICE_BRIEFINGS 12
389 #define CF_TYPE_VOICE_CMD_BRIEF 13
390 #define CF_TYPE_VOICE_DEBRIEFINGS 14
391 #define CF_TYPE_VOICE_PERSONAS 15
392 #define CF_TYPE_VOICE_SPECIAL 16
393 #define CF_TYPE_VOICE_TRAINING 17
394 #define CF_TYPE_MUSIC 18
395 #define CF_TYPE_MOVIES 19
396 #define CF_TYPE_INTERFACE 20
397 #define CF_TYPE_FONT 21
398 #define CF_TYPE_EFFECTS 22
399 #define CF_TYPE_HUD 23
400 #define CF_TYPE_PLAYER_MAIN 24
401 #define CF_TYPE_PLAYER_IMAGES_MAIN 25
402 #define CF_TYPE_CACHE 26
403 #define CF_TYPE_PLAYERS 27
404 #define CF_TYPE_SINGLE_PLAYERS 28
405 #define CF_TYPE_MULTI_PLAYERS 29
406 #define CF_TYPE_MULTI_CACHE 30
407 #define CF_TYPE_CONFIG 31
408 #define CF_TYPE_SQUAD_IMAGES_MAIN 32
409 #define CF_TYPE_DEMOS 33
410 #define CF_TYPE_CBANIMS 34
411 #define CF_TYPE_INTEL_ANIMS 35
413 #define CF_MAX_PATH_TYPES 36 // Can be as high as you'd like
415 // TRUE if type is specified and valid
416 #define CF_TYPE_SPECIFIED(path_type) (((path_type)>CF_TYPE_INVALID) && ((path_type)<CF_MAX_PATH_TYPES))
418 // #define's for the type parameter in cfopen.
419 #define CFILE_NORMAL 0 // open file normally
420 #define CFILE_MEMORY_MAPPED (1<<0) // open file as a memory-mapped file
422 #define CF_SORT_NONE 0
423 #define CF_SORT_NAME 1
424 #define CF_SORT_TIME 2
426 #define cfread_fix(file) (fix)cfread_int(file)
427 #define cfwrite_fix(i,file) cfwrite_int(i,file)
429 // callback function used for get_file_list() to filter files to be added to list. Return 1
430 // to add file to list, or 0 to not add it.
431 extern int (*Get_file_list_filter)(const char *filename);
433 // cfile directory. valid after cfile_init() returns successfully
434 #define CFILE_ROOT_DIRECTORY_LEN 256
435 extern char Cfile_root_dir[CFILE_ROOT_DIRECTORY_LEN];
436 extern char Cfile_user_dir[CFILE_ROOT_DIRECTORY_LEN];
438 //================= LOW-LEVEL FUNCTIONS ==================
439 // Call this once at the beginning of the program
440 int cfile_init(const char *extras_dir = NULL);
442 // add an extension to a filename if it doesn't already have it
443 char *cf_add_ext(const char *filename, const char *ext);
445 // return CF_TYPE (directory location type) of a CFILE you called cfopen() successfully on.
446 int cf_get_dir_type(CFILE *cfile);
448 // Opens the file. If no path is given, use the extension to look into the
449 // default path. If mode is NULL, delete the file.
450 CFILE *cfopen(const char *filename, const char *mode, int type = CFILE_NORMAL, int dir_type = CF_TYPE_ANY, bool localize = false);
452 // Flush the open file buffer
453 int cflush(CFILE *cfile);
455 // version number of opened file. Will be 0 unless you put something else here after you
456 // open a file. Once set, you can use minimum version numbers with the read functions.
457 void cf_set_version( CFILE * cfile, int version );
460 void cf_delete( const char *filename, int dir_type );
462 // Same as _access function to read a file's access bits
463 int cf_access( const char *filename, int dir_type, int mode );
465 // Returns 1 if file exists, 0 if not.
466 int cf_exist( const char *filename, int dir_type );
468 // ctmpfile() opens a temporary file stream. File is deleted automatically when closed
472 int cfclose(CFILE *cfile);
474 // Returns size of file...
475 int cfilelength(CFILE *fp);
478 int cfread(void *buf, int elsize, int nelem, CFILE *fp);
480 // cfwrite() writes to the file
481 int cfwrite(const void *buf, int elsize, int nelem, CFILE *cfile);
483 // Reads/writes RLE compressed data.
484 int cfread_compressed(void *buf, int elsize, int nelem, CFILE *cfile);
485 int cfwrite_compressed(void *param_buf, int param_elsize, int param_nelem, CFILE *cfile);
487 // Moves the file pointer
488 int cfseek(CFILE *fp, int offset, int where);
490 // Returns current position of file.
491 int cftell(CFILE *fp);
493 // cfputc() writes a character to a file
494 int cfputc(int c, CFILE *cfile);
496 // cfputs() writes a string to a file
497 int cfputs(const char *str, CFILE *cfile);
499 // cfgetc() reads a character to a file
500 int cfgetc(CFILE *cfile);
502 // cfgets() reads a string from a file
503 char *cfgets(char *buf, int n, CFILE *cfile);
505 // cfeof() Tests for end-of-file on a stream
506 int cfeof(CFILE *cfile);
508 // Return the data pointer associated with the CFILE structure (for memory mapped files)
509 void *cf_returndata(CFILE *cfile);
511 // get the 2 byte checksum of the passed filename - return 0 if operation failed, 1 if succeeded
512 int cf_chksum_short(const char *filename, ushort *chksum, int max_size = -1, int cf_type = CF_TYPE_ANY );
514 // get the 2 byte checksum of the passed file - return 0 if operation failed, 1 if succeeded
515 // NOTE : preserves current file position
516 int cf_chksum_short(CFILE *file, ushort *chksum, int max_size = -1);
518 // get the 32 bit CRC checksum of the passed filename - return 0 if operation failed, 1 if succeeded
519 int cf_chksum_long(const char *filename, uint *chksum, int max_size = -1, int cf_type = CF_TYPE_ANY );
521 // get the 32 bit CRC checksum of the passed file - return 0 if operation failed, 1 if succeeded
522 // NOTE : preserves current file position
523 int cf_chksum_long(CFILE *file, uint *chksum, int max_size = -1);
525 // convenient for misc checksumming purposes ------------------------------------------
527 // update cur_chksum with the chksum of the new_data of size new_data_size
528 ushort cf_add_chksum_short(ushort seed, const char *buffer, int size);
530 // update cur_chksum with the chksum of the new_data of size new_data_size
531 unsigned long cf_add_chksum_long(unsigned long seed, const char *buffer, int size);
533 // convenient for misc checksumming purposes ------------------------------------------
535 //================= HIGH LEVEL FUNCTIONS ==================
536 int cfexist(const char *filename); // Returns true if file exists on disk (1) or in hog (2).
538 // rename a file, utilizing the extension to determine where file is.
539 #define CF_RENAME_SUCCESS 0 // successfully renamed the file
540 #define CF_RENAME_FAIL_ACCESS 1 // new name could not be created
541 #define CF_RENAME_FAIL_EXIST 2 // old name does not exist
542 int cf_rename(const char *old_name, const char *name, int type = CF_TYPE_ANY );
544 // changes the attributes of a file
545 void cf_attrib(const char *name, int set, int clear, int type);
547 // flush (delete all files in) the passed directory (by type), return the # of files deleted
548 // NOTE : WILL NOT DELETE READ-ONLY FILES
549 int cfile_flush_dir(int type);
551 // functions for reading from cfile
552 // These are all high level, built up from
554 char cfread_char(CFILE *file, int ver = 0, char deflt = 0);
555 ubyte cfread_ubyte(CFILE *file, int ver = 0, ubyte deflt = 0);
556 short cfread_short(CFILE *file, int ver = 0, short deflt = 0);
557 ushort cfread_ushort(CFILE *file, int ver = 0, ushort deflt = 0);
558 int cfread_int(CFILE *file, int ver = 0, int deflt = 0);
559 uint cfread_uint(CFILE *file, int ver = 0, uint deflt = 0);
560 float cfread_float(CFILE *file, int ver = 0, float deflt = 0.0f);
561 void cfread_vector(vector *vec, CFILE *file, int ver = 0, vector *deflt = NULL);
562 void cfread_angles(angles *ang, CFILE *file, int ver = 0, angles *deflt = NULL);
564 // Reads variable length, null-termined string. Will only read up
566 void cfread_string(char *buf, int n, CFILE *file);
567 // Read a fixed length that is null-terminatedm, and has the length
569 void cfread_string_len(char *buf, int n, CFILE *file);
571 // functions for writing cfiles
572 int cfwrite_char(char c, CFILE *file);
573 int cfwrite_float(float f, CFILE *file);
574 int cfwrite_int(int i, CFILE *file);
575 int cfwrite_uint(uint i, CFILE *file);
576 int cfwrite_short(short s, CFILE *file);
577 int cfwrite_ushort(ushort s, CFILE *file);
578 int cfwrite_ubyte(ubyte u, CFILE *file);
579 int cfwrite_vector(vector *vec, CFILE *file);
580 int cfwrite_angles(angles *ang, CFILE *file);
582 // writes variable length, null-termined string.
583 int cfwrite_string(const char *buf, CFILE *file);
585 // write a fixed length that is null-terminatedm, and has the length
587 int cfwrite_string_len(const char *buf, CFILE *file);
589 int cf_get_file_list( int max, char **list, int type, const char *filter, int sort = CF_SORT_NONE, file_list_info *info = NULL );
590 int cf_get_file_list_preallocated( int max, char arr[][MAX_FILENAME_LEN], char **list, int type, const char *filter, int sort = CF_SORT_NONE, file_list_info *info = NULL );
591 void cf_sort_filenames( int n, char **list, int sort, file_list_info *info = NULL );
593 // Searches for a file. Follows all rules and precedence and searches
594 // CD's and pack files.
595 // Input: filespace - Filename & extension
596 // pathtype - See CF_TYPE_ defines in CFILE.H
597 // Output: pack_filename - Absolute path and filename of this file. Could be a packfile or the actual file.
599 // offset - Offset into pack file. 0 if not a packfile.
600 // Returns: If not found returns 0.
601 int cf_find_file_location( const char *filespec, int pathtype, char *pack_filename, int *size, int *offset, bool localize = false);
603 // Functions to change directories
604 int cfile_chdir(char *dir);
605 int cfile_chdrive(int DriveNum, int flag);
607 // push current directory on a 'stack' (so we can restore it) and change the directory
608 int cfile_push_chdir(int type);
610 // restore directory on top of the stack
613 // initializes Cfile_root_dir[] and Cfile_user_dir[]
614 int cfile_init_paths();
616 #endif /* __CFILE_H__ */