1 // Copyright (C) 1999-2005 Open Source Telecom Corporation.
2 // Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
3 //
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 //
18 // As a special exception, you may use this file as part of a free software
19 // library without restriction. Specifically, if other files instantiate
20 // templates or use macros or inline functions from this file, or you compile
21 // this file and link it with other files to produce an executable, this
22 // file does not by itself cause the resulting executable to be covered by
23 // the GNU General Public License. This exception does not however
24 // invalidate any other reasons why the executable file might be covered by
25 // the GNU General Public License.
26 //
27 // This exception applies only to the code released under the name GNU
28 // Common C++. If you copy code from other releases into a copy of GNU
29 // Common C++, as the General Public License permits, the exception does
30 // not apply to the code that you add in this way. To avoid misleading
31 // anyone as to the status of such modified files, you must delete
32 // this exception notice from them.
33 //
34 // If you write modifications of your own for GNU Common C++, it is your choice
35 // whether to permit this exception to apply to your modifications.
36 // If you do not wish that, delete this exception notice.
37 //
38
44 #ifndef CCXX_FILE_H_
45 #define CCXX_FILE_H_
46
47 #ifndef CCXX_CONFIG_H_
48 #include <cc++/config.h>
49 #endif
50
51 #ifndef CCXX_MISSING_H_
53 #endif
54
55 #ifndef CCXX_THREAD_H_
57 #endif
58
59 #ifndef CCXX_EXCEPTION_H_
61 #endif
62
63 #ifndef WIN32
64 # ifdef __BORLANDC__
65 # include <stdio.h>
66 # include <sys/types.h>
67 # else
68 # include <cstdio>
69 # endif
70 # include <dirent.h>
71 # include <sys/stat.h>
72 # include <sys/mman.h>
73 #else
74 # if __BORLANDC__ >= 0x0560
75 # include <dirent.h>
76 # include <sys/stat.h>
77 # else
78 # include <direct.h>
79 # endif
80 #endif
81
82 #ifdef HAVE_SHL_LOAD
83 #include <dl.h>
84 #endif
85
86 #ifdef HAVE_MACH_DYLD
87 #include <mach-o/dyld.h>
88 #endif
89
90 #ifdef CCXX_NAMESPACES
91 namespace ost {
92 #endif
93
95 #ifndef WIN32
96 // use a define so that if the sys/types.h header already defines caddr_t
97 // as it may on BSD systems, we do not break it by redefining again.
98 #undef caddr_t
99 #define caddr_t char *
101 #else
102 #if !defined(__BORLANDC__) || __BORLANDC__ >= 0x0560
103 typedef LONG off_t;
104 #endif
107 #endif
108
109 #ifndef PATH_MAX
111 #endif
112
113 #ifndef NAME_MAX
115 #endif
116
118 {
119 public:
136 };
138
140 #ifndef WIN32
141 accessReadOnly = O_RDONLY,
142 accessWriteOnly= O_WRONLY,
143 accessReadWrite = O_RDWR
144 #else
145 accessReadOnly = GENERIC_READ,
146 accessWriteOnly = GENERIC_WRITE,
147 accessReadWrite = GENERIC_READ | GENERIC_WRITE
148 #endif
149 };
151
152 protected:
160
161 public:
162 #ifdef WIN32
164 openReadOnly, // = FILE_OPEN_READONLY,
165 openWriteOnly, // = FILE_OPEN_WRITEONLY,
166 openReadWrite, // = FILE_OPEN_READWRITE,
167 openAppend, // = FILE_OPEN_APPEND,
168 openTruncate // = FILE_OPEN_TRUNCATE
169 };
170 #else
172 openReadOnly = O_RDONLY,
173 openWriteOnly = O_WRONLY,
174 openReadWrite = O_RDWR,
175 openAppend = O_WRONLY | O_APPEND,
176 #ifdef O_SYNC
177 openSync = O_RDWR | O_SYNC,
178 #else
180 #endif
181 openTruncate = O_RDWR | O_TRUNC
182 };
184
185 /* to be used in future */
186
187 #ifndef S_IRUSR
194 #endif
195
196 #endif // !WIN32
197
198 #ifndef WIN32
204 };
205 #else // defined WIN32
206 enum Attr {
207 attrInvalid=0,
208 attrPrivate,
209 attrGroup,
210 attrPublic
211 };
212 #endif // !WIN32
214
215 #ifdef WIN32
217 completionImmediate, // = FILE_COMPLETION_IMMEDIATE,
218 completionDelayed, // = FILE_COMPLETION_DELAYED,
219 completionDeferred // = FILE_COMPLETION_DEFERRED
220 };
221
222 enum Mapping {
223 mappedRead,
224 mappedWrite,
225 mappedReadWrite
226 };
227 #else
229 mappedRead = accessReadOnly,
230 mappedWrite = accessWriteOnly,
231 mappedReadWrite = accessReadWrite
232 };
237 };
238 #endif
241
242 public:
243 static const char *getExtension(const char *path);
244 static const char *getFilename(const char *path);
245 static char *getFilename(
const char *path,
char *buffer,
size_t size =
NAME_MAX);
246 static char *getDirname(
const char *path,
char *buffer,
size_t size =
PATH_MAX);
247 static char *getRealpath(
const char *path,
char *buffer,
size_t size =
PATH_MAX);
248 };
249
259 {
260 private:
261 #ifndef WIN32
263 #ifdef HAVE_READDIR_R
264 struct dirent *save;
265 char save_space[
sizeof(
struct dirent) +
PATH_MAX + 1];
266 #endif
268 #else
270 WIN32_FIND_DATA data, fdata;
271 char *name;
272 #endif
273
274 public:
275 Dir(
const char *name = NULL);
276
277 static bool create(
const char *path,
Attr attr = attrGroup);
278 static bool remove(const char *path);
279 static bool setPrefix(const char *path);
280 static bool getPrefix(
char *path,
size_t size =
PATH_MAX);
281
282 void open(const char *name);
283 void close(void);
284
286
287 const char *getName(void);
288
290 {return getName();};
291
293 {return getName();};
294
295 const char *operator*();
296
297 bool rewind(void);
298
300 #ifndef WIN32
301 {return !dir;};
302 #else
304 #endif
305
306 bool isValid(void);
307 };
308
316 {
317 private:
321
322 protected:
332 virtual bool filter(const char *file, struct stat *ino);
333
334 public:
342 DirTree(
const char *prefix,
unsigned maxdepth);
343
350
352
358 void open(const char *prefix);
359
363 void close(void);
364
372 char *getPath(void);
373
383 unsigned perform(const char *prefix);
384 };
385
397 {
398 private:
401
402 protected:
403 #ifndef WIN32
405 // FIXME: WIN32 as no access member
407 #else
409 #endif
411
412 struct {
416 #ifndef WIN32
418 #endif
420 } flags;
421
426
431
439 Error
error(Error errid,
char *errstr = NULL);
440
448 {
return error(errExtended, err);};
449
457 {flags.thrown = !enable;};
458
459 #ifndef WIN32
460
467 Error setCompletion(Complete mode);
468 #endif
469
477 {flags.temp = enable;};
478
490 virtual Attr initialize(void);
491
495 void final(void);
496
497 public:
502
511 bool initial(void);
512
518 off_t getCapacity(void);
519
525 virtual Error restart(void);
526
533 {return errid;};
534
541 {return errstr;};
542
543 bool operator!(void);
544 };
545
566 {
567 private:
571 Error open(
const char *path);
572
573 public:
581
586
593
604
615
622
628 off_t getPosition(void);
629
630 bool operator++(void);
631 bool operator--(void);
632 };
633
649 {
650 private:
652 Error open(
const char *path);
653
654 public:
662
670
675
682 {return open(pathname);};
683
695
707
716 Error clear(
ccxx_size_t length = 0, off_t pos = -1);
717
725
731 off_t getPosition(void);
732
733 bool operator++(void);
734 bool operator--(void);
735 };
736
748 {
749 private:
752 #ifdef WIN32
754 char mapname[64];
755 #endif
756
757 public:
766
776
788
794
795 // FIXME: not use library function in header ??
801 void sync(void);
802
809 void sync(
caddr_t address,
size_t len);
810
819 void update(size_t offset = 0, size_t len = 0);
820
828 void update(
caddr_t address,
size_t len);
829
836 void release(
caddr_t address,
size_t len);
837
847 {return ((char *)(fcb.address)) + offset;};
848
857 caddr_t fetch(off_t pos,
size_t len);
858
864 bool lock(void);
865
869 void unlock(void);
870
877 size_t pageAligned(size_t size);
878 };
879
880
890 {
891 private:
893 #ifdef HAVE_MODULES
898 const char *id;
899 #if defined(HAVE_MACH_DYLD)
900 NSModule oModule;
901 #elif defined(HAVE_SHL_LOAD)
902 shl_t image;
903 #elif defined(WIN32)
904 HINSTANCE hImage;
905 #else
906 void *image;
907 #endif
908 void loader(const char *filename, bool resolve);
909 #endif
910
911 public:
917 #ifdef HAVE_MODULES
918 DSO(
const char *filename)
919 {loader(filename, true);};
920
921 DSO(
const char *filename,
bool resolve)
922 {loader(filename, resolve);};
923 #else
925 {throw this;};
926 DSO(
const char *filename,
bool resolve)
927 {throw this;};
928 #endif
929
935 {return err;};
936
940 #ifdef HAVE_MODULES
942 #endif
943
947 #ifdef HAVE_MODULES
948 void* operator[](const char *sym);
949 #else
951 {return NULL;};
952 #endif
953
954 #ifdef HAVE_MODULES
955 static void dynunload(void);
956 #else
958 {return;};
959 #endif
960
966 static DSO *getObject(
const char *name);
967
973 bool isValid(void);
974
978 static void setDebug(void);
979 };
980
982 bool __EXPORT isDir(
const char *path);
984 bool __EXPORT isFile(
const char *path);
985 #ifndef WIN32
986
987 bool __EXPORT isDevice(
const char *path);
988 #else
989
990 inline bool isDevice(const char *path)
991 { return false; }
992 #endif
993
994 bool __EXPORT canAccess(
const char *path);
996 bool __EXPORT canModify(
const char *path);
998 time_t
__EXPORT lastModified(
const char *path);
1000 time_t
__EXPORT lastAccessed(
const char *path);
1001
1002 #ifdef COMMON_STD_EXCEPTION
1003
1004 class DirException : public IOException
1005 {
1006 public:
1007 DirException(
const String &str) : IOException(str) {};
1008 };
1009
1010 class __EXPORT DSOException :
public IOException
1011 {
1012 public:
1013 DSOException(
const String &str) : IOException(str) {};
1014 };
1015
1016 class __EXPORT FileException :
public IOException
1017 {
1018 public:
1019 FileException(
const String &str) : IOException(str) {};
1020 };
1021
1022 #endif
1023
1024 #ifdef CCXX_NAMESPACES
1025 }
1026 #endif
1027
1028 #endif
1029
static void dynunload(void)
const char * getError(void)
Retrieve error indicator associated with DSO failure.
This class defines a database I/O file service that can be shared by multiple threads.
char * getErrorString(void)
Return current error string.
__EXPORT AppLog & error(AppLog &sl)
Manipulator for error level.
Create and map a disk file into memory.
substitute functions which may be missing in target platform libc.
Error restart(void)
Restart an existing database; close and re-open.
The Mutex class is used to protect a section of code so that at any given time only a single thread c...
This class allows the creation of a thread context unique "pointer" that can be set and retrieved and...
This is a generic and portable string class.
GNU Common C++ exception model base classes.
char * fetch(size_t offset=0)
Fetch a pointer to an offset within the memory mapped portion of the disk file.
#define INVALID_HANDLE_VALUE
Synchronization and threading services.
The purpose of this class is to define a base class for low level random file access that is portable...
const char * operator++()
A generic class to walk a hierarchical directory structure.
const char * operator++(int)
Error error(char *err)
Post an extended string error message.
Error getErrorNumber(void)
Return current error id.
void * operator[](const char *)
Detach a DSO object from running memory.
This class defines a database I/O file service that can be shared by multiple processes.
void setTemporary(bool enable)
Used to set the temporary attribute for the file.
DSO(const char *filename, bool resolve)
DSO(const char *filename)
Construct and load a DSO object file.
The DSO dynamic loader class is used to load object files.
A low level portable directory class.
void setError(bool enable)
Used to enable or disable throwing of exceptions on errors.