/usr/include/dcmtk/dcmdata/dcistrma.h is in libdcmtk2-dev 3.6.0-9.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 | /*
*
* Copyright (C) 1994-2010, OFFIS e.V.
* All rights reserved. See COPYRIGHT file for details.
*
* This software and supporting documentation were developed by
*
* OFFIS e.V.
* R&D Division Health
* Escherweg 2
* D-26121 Oldenburg, Germany
*
*
* Module: dcmdata
*
* Author: Marco Eichelberg
*
* Purpose: base classes for input streams
*
* Last Update: $Author: joergr $
* Update Date: $Date: 2010-10-14 13:15:41 $
* CVS/RCS Revision: $Revision: 1.5 $
* Status: $State: Exp $
*
* CVS/RCS Log at end of file
*
*/
#ifndef DCISTRMA_H
#define DCISTRMA_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/ofstd/oftypes.h" /* for OFBool */
#include "dcmtk/ofstd/ofcond.h" /* for OFCondition */
#include "dcmtk/ofstd/offile.h" /* for offile_off_t */
#include "dcmtk/dcmdata/dcxfer.h" /* for E_StreamCompression */
class DcmInputStream;
/** pure virtual abstract base class for producers, i.e. the initial node
* of a filter chain in an input stream.
*/
class DcmProducer
{
public:
/// destructor
virtual ~DcmProducer()
{
}
/** returns the status of the producer. Unless the status is good,
* the producer will not permit any operation.
* @return status, true if good
*/
virtual OFBool good() const = 0;
/** returns the status of the producer as an OFCondition object.
* Unless the status is good, the producer will not permit any operation.
* @return status, EC_Normal if good
*/
virtual OFCondition status() const = 0;
/** returns true if the producer is at the end of stream.
* @return true if end of stream, false otherwise
*/
virtual OFBool eos() = 0;
/** returns the minimum number of bytes that can be read with the
* next call to read(). The DcmObject read methods rely on avail
* to return a value > 0 if there is no I/O suspension since certain
* data such as tag and length are only read "en bloc", i.e. all
* or nothing.
* @return minimum of data available in producer
*/
virtual offile_off_t avail() = 0;
/** reads as many bytes as possible into the given block.
* @param buf pointer to memory block, must not be NULL
* @param buflen length of memory block
* @return number of bytes actually read.
*/
virtual offile_off_t read(void *buf, offile_off_t buflen) = 0;
/** skips over the given number of bytes (or less)
* @param skiplen number of bytes to skip
* @return number of bytes actually skipped.
*/
virtual offile_off_t skip(offile_off_t skiplen) = 0;
/** resets the stream to the position by the given number of bytes.
* @param num number of bytes to putback. If the putback operation
* fails, the producer status becomes bad.
*/
virtual void putback(offile_off_t num) = 0;
};
/** pure virtual abstract base class for input filters, i.e.
* intermediate nodes of a filter chain in an input stream.
*/
class DcmInputFilter: public DcmProducer
{
public:
/// destructor
virtual ~DcmInputFilter()
{
}
/** determines the producer from which the filter is supposed
* to read it's input. Once a producer for the input filter has
* been defined, it cannot be changed anymore during the lifetime
* of the object.
* @param producer reference to producer, must not be circular chain
*/
virtual void append(DcmProducer& producer) = 0;
};
/** pure virtual abstract base class for input stream factories,
* i.e. objects that can create a new input stream
*/
class DcmInputStreamFactory
{
public:
/// destructor
virtual ~DcmInputStreamFactory()
{
}
/** create a new input stream object
* @return pointer to new input stream object
*/
virtual DcmInputStream *create() const = 0;
/** returns a pointer to a copy of this object
*/
virtual DcmInputStreamFactory *clone() const = 0;
};
/** abstract base class for input streams.
*/
class DcmInputStream
{
public:
/// destructor
virtual ~DcmInputStream();
/** returns the status of the stream. Unless the status is good,
* the stream will not permit any operation.
* @return status, true if good
*/
virtual OFBool good() const;
/** returns the status of the stream as an OFCondition object.
* Unless the status is good, the stream will not permit any operation.
* @return status, EC_Normal if good
*/
virtual OFCondition status() const;
/** returns true if the producer is at the end of stream.
* @return true if end of stream, false otherwise
*/
virtual OFBool eos();
/** returns the minimum number of bytes that can be read with the
* next call to read(). The DcmObject read methods rely on avail
* to return a value > 0 if there is no I/O suspension since certain
* data such as tag and length are only read "en bloc", i.e. all
* or nothing.
* @return minimum of data available in producer
*/
virtual offile_off_t avail();
/** reads as many bytes as possible into the given block.
* @param buf pointer to memory block, must not be NULL
* @param buflen length of memory block
* @return number of bytes actually read.
*/
virtual offile_off_t read(void *buf, offile_off_t buflen);
/** skips over the given number of bytes (or less)
* @param skiplen number of bytes to skip
* @return number of bytes actually skipped.
*/
virtual offile_off_t skip(offile_off_t skiplen);
/** returns the total number of bytes read from the stream so far
* @return total number of bytes read from the stream
*/
virtual offile_off_t tell() const;
/** installs a compression filter for the given stream compression type,
* which should be neither ESC_none nor ESC_unsupported. Once a compression
* filter is active, it cannot be deactivated or replaced during the
* lifetime of the stream.
* @param filterType type of compression filter
* @return EC_Normal if successful, an error code otherwise
*/
virtual OFCondition installCompressionFilter(E_StreamCompression filterType);
/** creates a new factory object for the current stream
* and stream position. When activated, the factory will be
* able to create new DcmInputStream delivering the same
* data as the current stream. Used to defer loading of
* value fields until accessed.
* If no factory object can be created (e.g. because the
* stream is not seekable), returns NULL.
* @return pointer to new factory object if successful, NULL otherwise.
*/
virtual DcmInputStreamFactory *newFactory() const = 0;
/** marks the current stream position for a later putback operation,
* overwriting a possibly existing prior putback mark.
* The DcmObject read methods rely on the possibility to putback
* up to 132 bytes for transfer syntax detection, parse error recovery etc.
* Implementations of this class should guarantee a putback capability
* of at least 1 kbyte.
*/
virtual void mark();
/** resets the stream to the position previously marked with
* setPutbackMark(). If the putback operation fails (no putback mark
* set or putback buffer exceeded), status of the producer switches to bad.
*/
virtual void putback();
protected:
/** protected constructor, to be called from derived class constructor
* @param initial initial pointer to first node in filter chain
* The pointer is not dereferenced in the constructor, so the
* object pointed to may be initialized later in the subclass
* constructor.
*/
DcmInputStream(DcmProducer *initial);
/** returns pointer to current producer object
*/
const DcmProducer *currentProducer() const;
private:
/// private unimplemented copy constructor
DcmInputStream(const DcmInputStream&);
/// private unimplemented copy assignment operator
DcmInputStream& operator=(const DcmInputStream&);
/// pointer to first node in filter chain
DcmProducer *current_;
/// pointer to compression filter, NULL if no compression
DcmInputFilter *compressionFilter_;
/// counter for number of bytes read so far
offile_off_t tell_;
/// putback marker
offile_off_t mark_;
};
#endif
/*
* CVS/RCS Log:
* $Log: dcistrma.h,v $
* Revision 1.5 2010-10-14 13:15:41 joergr
* Updated copyright header. Added reference to COPYRIGHT file.
*
* Revision 1.4 2009-11-04 09:58:07 uli
* Switched to logging mechanism provided by the "new" oflog module
*
* Revision 1.3 2007-02-19 15:45:41 meichel
* Class DcmInputStream and related classes are now safe for use with
* large files (2 GBytes or more) if supported by compiler and operating system.
*
* Revision 1.2 2005/12/08 16:28:15 meichel
* Changed include path schema for all DCMTK header files
*
* Revision 1.1 2002/08/27 16:55:32 meichel
* Initial release of new DICOM I/O stream classes that add support for stream
* compression (deflated little endian explicit VR transfer syntax)
*
*
*/
|