202 lines
5.9 KiB
C++
202 lines
5.9 KiB
C++
/*
|
|
*
|
|
* Copyright (C) 1994-2011, 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: DcmInputBufferStream and related classes,
|
|
* implements input to blocks of memory as needed in the dcmnet module.
|
|
*
|
|
*/
|
|
|
|
#ifndef DCISTRMB_H
|
|
#define DCISTRMB_H
|
|
|
|
#include "dcmtk/config/osconfig.h"
|
|
#include "dcmtk/dcmdata/dcistrma.h"
|
|
|
|
|
|
/** producer class that reads data from a buffer provided by the caller.
|
|
* Used for DICOM network communication.
|
|
*/
|
|
class DCMTK_DCMDATA_EXPORT DcmBufferProducer: public DcmProducer
|
|
{
|
|
public:
|
|
/** constructor
|
|
*/
|
|
DcmBufferProducer();
|
|
|
|
/// destructor
|
|
virtual ~DcmBufferProducer();
|
|
|
|
/** 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;
|
|
|
|
/** 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;
|
|
|
|
/** 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);
|
|
|
|
/** 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);
|
|
|
|
/** adds the content of the given buffer to the input stream.
|
|
* @param buf buffer from which data is read. Must be allocated
|
|
* by caller and remain valid until releaseBuffer() is called
|
|
* @param buflen buffer length, must be even number > 0.
|
|
*/
|
|
virtual void setBuffer(const void *buf, offile_off_t buflen);
|
|
|
|
/** releases the current buffer. Should only be called when
|
|
* the content of the buffer has been read as far as possible.
|
|
* Pending input from the buffer is copied into an internal
|
|
* backup buffer if necessary. If an overflow condition
|
|
* occurs, the producer status becomes bad.
|
|
*/
|
|
virtual void releaseBuffer();
|
|
|
|
/** marks the end of stream, i.e. the data provided with the last call
|
|
* to setBuffer is the last data available in the stream.
|
|
*/
|
|
virtual void setEos();
|
|
|
|
private:
|
|
|
|
/// private unimplemented copy constructor
|
|
DcmBufferProducer(const DcmBufferProducer&);
|
|
|
|
/// private unimplemented copy assignment operator
|
|
DcmBufferProducer& operator=(const DcmBufferProducer&);
|
|
|
|
/// the user buffer we're actually reading from
|
|
unsigned char *buffer_;
|
|
|
|
/// the backup buffer
|
|
unsigned char *backup_;
|
|
|
|
/// size of the user buffer, in bytes
|
|
offile_off_t bufSize_;
|
|
|
|
/// number of bytes read from the user buffer
|
|
offile_off_t bufIndex_;
|
|
|
|
/// number of bytes read from the backup buffer
|
|
offile_off_t backupIndex_;
|
|
|
|
/// index of first valid byte in backup buffer, for putback
|
|
offile_off_t backupStart_;
|
|
|
|
/// status
|
|
OFCondition status_;
|
|
|
|
/// true if setEos has been called before
|
|
OFBool eosflag_;
|
|
|
|
};
|
|
|
|
|
|
/** input stream that reads from a buffer of fixed length
|
|
* which must be provided by the caller.
|
|
*/
|
|
class DCMTK_DCMDATA_EXPORT DcmInputBufferStream: public DcmInputStream
|
|
{
|
|
public:
|
|
/** constructor
|
|
*/
|
|
DcmInputBufferStream();
|
|
|
|
/// destructor
|
|
virtual ~DcmInputBufferStream();
|
|
|
|
/** 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;
|
|
|
|
/** adds the content of the given buffer to the input stream.
|
|
* @param buf buffer from which data is read. Must be allocated
|
|
* by caller and remain valid until releaseBuffer() is called
|
|
* @param buflen buffer length, must be even number > 0.
|
|
*/
|
|
virtual void setBuffer(const void *buf, offile_off_t buflen);
|
|
|
|
/** releases the current buffer. Should only be called when
|
|
* the content of the buffer has been read as far as possible.
|
|
* Pending input from the buffer is copied into an internal
|
|
* backup buffer if necessary. If an overflow condition
|
|
* occurs, the producer status becomes bad.
|
|
*/
|
|
virtual void releaseBuffer();
|
|
|
|
/** marks the end of stream, i.e. the data provided with the last call
|
|
* to setBuffer is the last data available in the stream.
|
|
*/
|
|
virtual void setEos();
|
|
|
|
private:
|
|
|
|
/// private unimplemented copy constructor
|
|
DcmInputBufferStream(const DcmInputBufferStream&);
|
|
|
|
/// private unimplemented copy assignment operator
|
|
DcmInputBufferStream& operator=(const DcmInputBufferStream&);
|
|
|
|
/// the final producer of the filter chain
|
|
DcmBufferProducer producer_;
|
|
|
|
};
|
|
|
|
|
|
#endif
|