16 #ifndef DABC_BinaryFile
17 #define DABC_BinaryFile
41 virtual Handle fopen(
const char* fname,
const char* mode,
const char* = 0) {
return (
Handle) ::fopen(fname, mode); }
43 virtual void fclose(
Handle f) {
if (f!=0) ::fclose((FILE*)f); }
45 virtual size_t fwrite(
const void* ptr,
size_t sz,
size_t nmemb,
Handle f)
46 {
return ((f==0) || (ptr==0)) ? 0 : ::fwrite(ptr, sz, nmemb, (FILE*) f); }
48 virtual size_t fread(
void* ptr,
size_t sz,
size_t nmemb,
Handle f)
49 {
return ((f==0) || (ptr==0)) ? 0 : ::fread(ptr, sz, nmemb, (FILE*) f); }
51 virtual bool feof(
Handle f)
52 {
return f==0 ? false : ::feof((FILE*)f)>0; }
54 virtual bool fflush(
Handle f)
55 {
return f==0 ? false : ::fflush((FILE*)f)==0; }
57 virtual bool fseek(
Handle f,
long int offset,
bool relative =
true)
58 {
return f==0 ? false : ::fseek((FILE*)f, offset, relative ? SEEK_CUR : SEEK_SET) == 0; }
62 virtual Object*
fmatch(
const char* fmask,
bool select_files =
true) {
return 0; }
64 virtual bool mkdir(
const char* path) {
return false; }
70 virtual bool GetFileStrPar(
Handle h,
const char* parname,
char* sbuf,
int sbuflen) {
if (sbuf) *sbuf = 0;
return false; }
114 void SetIO(FileInterface* _io,
bool _ioowner =
false)
129 inline bool isOpened()
const {
return (
io!=0) && (
fd!=0); }
131 inline bool isReading()
const {
return isOpened() &&
fReadingMode; }
133 inline bool isWriting()
const {
return isOpened() && !
fReadingMode; }
135 bool eof()
const {
return isReading() ?
io->feof(
fd) :
true; }
173 enum { BinaryFileMagicValue = 1237 };
197 bool OpenReading(
const char* fname)
199 if (isOpened())
return false;
201 if (fname==0 || *fname==0) {
202 fprintf(stderr,
"file name not specified\n");
208 fd =
io->fopen(fname,
"r");
210 fprintf(stderr,
"File open failed %s for reading\n", fname);
216 fprintf(stderr,
"Failure reading file %s header\n", fname);
227 bool OpenWriting(
const char* fname)
229 if (isOpened())
return false;
231 if (fname==0 || *fname==0) {
232 fprintf(stderr,
"file name not specified\n");
238 fd =
io->fopen(fname,
"w");
240 fprintf(stderr,
"File open failed %s for writing\n", fname);
248 fprintf(stderr,
"Failure writing file %s header", fname);
261 return CloseBasicFile();
264 const BinaryFileHeader& hdr()
const {
return fFileHdr; }
266 bool WriteBufHeader(uint64_t size, uint64_t typ = 0)
268 if (!isWriting() || (size==0))
return false;
271 fprintf(stderr,
"writing of previous buffer was not completed, remained %u bytes\n", (
unsigned)
fBufHdr.
datalength);
280 fprintf(stderr,
"fail to write buffer header\n");
288 bool WriteBufPayload(
const void* ptr, uint64_t sz)
290 if (!isWriting() || (ptr==0) || (sz==0))
return false;
293 fprintf(stderr,
"Appropriate header was not written for buffer %u\n", (
unsigned) sz);
300 if (
io->fwrite(ptr, sz, 1,
fd)!=1) {
301 fprintf(stderr,
"fail to write buffer payload of size %u\n", (
unsigned) sz);
309 bool WriteBuffer(
const void* ptr, uint64_t sz, uint64_t typ = 0)
311 if (!WriteBufHeader(sz, typ))
return false;
313 return WriteBufPayload(ptr, sz);
317 bool ReadBufHeader(uint64_t* size, uint64_t* typ = 0)
319 if (!isReading())
return false;
322 fprintf(stderr,
"reading of previous buffer was not completed, remained %u bytes\n", (
unsigned)
fBufHdr.
datalength);
327 fprintf(stderr,
"fail to read buffer header\n");
337 bool ReadBufPayload(
void* ptr, uint64_t sz)
339 if (!isReading() || (ptr==0) || (sz==0))
return false;
342 fprintf(stderr,
"Appropriate header was not read from buffer %u\n", (
unsigned) sz);
349 if (
io->fread(ptr, sz, 1,
fd) != 1) {
350 fprintf(stderr,
"fail to write buffer payload of size %u\n", (
unsigned) sz);
358 bool ReadBuffer(
void* ptr, uint64_t* sz, uint64_t* typ = 0)
360 if ((ptr==0) || (sz==0) || (*sz == 0))
return false;
362 uint64_t maxsz = *sz; *sz = 0;
364 if (!ReadBufHeader(sz, typ))
return false;
367 fprintf(stderr,
"Provided buffer %u is smaller than stored in the file %u\n", (
unsigned) maxsz, (
unsigned) *sz);
372 return ReadBufPayload(ptr, *sz);
Base class for file writing/reading in DABC.
Definition: BinaryFile.h:84
FileInterface::Handle fd
! file descriptor
Definition: BinaryFile.h:88
bool GetStrPar(const char *parname, char *sbuf, int sbuflen)
Return string file parameter.
Definition: BinaryFile.h:141
int GetIntPar(const char *parname)
Return integer file parameter.
Definition: BinaryFile.h:138
bool IsRFIO()
Returns true when RFIO is used.
Definition: BinaryFile.h:144
FileInterface * io
! interface to the file system
Definition: BinaryFile.h:86
bool iowoner
! if true, io object owned by file
Definition: BinaryFile.h:87
bool fReadingMode
! reading/writing mode
Definition: BinaryFile.h:89
Generic file storage for DABC buffers.
Definition: BinaryFile.h:181
BinaryFileHeader fFileHdr
! file header
Definition: BinaryFile.h:183
BinaryFileBufHeader fBufHdr
! buffer header
Definition: BinaryFile.h:184
Defines and implements basic POSIX file interface.
Definition: BinaryFile.h:33
virtual bool GetFileStrPar(Handle h, const char *parname, char *sbuf, int sbuflen)
Method returns file-specific string parameter.
Definition: BinaryFile.h:70
void * Handle
File handle descriptor.
Definition: BinaryFile.h:37
virtual int GetFileIntPar(Handle h, const char *parname)
Method returns file-specific int parameter.
Definition: BinaryFile.h:67
virtual Object * fmatch(const char *fmask, bool select_files=true)
Produce list of files, object must be explicitly destroyed with ref.Destroy call One could decide if ...
Definition: BinaryFile.h:62