DYT/Tool/3rdParty_x64/include/dcmtk/dcmnet/dcmtrans.h
2024-11-22 23:19:31 +08:00

332 lines
13 KiB
C++

/*
*
* Copyright (C) 1998-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: dcmnet
*
* Author: Marco Eichelberg
*
* Purpose:
* classes: DcmTransportConnection, DcmTCPConnection
*
*/
#ifndef DCMTRANS_H
#define DCMTRANS_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/oftypes.h" /* for OFBool */
#include "dcmtk/dcmnet/dcmlayer.h" /* for DcmTransportLayerStatus */
#include "dcmtk/ofstd/ofstream.h" /* for ostream */
#define INCLUDE_UNISTD
#include "dcmtk/ofstd/ofstdinc.h"
/** this class represents a TCP/IP based transport connection
* which can be a transparent TCP/IP socket communication or a
* secure transport protocol such as TLS.
*/
class DCMTK_DCMNET_EXPORT DcmTransportConnection
{
public:
/** constructor.
* @param openSocket TCP/IP socket to be used for the transport connection.
* the connection must already be establised on socket level. This object
* takes over control of the socket.
*/
DcmTransportConnection(int openSocket);
/** destructor
*/
virtual ~DcmTransportConnection();
/** performs server side handshake on established socket.
* This function is used to establish a secure transport connection
* over the established TCP connection. Abstract method.
* @return TCS_ok if successful, an error code otherwise.
*/
virtual DcmTransportLayerStatus serverSideHandshake() = 0;
/** performs client side handshake on established socket.
* This function is used to establish a secure transport connection
* over the established TCP connection. Abstract method.
* @return TCS_ok if successful, an error code otherwise.
*/
virtual DcmTransportLayerStatus clientSideHandshake() = 0;
/** performs a re-negotiation of the connection with different
* connection parameters. Used to change the parameters of the
* secure transport connection. Abstract method.
* @param newSuite string identifying the ciphersuite to be negotiated.
* @return TCS_ok if successful, an error code otherwise.
*/
virtual DcmTransportLayerStatus renegotiate(const char *newSuite) = 0;
/** attempts to read nbyte bytes from the transport connection and
* writes them into the given buffer. Abstract method.
* @param buf buffer
* @param nbyte number of bytes to read
* @return number of bytes read, negative number if unsuccessful.
*/
virtual ssize_t read(void *buf, size_t nbyte) = 0;
/** attempts to write nbyte bytes from the given buffer
* to the transport connection. Abstract method.
* @param buf buffer
* @param nbyte number of bytes to write
* @return number of bytes written, negative number if unsuccessful.
*/
virtual ssize_t write(void *buf, size_t nbyte) = 0;
/** Closes the transport connection. If a secure connection
* is used, a closure alert is sent before the connection
* is closed. Abstract method.
*/
virtual void close() = 0;
/** returns the size in bytes of the peer certificate of a secure connection.
* May return 0 if connection is transparent TCP/IP.
* @return peer certificate length in bytes
*/
virtual unsigned long getPeerCertificateLength() = 0;
/* copies the peer certificate of a secure connection into a buffer
* specified by the caller. If the buffer is too small to hold the
* certificate, nothing is copied and zero is returned.
* @param buf buffer into which the certificate is written
* @param bufLen size of the buffer in bytes
* @return number of bytes written, always less or equal bufLen.
*/
virtual unsigned long getPeerCertificate(void *buf, unsigned long bufLen) = 0;
/** checks if data is available to be read on the transport connection.
* Abstract method.
* @param timeout maximum number of seconds to wait if no data is available.
* If this parameter is 0, the function does not block.
* @returns OFTrue if data is available, OFFalse otherwise.
*/
virtual OFBool networkDataAvailable(int timeout) = 0;
/** returns OFTrue if this connection is a transparent TCP connection,
* OFFalse if the connection is a secure connection.
*/
virtual OFBool isTransparentConnection() = 0;
/** dump the characteristics of the current connection
* @param str the string to dump into
* @return reference to string
*/
virtual OFString& dumpConnectionParameters(OFString& str) = 0;
/** prints the characteristics of the current connection
* on the given output stream.
* @param out output stream
* @deprecated Please use the other dumpConnectionParameters() function instead!
*/
void dumpConnectionParameters(STD_NAMESPACE ostream& out);
/** returns an error string for a given error code.
* @param code error code
* @return description for error code
*/
virtual const char *errorString(DcmTransportLayerStatus code) = 0;
/** indicates which of the specified transport connections is ready for
* reading. If none of the specified transport connections is ready
* for reading, this method blocks up to the specified timeout interval
* or until one of the connections becomes readable, whatever occurs
* first.
* @param connections list of transport connections. May contain NULL entries.
* Upon successful return of this method, all transport connections which are
* not ready for reading are set to NULL in this array.
* @param connCount number of entries in connections array.
* @param timeout number of seconds for timeout. If timeout is 0, this method
* does not block.
* @return OFTrue if one or more connections are readable upon return from
* this method, OFFalse if no connection is ready for reading.
*/
static OFBool selectReadableAssociation(DcmTransportConnection *connections[], int connCount, int timeout);
protected:
/** returns the socket file descriptor managed by this object.
* @return socket file descriptor
*/
int getSocket() { return theSocket; }
/** set the socket file descriptor managed by this object.
* @param socket file descriptor
*/
void setSocket(int socket) { theSocket = socket; }
private:
/// private undefined copy constructor
DcmTransportConnection(const DcmTransportConnection&);
/// private undefined assignment operator
DcmTransportConnection& operator=(const DcmTransportConnection&);
/** indicates which of the specified transport connections is ready for
* reading. If none of the specified transport connections is ready
* for reading, this method blocks up to the specified timeout interval
* or until one of the connections becomes readable, whatever occurs
* first. This method uses a safe approach that also works with secure
* transport connections, but which may be slower than a select() system
* call and consumes slightly more computation time.
* @param connections list of transport connections. May contain NULL entries.
* Upon successful return of this method, all transport connections which are
* not ready for reading are set to NULL in this array.
* @param connCount number of entries in connections array.
* @param timeout number of seconds for timeout. If timeout is 0, this method
* does not block.
* @return OFTrue if one or more connections are readable upon return from
* this method, OFFalse if no connection is ready for reading.
*/
static OFBool safeSelectReadableAssociation(DcmTransportConnection *connections[], int connCount, int timeout);
/** indicates which of the specified transport connections is ready for
* reading. If none of the specified transport connections is ready
* for reading, this method blocks up to the specified timeout interval
* or until one of the connections becomes readable, whatever occurs
* first. This method uses the select() system call. It may only be used
* with an array of transparent TCP transport connections. This precondition
* must be assured by the caller.
* @param connections list of transport connections. May contain NULL entries.
* Upon successful return of this method, all transport connections which are
* not ready for reading are set to NULL in this array.
* @param connCount number of entries in connections array.
* @param timeout number of seconds for timeout. If timeout is 0, this method
* does not block.
* @return OFTrue if one or more connections are readable upon return from
* this method, OFFalse if no connection is ready for reading.
*/
static OFBool fastSelectReadableAssociation(DcmTransportConnection *connections[], int connCount, int timeout);
/// the socket file descriptor used by the transport connection.
int theSocket;
};
/** this class represents a TCP/IP based transport connection.
*/
class DCMTK_DCMNET_EXPORT DcmTCPConnection: public DcmTransportConnection
{
public:
/** constructor.
* @param openSocket TCP/IP socket to be used for the transport connection.
* the connection must already be establised on socket level. This object
* takes over control of the socket.
*/
DcmTCPConnection(int openSocket);
/** destructor
*/
virtual ~DcmTCPConnection();
/** performs server side handshake on established socket.
* This function is used to establish a secure transport connection
* over the established TCP connection.
* @return TCS_ok if successful, an error code otherwise.
*/
virtual DcmTransportLayerStatus serverSideHandshake();
/** performs client side handshake on established socket.
* This function is used to establish a secure transport connection
* over the established TCP connection.
* @return TCS_ok if successful, an error code otherwise.
*/
virtual DcmTransportLayerStatus clientSideHandshake();
/** performs a re-negotiation of the connection with different
* connection parameters. Used to change the parameters of the
* secure transport connection.
* @param newSuite string identifying the ciphersuite to be negotiated.
* @return TCS_ok if successful, an error code otherwise.
*/
virtual DcmTransportLayerStatus renegotiate(const char *newSuite);
/** attempts to read nbyte bytes from the transport connection and
* writes them into the given buffer.
* @param buf buffer
* @param nbyte number of bytes to read
* @return number of bytes read, negative number if unsuccessful.
*/
virtual ssize_t read(void *buf, size_t nbyte);
/** attempts to write nbyte bytes from the given buffer
* to the transport connection.
* @param buf buffer
* @param nbyte number of bytes to write
* @return number of bytes written, negative number if unsuccessful.
*/
virtual ssize_t write(void *buf, size_t nbyte);
/** Closes the transport connection. If a secure connection
* is used, a closure alert is sent before the connection
* is closed.
*/
virtual void close();
/** returns the size in bytes of the peer certificate of a secure connection.
* May return 0 if connection is transparent TCP/IP.
* @return peer certificate length in bytes
*/
virtual unsigned long getPeerCertificateLength();
/* copies the peer certificate of a secure connection into a buffer
* specified by the caller. If the buffer is too small to hold the
* certificate, nothing is copied and zero is returned.
* @param buf buffer into which the certificate is written
* @param bufLen size of the buffer in bytes
* @return number of bytes written, always less or equal bufLen.
*/
virtual unsigned long getPeerCertificate(void *buf, unsigned long bufLen);
/** checks if data is available to be read on the transport connection.
* @param timeout maximum number of seconds to wait if no data is available.
* If this parameter is 0, the function does not block.
* @returns OFTrue if data is available, OFFalse otherwise.
*/
virtual OFBool networkDataAvailable(int timeout);
/** returns OFTrue if this connection is a transparent TCP connection,
* OFFalse if the connection is a secure connection.
*/
virtual OFBool isTransparentConnection();
/** dump the characteristics of the current connection
* @param str the string to dump into
* @return reference to string
*/
virtual OFString& dumpConnectionParameters(OFString& str);
/** returns an error string for a given error code.
* @param code error code
* @return description for error code
*/
virtual const char *errorString(DcmTransportLayerStatus code);
private:
/// private undefined copy constructor
DcmTCPConnection(const DcmTCPConnection&);
/// private undefined assignment operator
DcmTCPConnection& operator=(const DcmTCPConnection&);
};
#endif