das2C
das core C utilities (v3)
Loading...
Searching...
No Matches
io.h
Go to the documentation of this file.
1/* Copyright (C) 2015-2024 Chris Piker <chris-piker@uiowa.edu>
2 * Copyright (C) 2004-2006 Jeremy Faden <jeremy-faden@uiowa.edu>
3 *
4 * This file is part of das2C, the Core Das C Library.
5 *
6 * das2C is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License version 2.1 as published
8 * by the Free Software Foundation.
9 *
10 * das2C is distributed in the hope that it will be useful, but WITHOUT ANY
11 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * version 2.1 along with das2C; if not, see <http://www.gnu.org/licenses/>.
17 */
18
22#ifndef _das_io_h_
23#define _das_io_h_
24
25#include <stdio.h>
26#include <zlib.h>
27/* #include <das3/stream.h> */
28#include <das3/oob.h>
29#include <das3/processor.h>
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35/* max number of stream processor objects */
36#define DAS2_MAX_PROCESSORS 10
37
38#define DASIO_NAME_SZ 128
39
55typedef struct das_io_struct {
56 char rw; /* w' for write, 'r' for read, plus the tag style */
57 int model; /* Expected datastructure types in the stream */
58
59 bool compressed; /* 1 if stream is compressed or should be compressed */
60
61 bool bEmbedAsBytes; /* read-side: recover undecodable embedded formats as
62 opaque bytes instead of failing (DasIO_embedAsBytes) */
63
64 int mode; /* STREAM_MODE_STRING, STREAM_MODE_FILE,
65 * STREAM_MODE_SOCKET, STREAM_MODE_SSL */
66
67 char sName[DASIO_NAME_SZ]; /* A human readable name for data source or sink */
68
69 long int offset; /* current offset for file reads */
70
71 int dasver; /* Stream major version number, must be set explicitly for output */
72
73 /* Socket I/O */
74 int nSockFd; /* Socket file descriptor */
75
76 /* SSL I/O */
77 void* pSsl; /* OpenSSL connection */
78
79 /* File I/O */
80 FILE *file; /* input/output file (File I/O) */
81
82 /* Buffer IO */
83 char *sBuffer; /* buffer for string input/output */
84 int nLength; /* length of buffer pointed to by sbuffer */
85
86 /* Compressed I/O */
87 z_stream *zstrm; /* z_stream for inflate/deflate operations */
88 Byte *inbuf; /* input buffer */
89 Byte *outbuf; /* output buffer */
90 int zerr; /* error code for last stream operation */
91 int eof; /* set if end of input file */
92
93 /* data object processor's with callbacks (Input / Output) */
94 StreamHandler* pProcs[DAS2_MAX_PROCESSORS+1];
95 bool bSentHeader;
96
97 /* Sub Object Writing (output) */
98 DasBuf* pDb; /* Sub-Object serializing buffer */
99
100 int logLevel; /* to-stream logging level. (output) */
101
102 int taskSize; /* progress indicator max value (output) */
103 long tmLastProgMsg; /* Time the last progress message was emitted (output)*/
104
105 OobComment cmt; /* Hold buffers for comments and logs */
106
107 /* Feed (push-parser) state, non-NULL only for feed-mode objects.
108 * Definition is private to io.c */
109 struct das_feed_state* pFeed;
110} DasIO;
111
142DAS_API DasIO* new_DasIO_cfile(const char* sProg, FILE* file, const char* mode);
143
161DAS_API DasErrCode DasIO_model(DasIO* pThis, int nModel);
162
164#define DasIO_getModel(P) (P->model)
165
181DAS_API void DasIO_embedAsBytes(DasIO* pThis, bool bEnable);
182
183
201DAS_API DasIO* new_DasIO_cmd(const char* sProg, const char* sCmd);
202
203
204
220DAS_API DasIO* new_DasIO_file(const char* sProg, const char* sFile, const char* mode);
221
238DAS_API DasIO* new_DasIO_socket(const char* sProg, int nSockFd, const char* mode);
239
258DAS_API DasIO* new_DasIO_str(const char* sProg, char* sbuf, size_t len, const char* mode);
259
290DAS_API DasIO* new_DasIO_ssl(const char* sProg, void* pSsl, const char* mode);
291
322DAS_API DasIO* new_DasIO_feed(const char* sProg, const char* mode);
323
344DAS_API DasErrCode DasIO_feed(DasIO* pThis, const ubyte* pData, size_t uLen);
345
361
371DAS_API void del_DasIO(DasIO* pThis);
372
373
374
392DAS_API int DasIO_addProcessor(DasIO* pThis, StreamHandler* pProc);
393
407DAS_API int DasIO_readAll(DasIO* pThis);
408
409
422
431
446DAS_API DasErrCode DasIO_writeDesc(DasIO* pThis, DasDesc* pDesc, int iPktId);
447
459
472DAS_API DasErrCode DasIO_writeData(DasIO* pThis, DasDesc* pDesc, int iPktId);
473
479
487
488#define LOGLVL_FINEST 0
489#define LOGLVL_FINER 300
490#define LOGLVL_FINE 400
491#define LOGLVL_CONFIG 500
492#define LOGLVL_INFO 600
493#define LOGLVL_WARNING 700
494#define LOGLVL_ERROR 800
495
502DAS_API DasErrCode DasIO_sendLog(DasIO* pThis, int level, char * msg, ... );
503
523DAS_API void DasIO_setLogLvl(DasIO* pThis, int minLevel);
524
530DAS_API int DasIO_getLogLvl(const DasIO* pThis);
531
538DAS_API const char* das_loglvl_toStr(int logLevel);
539
540
541/* Identifies the size of task for producing a stream, in arbitrary units.
542 *
543 * This number is used to generate a relative progress position, and also as
544 * a weight if several Das2 Streams (implicitly of similar type) are combined.
545 * See setTaskProgress().
546 *
547 * @memberof DasIO
548 */
549DAS_API DasErrCode DasIO_setTaskSize(DasIO* pThis, int size);
550
563DAS_API DasErrCode DasIO_setTaskProgress( DasIO* pThis, int progress );
564
591 DasIO* pThis, DasStream* pSd, das_except_t type, char* msg
592);
593
601DAS_API void DasIO_close(DasIO* pThis);
602
615DAS_API int DasIO_serverExcept(DasIO* pThis, const char* fmt, ...);
616
633DAS_API int DasIO_queryExcept(DasIO* pThis, const char* fmt, ...);
634
635
652DAS_API int DasIO_closeNoData(DasIO* pThis, const char* fmt, ...);
653
663DAS_API int DasIO_printf(DasIO* pThis, const char* format, ...);
664
668DAS_API size_t DasIO_write(DasIO* pThis, const char* data, int length);
669
673DAS_API int DasIO_read(DasIO* pThis, DasBuf* pBuf, size_t nBytes);
674
681DAS_API int DasIO_readUntil(
682 DasIO* pThis, DasBuf* pBuf, size_t nBytes, char cStop
683);
684
689DAS_API int DasIO_getc(DasIO* pThis);
690
691#ifdef __cplusplus
692}
693#endif
694
695#endif /* _das_io_h_ */
int DasErrCode
return code type 0 indicates success, negative integer indicates failure
Definition defs.h:189
DAS_API const char * das_loglvl_toStr(int logLevel)
Returns a string identifying the log level.
DAS_API void del_DasIO(DasIO *pThis)
Free resources associated with a DasIO structure Typically you don't need to do this as heap memory i...
DAS_API int DasIO_queryExcept(DasIO *pThis, const char *fmt,...)
Throw a bad query exception and close the stream.
DAS_API int DasIO_serverExcept(DasIO *pThis, const char *fmt,...)
Throw a server exception and close the stream.
DAS_API int DasIO_closeNoData(DasIO *pThis, const char *fmt,...)
Send a "no data in interval" message and close the stream.
Defines the "Out of Band" objects in a stream.
Callback processing for das2 stream reads and writes.
Buffer class to handle accumulating byte streams.
Definition buffer.h:47
Base structure for Stream Header Items.
Definition descriptor.h:74
Tracks input and output operations for das2 stream headers and data.
Definition io.h:55
DAS_API int DasIO_read(DasIO *pThis, DasBuf *pBuf, size_t nBytes)
Analog of fread (Low-level API)
DAS_API DasIO * new_DasIO_socket(const char *sProg, int nSockFd, const char *mode)
Create a new DasIO object from a socket.
DAS_API DasIO * new_DasIO_cfile(const char *sProg, FILE *file, const char *mode)
Create a new DasIO object from a standard C FILE.
DAS_API DasErrCode DasIO_writeDesc(DasIO *pThis, DasDesc *pDesc, int iPktId)
Serialize a top-level descriptor to an destination.
DAS_API size_t DasIO_write(DasIO *pThis, const char *data, int length)
Analog of fwrite (Low-level API)
DAS_API DasErrCode DasIO_writeStreamDesc(DasIO *pThis, DasStream *pSd)
Writes the data describing the stream to the output channel (e.g.
DAS_API void DasIO_setLogLvl(DasIO *pThis, int minLevel)
Set the minimum log level that will be transmitted on the stream.
DAS_API DasErrCode DasIO_writeException(DasIO *pThis, OobExcept *pSe)
Output an exception structure.
DAS_API int DasIO_addProcessor(DasIO *pThis, StreamHandler *pProc)
Add a packet processor to be invoked during I/O operations.
DAS_API DasErrCode DasIO_feed(DasIO *pThis, const ubyte *pData, size_t uLen)
Push bytes into a feed-mode DasIO.
#define DasIO_throwException(IO, S, T, M)
Set the logging level.
DAS_API int DasIO_getLogLvl(const DasIO *pThis)
Get logging verbosity level.
DAS_API DasErrCode DasIO_setTaskProgress(DasIO *pThis, int progress)
Place rate-limited progress comments on an output stream.
DAS_API DasErrCode DasIO_writeComment(DasIO *pThis, OobComment *pSc)
Output a StreamComment Stream comments are generally messages interpreted only by humans and may chan...
DAS_API DasErrCode DasIO_writePktDesc(DasIO *pThis, PktDesc *pd)
Writes the data describing a packet type to the output channel (e.g.
DAS_API DasErrCode DasIO_writeData(DasIO *pThis, DasDesc *pDesc, int iPktId)
Send all packet data associated with a descriptor.
DAS_API int DasIO_getc(DasIO *pThis)
Analog of getc (Low-level API)
DAS_API DasIO * new_DasIO_ssl(const char *sProg, void *pSsl, const char *mode)
Create a new DasIO object using an encrypted connection.
DAS_API DasIO * new_DasIO_file(const char *sProg, const char *sFile, const char *mode)
Create a new DasIO object from a disk file.
DAS_API DasErrCode DasIO_model(DasIO *pThis, int nModel)
Set the parsed stream data model.
DAS_API void DasIO_embedAsBytes(DasIO *pThis, bool bEnable)
Recover undecodable embedded formats as opaque bytes instead of failing.
DAS_API DasErrCode DasIO_writePktData(DasIO *pThis, PktDesc *pPd)
Sends the data packet on to the stream after checking validity.
DAS_API DasIO * new_DasIO_cmd(const char *sProg, const char *sCmd)
Create a new DasIO object from a shell command.
DAS_API DasErrCode DasIO_feedEnd(DasIO *pThis)
Signal end-of-input to a feed-mode DasIO.
DAS_API void DasIO_close(DasIO *pThis)
Normal stream close with no unusual conditions Closes the output file descriptor, flushes a gzip buff...
DAS_API DasIO * new_DasIO_feed(const char *sProg, const char *mode)
Create a new DasIO object that parses bytes pushed into it.
DAS_API DasIO * new_DasIO_str(const char *sProg, char *sbuf, size_t len, const char *mode)
Create a new DasIO object for reading/writing to memory buffer.
DAS_API int DasIO_readUntil(DasIO *pThis, DasBuf *pBuf, size_t nBytes, char cStop)
Read until encountering a given byte (Low-level API)
DAS_API int DasIO_readAll(DasIO *pThis)
Starts the processing of the stream read from FILE* infile.
DAS_API int DasIO_printf(DasIO *pThis, const char *format,...)
Print a string with a format specifier (Low-level API) This works similar to the C printf function.
DAS_API DasErrCode DasIO_sendLog(DasIO *pThis, int level, char *msg,...)
Send a log message onto the stream at the given log level.
Describes the stream itself, in particular the compression used, current packetDescriptors,...
Definition stream.h:91
describes human-consumable messages that exist on the stream.
Definition oob.h:160
describes an exception that can live in a stream.
Definition oob.h:85
Holds information for a single packet type in a Das2 stream.
Definition packet.h:138
A set of callbacks used for input and output stream processing.
Definition processor.h:163