Qore Programming Language  0.9.16
QoreFile.h
1 /* -*- mode: c++; indent-tabs-mode: nil -*- */
2 /*
3  QoreFile.h
4 
5  thread-safe File object
6 
7  Qore Programming Language
8 
9  Copyright (C) 2003 - 2019 Qore Technologies, s.r.o.
10 
11  Permission is hereby granted, free of charge, to any person obtaining a
12  copy of this software and associated documentation files (the "Software"),
13  to deal in the Software without restriction, including without limitation
14  the rights to use, copy, modify, merge, publish, distribute, sublicense,
15  and/or sell copies of the Software, and to permit persons to whom the
16  Software is furnished to do so, subject to the following conditions:
17 
18  The above copyright notice and this permission notice shall be included in
19  all copies or substantial portions of the Software.
20 
21  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27  DEALINGS IN THE SOFTWARE.
28 
29  Note that the Qore library is released under a choice of three open-source
30  licenses: MIT (as above), LGPL 2+, or GPL 2+; see README-LICENSE for more
31  information.
32 */
33 
34 #ifndef _QORE_QOREFILE_H
35 
36 #define _QORE_QOREFILE_H
37 
38 #include <qore/AbstractPrivateData.h>
39 
40 #include <fcntl.h>
41 #include <string>
42 #include <sys/file.h>
43 #include <unistd.h>
44 
45 /*
46  getchar from stdio.h(included via string on some platforms)
47  is allowed to be defined as a macro and this can cause
48  problems here since the getchar mentioned in this file might
49  get replaced, so we undefine it if it is defined.
50  Undefining getchar is safe since getchar must be defined as
51  a function, so the function is used if the macro is not available.
52  */
53 #ifdef getchar
54 #undef getchar
55 #endif
56 
57 class QoreTermIOS;
58 class Queue;
59 
61 
66 class QoreFile {
67 protected:
69  hashdecl qore_qf_private *priv;
70 
72  DLLLOCAL QoreFile(const QoreFile&);
73 
75  DLLLOCAL QoreFile& operator=(const QoreFile&);
76 
77 public:
79  DLLEXPORT QoreFile(const QoreEncoding *cs = QCS_DEFAULT);
80 
82  DLLEXPORT ~QoreFile();
83 
85 
94  DLLEXPORT int open(const char *fn, int flags = O_RDONLY, int mode = 0777, const QoreEncoding *cs = QCS_DEFAULT);
95 
97 
107  DLLEXPORT int open2(ExceptionSink *xsink, const char *fn, int flags = O_RDONLY, int mode = 0777, const QoreEncoding *cs = QCS_DEFAULT);
108 
110 
113  DLLEXPORT int close();
114 
116  DLLEXPORT void setEncoding(const QoreEncoding *cs);
117 
119  DLLEXPORT const QoreEncoding *getEncoding() const;
120 
122  DLLEXPORT int sync();
123 
125 
132  DLLEXPORT QoreStringNode* readLine(ExceptionSink* xsink);
133 
135 
144  DLLEXPORT QoreStringNode* readLine(bool incl_eol, ExceptionSink* xsink);
145 
147 
155  DLLEXPORT int readLine(QoreString &str);
156 
158 
167  DLLEXPORT int readLine(QoreString &str, bool incl_eol);
168 
170 
180  DLLEXPORT QoreStringNode* readUntil(const char* bytes, bool incl_bytes, ExceptionSink* xsink);
181 
183 
193  DLLEXPORT int readUntil(char byte, QoreString& str, bool incl_bytes = true);
194 
196 
205  DLLEXPORT int readUntil(const char* bytes, QoreString& str, bool incl_bytes = true);
206 
208 
213  DLLEXPORT int write(const QoreString *str, ExceptionSink *xsink);
214 
216 
221  DLLEXPORT int write(const BinaryNode *b, ExceptionSink *xsink);
222 
224 
230  DLLEXPORT int write(const void *data, qore_size_t len, ExceptionSink *xsink);
231 
233 
238  DLLEXPORT int writei1(char i, ExceptionSink *xsink);
239 
241 
247  DLLEXPORT int writei2(short i, ExceptionSink *xsink);
248 
250 
256  DLLEXPORT int writei4(int i, ExceptionSink *xsink);
257 
259 
265  DLLEXPORT int writei8(int64 i, ExceptionSink *xsink);
266 
268 
274  DLLEXPORT int writei2LSB(short i, ExceptionSink *xsink);
275 
277 
283  DLLEXPORT int writei4LSB(int i, ExceptionSink *xsink);
284 
286 
292  DLLEXPORT int writei8LSB(int64 i, ExceptionSink *xsink);
293 
295 
301  DLLEXPORT int readu1(unsigned char *val, ExceptionSink *xsink);
302 
304 
312  DLLEXPORT int readu2(unsigned short *val, ExceptionSink *xsink);
313 
315 
323  DLLEXPORT int readu4(unsigned int *val, ExceptionSink *xsink);
324 
326 
334  DLLEXPORT int readu2LSB(unsigned short *val, ExceptionSink *xsink);
335 
337 
345  DLLEXPORT int readu4LSB(unsigned int *val, ExceptionSink *xsink);
346 
348 
354  DLLEXPORT int readi1(char *val, ExceptionSink *xsink);
355 
357 
365  DLLEXPORT int readi2(short *val, ExceptionSink *xsink);
366 
368 
376  DLLEXPORT int readi4(int *val, ExceptionSink *xsink);
377 
379 
385  DLLEXPORT int readi8(int64 *val, ExceptionSink *xsink);
386 
388 
396  DLLEXPORT int readi2LSB(short *val, ExceptionSink *xsink);
397 
399 
407  DLLEXPORT int readi4LSB(int *val, ExceptionSink *xsink);
408 
410 
416  DLLEXPORT int readi8LSB(int64 *val, ExceptionSink *xsink);
417 
419 
429  DLLEXPORT QoreStringNode *read(qore_offset_t size, ExceptionSink *xsink);
430 
432 
443  DLLEXPORT QoreStringNode* read(qore_offset_t size, int timeout_ms, ExceptionSink *xsink);
444 
446 
453  DLLEXPORT int read(QoreString &str, qore_offset_t size, ExceptionSink *xsink);
454 
456 
462  DLLEXPORT BinaryNode *readBinary(qore_offset_t size, ExceptionSink *xsink);
463 
465 
471  DLLEXPORT int readBinary(BinaryNode &b, qore_offset_t size, ExceptionSink *xsink);
472 
474 
480  DLLEXPORT BinaryNode *readBinary(qore_offset_t size, int timeout_ms, ExceptionSink *xsink);
481 
483 
490  DLLEXPORT qore_size_t read(void *ptr, qore_size_t limit, int timeout_ms, ExceptionSink *xsink);
491 
493 
495  DLLEXPORT qore_size_t setPos(qore_size_t pos);
496 
498 
501  DLLEXPORT qore_size_t getPos();
502 
504 
506  DLLEXPORT qore_size_t getPos() const;
507 
509 
512  DLLEXPORT QoreStringNode *getchar();
513 
515 
520  DLLEXPORT QoreStringNode *getchar(ExceptionSink *xsink);
521 
523  DLLEXPORT std::string getFileNameStr() const;
524 
526  DLLEXPORT QoreStringNode* getFileName() const;
527 
528 #ifndef _Q_WINDOWS
529  DLLEXPORT int chown(uid_t owner, gid_t group, ExceptionSink *xsink);
531 
533  DLLEXPORT int lockBlocking(struct flock &fl, ExceptionSink *xsink);
534 
536  DLLEXPORT int lock(const struct flock &fl, ExceptionSink *xsink);
537 
539  DLLEXPORT int getLockInfo(struct flock &fl, ExceptionSink *xsink);
540 #endif
541 
543 
547  DLLEXPORT bool isDataAvailable(int timeout_ms, ExceptionSink *xsink) const;
548 
550 
553  DLLEXPORT QoreListNode *stat(ExceptionSink *xsink) const;
554 
556 
559  DLLEXPORT QoreHashNode *hstat(ExceptionSink *xsink) const;
560 
562 
565  DLLEXPORT QoreHashNode *statvfs(ExceptionSink *xsink) const;
566 
568 
570  DLLEXPORT int redirect(QoreFile& file, ExceptionSink* xsink);
571 
573 
576  DLLEXPORT int getFD() const;
577 
579  DLLEXPORT bool isOpen() const;
580 
582  DLLEXPORT bool isTty() const;
583 
585 
591  DLLEXPORT int detachFd();
592 
594  DLLLOCAL int setTerminalAttributes(int action, QoreTermIOS *ios, ExceptionSink *xsink) const;
595 
597  DLLLOCAL int getTerminalAttributes(QoreTermIOS *ios, ExceptionSink *xsink) const;
598 
599  // NOTE: QoreFile::makeSpecial() can only be called right after the constructor (private API)
600  DLLLOCAL void makeSpecial(int sfd);
601 
603  DLLLOCAL void setEventQueue(ExceptionSink* xsink, Queue* q, QoreValue arg, bool with_data);
604 
606  DLLLOCAL void cleanup(ExceptionSink *xsink);
607 };
608 
609 DLLEXPORT extern qore_classid_t CID_FILE;
610 DLLEXPORT extern QoreClass* QC_FILE;
611 DLLEXPORT extern QoreClass* QC_READONLYFILE;
612 
613 class File : public AbstractPrivateData, public QoreFile {
614 protected:
615  DLLLOCAL virtual ~File();
616 
617 public:
618  DLLLOCAL File(const QoreEncoding *cs);
619  DLLLOCAL virtual void deref(ExceptionSink *xsink);
620  DLLLOCAL virtual void deref();
621 };
622 
623 class QoreFileHelper : QorePrivateObjectAccessHelper {
624 public:
625  DLLEXPORT QoreFileHelper(QoreObject* obj, ExceptionSink* xsink);
626  DLLEXPORT ~QoreFileHelper();
627  DLLEXPORT QoreFile* operator*() const;
628  DLLEXPORT QoreFile* operator->() const;
629 };
630 
631 #endif // _QORE_QOREFILE_H
DLLEXPORT int writei2LSB(short i, ExceptionSink *xsink)
writes 2-byte (16bit) binary integer data in LSB (Least Significant Byte first, little endian) format...
DLLEXPORT int readi2LSB(short *val, ExceptionSink *xsink)
reads a 2-byte signed integer from the file in LSB (Least Significant Byte first, big endian) format ...
DLLLOCAL int setTerminalAttributes(int action, QoreTermIOS *ios, ExceptionSink *xsink) const
sets terminal attributes
defines string encoding functions in Qore
Definition: QoreEncoding.h:83
DLLEXPORT int lock(const hashdecl flock &fl, ExceptionSink *xsink)
perform a file lock operation, does not block
DLLEXPORT int writei8LSB(int64 i, ExceptionSink *xsink)
writes 8-byte (64bit) binary integer data in LSB (Least Significant Byte first, little endian) format...
DLLEXPORT int writei4LSB(int i, ExceptionSink *xsink)
writes 4-byte (32bit) binary integer data in LSB (Least Significant Byte first, little endian)format ...
This is the hash or associative list container type in Qore, dynamically allocated only...
Definition: QoreHashNode.h:50
DLLEXPORT qore_size_t setPos(qore_size_t pos)
sets the absolute file position to "pos"
DLLEXPORT QoreStringNode * readUntil(const char *bytes, bool incl_bytes, ExceptionSink *xsink)
reads string data from the file up to and optionally including the terminating EOL characters passed ...
the base class for all data to be used as private data of Qore objects
Definition: AbstractPrivateData.h:44
DLLLOCAL QoreFile & operator=(const QoreFile &)
this function is not implemented; it is here as a private function in order to prohibit it from being...
DLLEXPORT int writei1(char i, ExceptionSink *xsink)
writes 1-byte binary integer data to the file and returns the number of bytes written (normally 1) ...
DLLEXPORT const QoreEncoding * QCS_DEFAULT
the default encoding for the Qore library
DLLEXPORT int readi4(int *val, ExceptionSink *xsink)
reads a 4-byte signed integer from the file in MSB (Most Significant Byte first, big endian) format a...
DLLEXPORT int writei2(short i, ExceptionSink *xsink)
writes 2-byte (16bit) binary integer data in MSB (Most Significant Byte first, big endian) format to ...
DLLEXPORT int readi8LSB(int64 *val, ExceptionSink *xsink)
reads an 8-byte signed integer from the file in LSB (Least Significant Byte first, big endian) format and returns the value read as an output parameter
DLLLOCAL QoreFile(const QoreFile &)
this function is not implemented; it is here as a private function in order to prohibit it from being...
DLLEXPORT int chown(uid_t owner, gid_t group, ExceptionSink *xsink)
changes ownership of the file (if possible)
DLLEXPORT int readu2(unsigned short *val, ExceptionSink *xsink)
reads a 2-byte unsigned integer from the file in MSB (Most Significant Byte first, big endian) format and returns the value read as an output parameter
size_t qore_size_t
used for sizes (same range as a pointer)
Definition: common.h:73
DLLEXPORT int detachFd()
detaches and returns the file descriptor
DLLEXPORT int redirect(QoreFile &file, ExceptionSink *xsink)
redirects the current file (this) to the argument
DLLEXPORT int readi4LSB(int *val, ExceptionSink *xsink)
reads a 4-byte signed integer from the file in LSB (Least Significant Byte first, big endian) format ...
DLLLOCAL int getTerminalAttributes(QoreTermIOS *ios, ExceptionSink *xsink) const
gets terminal attributes
Qore&#39;s string type supported by the QoreEncoding class.
Definition: QoreString.h:81
Qore&#39;s string value type, reference counted, dynamically-allocated only.
Definition: QoreStringNode.h:50
DLLEXPORT bool isDataAvailable(int timeout_ms, ExceptionSink *xsink) const
returns true if data is available for the file descriptor
DLLEXPORT bool isTty() const
returns true if the file is a tty
DLLEXPORT int readi1(char *val, ExceptionSink *xsink)
reads a 1-byte signed integer from the file and returns the value read as an output parameter ...
This is the list container type in Qore, dynamically allocated only, reference counted.
Definition: QoreListNode.h:52
DLLEXPORT void setEncoding(const QoreEncoding *cs)
sets the encoding for the file
defines a Qore-language class
Definition: QoreClass.h:239
provides controlled access to file data through Qore data structures
Definition: QoreFile.h:66
virtual DLLLOCAL void deref()
decrements the reference count of the object without the possibility of throwing a Qore-language exce...
Definition: AbstractPrivateData.h:67
DLLEXPORT QoreStringNode * read(qore_offset_t size, ExceptionSink *xsink)
reads string data from the file and returns the string read (caller owns the reference count returned...
DLLEXPORT int getFD() const
get file descriptor
The main value class in Qore, designed to be passed by value.
Definition: QoreValue.h:262
DLLEXPORT QoreHashNode * hstat(ExceptionSink *xsink) const
returns a QoreHashNode with file status information
DLLEXPORT QoreStringNode * getchar()
reads a single byte from the file and returns it as a new string, caller owns the reference count ret...
the implementation of Qore&#39;s object data type, reference counted, dynamically-allocated only ...
Definition: QoreObject.h:61
unsigned qore_classid_t
used for the unique class ID for QoreClass objects
Definition: common.h:79
DLLEXPORT qore_size_t getPos()
returns the absolute byte position in the file
DLLEXPORT int writei8(int64 i, ExceptionSink *xsink)
writes 8-byte (64bit) binary integer data in MSB (Most Significant Byte first, big endian) format to ...
container for holding Qore-language exception information and also for registering a "thread_exit" ca...
Definition: ExceptionSink.h:48
DLLEXPORT int readu2LSB(unsigned short *val, ExceptionSink *xsink)
reads a 2-byte unsigned integer from the file in LSB (Least Significant Byte first, big endian) format and returns the value read as an output parameter
DLLEXPORT const QoreEncoding * getEncoding() const
returns the encoding used for the file
DLLEXPORT std::string getFileNameStr() const
returns the filename of the file being read as a std::string (the string is empty if no file name is ...
long long int64
64bit integer type, cannot use int64_t here since it breaks the API on some 64-bit systems due to equ...
Definition: common.h:260
DLLEXPORT QoreHashNode * statvfs(ExceptionSink *xsink) const
returns a QoreHashNode with filesystem status information
DLLEXPORT int readu1(unsigned char *val, ExceptionSink *xsink)
reads a 1-byte unsigned integer from the file and returns the value read as an output parameter ...
DLLEXPORT int write(const QoreString *str, ExceptionSink *xsink)
writes string data to the file, character encoding is converted if necessary, and returns the number ...
intptr_t qore_offset_t
used for offsets that could be negative
Definition: common.h:76
DLLEXPORT QoreStringNode * readLine(ExceptionSink *xsink)
reads string data from the file up to and including the terminating EOL characters (can be "\n"...
DLLEXPORT ~QoreFile()
closes the file and frees all memory allocated to the object
DLLEXPORT int readi2(short *val, ExceptionSink *xsink)
reads a 2-byte signed integer from the file in MSB (Most Significant Byte first, big endian) format a...
hashdecl qore_qf_private * priv
private implementation
Definition: QoreFile.h:69
DLLEXPORT int open2(ExceptionSink *xsink, const char *fn, int flags=O_RDONLY, int mode=0777, const QoreEncoding *cs=QCS_DEFAULT)
opens the file and raises a Qore-language exception if an error occurs
DLLEXPORT int getLockInfo(hashdecl flock &fl, ExceptionSink *xsink)
get lock info operation, does not block
DLLEXPORT int lockBlocking(hashdecl flock &fl, ExceptionSink *xsink)
perform a file lock operation
DLLEXPORT int open(const char *fn, int flags=O_RDONLY, int mode=0777, const QoreEncoding *cs=QCS_DEFAULT)
opens the file and returns 0 for success, non-zero for error
DLLEXPORT int writei4(int i, ExceptionSink *xsink)
writes 4-byte (32bit) binary integer data in MSB (Most Significant Byte first, big endian) format to ...
DLLEXPORT QoreStringNode * getFileName() const
returns the filename of the file being read (NULL if no file name is set); caller owns the reference ...
DLLEXPORT int sync()
flushes the write buffer to disk
DLLEXPORT int close()
closes the file
DLLLOCAL void setEventQueue(ExceptionSink *xsink, Queue *q, QoreValue arg, bool with_data)
sets the event queue (not part of the library&#39;s pubilc API), must be already referenced before call ...
DLLEXPORT int readu4(unsigned int *val, ExceptionSink *xsink)
reads a 4-byte unsigned integer from the file in MSB (Most Significant Byte first, big endian) format and returns the value read as an output parameter
DLLEXPORT int readu4LSB(unsigned int *val, ExceptionSink *xsink)
reads a 4-byte unsigned integer from the file in LSB (Least Significant Byte first, big endian) format and returns the value read as an output parameter
DLLEXPORT int readi8(int64 *val, ExceptionSink *xsink)
reads an 8-byte signed integer from the file in MSB (Most Significant Byte first, big endian) format ...
DLLEXPORT QoreListNode * stat(ExceptionSink *xsink) const
returns a QoreListNode with file status information
DLLEXPORT bool isOpen() const
returns true if the file is open, false if not
DLLLOCAL void cleanup(ExceptionSink *xsink)
internal API, must be called before deleting the object if an event queue is set
holds arbitrary binary data
Definition: BinaryNode.h:41
DLLEXPORT BinaryNode * readBinary(qore_offset_t size, ExceptionSink *xsink)
reads binary data from the file and returns the data read (caller owns the reference count returned) ...