DYTSrouce/Tool/3rdParty_x64/include/dcmtk/dcmdata/dcostrmb.h
2024-11-22 23:19:31 +08:00

169 lines
5.1 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: DcmOutputBufferStream and related classes,
* implements output to blocks of memory as needed in the dcmnet module.
*
*/
#ifndef DCOSTRMB_H
#define DCOSTRMB_H
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dcostrma.h"
/** consumer class that stores data in a buffer provided by the caller.
* Used for DICOM network communication.
*/
class DCMTK_DCMDATA_EXPORT DcmBufferConsumer: public DcmConsumer
{
public:
/** constructor
* @param buf buffer in which data is stored. Must be allocated
* by caller and remain valid during the lifetime of this object.
* @param bufLen buffer length, must be even number > 0.
*/
DcmBufferConsumer(void *buf, offile_off_t bufLen);
/// destructor
virtual ~DcmBufferConsumer();
/** returns the status of the consumer. Unless the status is good,
* the consumer will not permit any operation.
* @return status, true if good
*/
virtual OFBool good() const;
/** returns the status of the consumer as an OFCondition object.
* Unless the status is good, the consumer will not permit any operation.
* @return status, EC_Normal if good
*/
virtual OFCondition status() const;
/** returns true if the consumer is flushed, i.e. has no more data
* pending in it's internal state that needs to be flushed before
* the stream is closed.
* @return true if consumer is flushed, false otherwise
*/
virtual OFBool isFlushed() const;
/** returns the minimum number of bytes that can be written with the
* next call to write(). The DcmObject write 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 written "en bloc", i.e. all
* or nothing.
* @return minimum of space available in consumer
*/
virtual offile_off_t avail() const;
/** processes as many bytes as possible from the given input block.
* @param buf pointer to memory block, must not be NULL
* @param buflen length of memory block
* @return number of bytes actually processed.
*/
virtual offile_off_t write(const void *buf, offile_off_t buflen);
/** instructs the consumer to flush its internal content until
* either the consumer becomes "flushed" or I/O suspension occurs.
* After a call to flush(), a call to write() will produce undefined
* behaviour.
*/
virtual void flush();
/** retrieves and flushes the underlying buffer.
* After return of this method, the buffer is considered to have
* been flushed (copied, stored) by the caller and is reused
* by the next write operation.
* @param buffer pointer to user provided buffer returned in this parameter
* @param length number of bytes in buffer returned in this parameter
*/
virtual void flushBuffer(void *& buffer, offile_off_t& length);
/** query the number of bytes in buffer without flushing it.
* @return number of bytes in buffer.
*/
virtual offile_off_t filled();
private:
/// private unimplemented copy constructor
DcmBufferConsumer(const DcmBufferConsumer&);
/// private unimplemented copy assignment operator
DcmBufferConsumer& operator=(const DcmBufferConsumer&);
/// the buffer we're actually writing to
unsigned char *buffer_;
/// size of the buffer, in bytes
offile_off_t bufSize_;
/// number of bytes filled in buffer
offile_off_t filled_;
/// status
OFCondition status_;
};
/** output stream that writes into a buffer of fixed length
* which must be provided by the caller.
*/
class DCMTK_DCMDATA_EXPORT DcmOutputBufferStream: public DcmOutputStream
{
public:
/** constructor
* @param buf buffer in which data is stored. Must be allocated
* by caller and remain valid during the lifetime of this object.
* @param bufLen buffer length, must be even number > 0.
*/
DcmOutputBufferStream(void *buf, offile_off_t bufLen);
/// destructor
virtual ~DcmOutputBufferStream();
/** retrieves and flushes the underlying buffer.
* After return of this method, the buffer is considered to have
* been flushed (copied, stored) by the caller and is reused
* by the next write operation.
* @param buffer pointer to user provided buffer returned in this parameter
* @param length number of bytes in buffer returned in this parameter
*/
virtual void flushBuffer(void *& buffer, offile_off_t& length);
/** query the number of bytes in buffer without flushing it.
* @return number of bytes in buffer.
*/
virtual offile_off_t filled();
private:
/// private unimplemented copy constructor
DcmOutputBufferStream(const DcmOutputBufferStream&);
/// private unimplemented copy assignment operator
DcmOutputBufferStream& operator=(const DcmOutputBufferStream&);
/// the final consumer of the filter chain
DcmBufferConsumer consumer_;
};
#endif