1 module allegro5.fshook;
2 
3 import allegro5.base;
4 import allegro5.file;
5 import allegro5.path;
6 import allegro5.internal.da5;
7 
8 version(Windows)
9 {
10 	private alias long off_t;
11 }
12 else
13 {
14 	import core.sys.posix.sys.types : off_t;
15 }
16 
17 import core.stdc.time : time_t;
18 
19 nothrow @nogc extern (C)
20 {
21 	struct ALLEGRO_FS_ENTRY 
22 	{
23 		const ALLEGRO_FS_INTERFACE* vtable;
24 	}
25 
26 	enum ALLEGRO_FILE_MODE
27 	{
28 		ALLEGRO_FILEMODE_READ    = 1,
29 		ALLEGRO_FILEMODE_WRITE   = 1 << 1,
30 		ALLEGRO_FILEMODE_EXECUTE = 1 << 2,
31 		ALLEGRO_FILEMODE_HIDDEN  = 1 << 3,
32 		ALLEGRO_FILEMODE_ISFILE  = 1 << 4,
33 		ALLEGRO_FILEMODE_ISDIR   = 1 << 5,
34 	}
35 	
36 	struct ALLEGRO_FS_INTERFACE
37 	{
38 		ALLEGRO_FS_ENTRY* function(in char* path) fs_create_entry;
39 		void              function(ALLEGRO_FS_ENTRY* e) fs_destroy_entry;
40 		const(char)*       function(ALLEGRO_FS_ENTRY* e) fs_entry_name;
41 		bool              function(ALLEGRO_FS_ENTRY* e) fs_update_entry;
42 		uint              function(ALLEGRO_FS_ENTRY* e) fs_entry_mode;
43 		time_t            function(ALLEGRO_FS_ENTRY* e) fs_entry_atime;
44 		time_t            function(ALLEGRO_FS_ENTRY* e) fs_entry_mtime;
45 		time_t            function(ALLEGRO_FS_ENTRY* e) fs_entry_ctime;
46 		off_t             function(ALLEGRO_FS_ENTRY* e) fs_entry_size;
47 		bool              function(ALLEGRO_FS_ENTRY* e) fs_entry_exists;
48 		bool              function(ALLEGRO_FS_ENTRY* e) fs_remove_entry;
49 
50 		bool              function(ALLEGRO_FS_ENTRY* e) fs_open_directory;
51 		ALLEGRO_FS_ENTRY* function(ALLEGRO_FS_ENTRY* e) fs_read_directory;
52 		bool              function(ALLEGRO_FS_ENTRY* e) fs_close_directory;
53 
54 		bool              function(in char* path) fs_filename_exists;
55 		bool              function(in char* path) fs_remove_filename;
56 		ALLEGRO_PATH*     function() fs_get_current_directory;
57 		bool              function(in char* path) fs_change_directory;
58 		bool              function(in char* path) fs_make_directory;
59 		
60 		ALLEGRO_FILE *    function(ALLEGRO_FS_ENTRY* e, in char* mode) fs_open_file;
61 	}
62 
63 	ALLEGRO_FS_ENTRY*    al_create_fs_entry(in char* path);
64 	void                 al_destroy_fs_entry(ALLEGRO_FS_ENTRY* e);
65 	const(char)*          al_get_fs_entry_name(ALLEGRO_FS_ENTRY* e);
66 	bool                 al_update_fs_entry(ALLEGRO_FS_ENTRY* e);
67 	uint                 al_get_fs_entry_mode(ALLEGRO_FS_ENTRY* e);
68 	time_t               al_get_fs_entry_atime(ALLEGRO_FS_ENTRY* e);
69 	time_t               al_get_fs_entry_mtime(ALLEGRO_FS_ENTRY* e);
70 	time_t               al_get_fs_entry_ctime(ALLEGRO_FS_ENTRY* e);
71 	off_t                al_get_fs_entry_size(ALLEGRO_FS_ENTRY* e);
72 	bool                 al_fs_entry_exists(ALLEGRO_FS_ENTRY* e);
73 	bool                 al_remove_fs_entry(ALLEGRO_FS_ENTRY* e);
74 
75 	bool                 al_open_directory(ALLEGRO_FS_ENTRY* e);
76 	ALLEGRO_FS_ENTRY*    al_read_directory(ALLEGRO_FS_ENTRY* e);
77 	bool                 al_close_directory(ALLEGRO_FS_ENTRY* e);
78 
79 	bool                 al_filename_exists(in char* path);
80 	bool                 al_remove_filename(in char* path);
81 	char*                al_get_current_directory();
82 	bool                 al_change_directory(in char* path);
83 	bool                 al_make_directory(in char* path);
84 	
85 	ALLEGRO_FILE*        al_open_fs_entry(ALLEGRO_FS_ENTRY* e, in char* mode);
86 
87 	enum ALLEGRO_FOR_EACH_FS_ENTRY_RESULT
88 	{
89 	   ALLEGRO_FOR_EACH_FS_ENTRY_ERROR = -1,
90 	   ALLEGRO_FOR_EACH_FS_ENTRY_OK    =  0,
91 	   ALLEGRO_FOR_EACH_FS_ENTRY_SKIP  =  1,
92 	   ALLEGRO_FOR_EACH_FS_ENTRY_STOP  =  2
93 	}
94 
95 	int al_for_each_fs_entry(ALLEGRO_FS_ENTRY *dir,
96 		int function(ALLEGRO_FS_ENTRY*, void*) callback,
97 		void *extra);
98 
99 	/* Thread-local state. */
100 	ALLEGRO_FS_INTERFACE* al_get_fs_interface();
101 	void al_set_fs_interface(in ALLEGRO_FS_INTERFACE* vtable);
102 	void al_set_standard_fs_interface();
103 }