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

328 lines
14 KiB
C++

/*
*
* Copyright (C) 1994-2015, 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 / Andrew Hewett
*
* Purpose: Classes for Query/Retrieve Service Class User (C-FIND operation)
*
*/
#ifndef DFINDSCU_H
#define DFINDSCU_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/ofcond.h" /* for class OFCondition */
#include "dcmtk/dcmdata/dcxfer.h" /* for E_TransferSyntax */
#include "dcmtk/dcmnet/dimse.h" /* for T_DIMSE_BlockingMode */
// forward declarations of classes and structs
class DcmDataset;
class DcmTransportLayer;
class OFConsoleApplication;
struct T_ASC_Association;
struct T_ASC_Parameters;
struct T_DIMSE_C_FindRQ;
struct T_DIMSE_C_FindRSP;
/** Abstract base class for Find SCU callbacks. During a C-FIND operation, the
* callback() method of a callback handler object derived from this class is
* called once for each incoming C-FIND-RSP message. The callback method has
* access to the original C-FIND-RQ message (but not the request dataset), the
* current C-FIND-RSP message including its dataset, the number of the current
* request, the association over which the request is received and the
* presentation context ID. The callback is needed to process the incoming
* message (e.g., display on screen, add to some list, store to file). The
* callback may also issue a C-FIND-CANCEL message if needed. Implementations
* may provide their own callbacks, which must be derived from this base
* class.
*/
class DCMTK_DCMNET_EXPORT DcmFindSCUCallback
{
public:
/// default constructor
DcmFindSCUCallback();
/// destructor
virtual ~DcmFindSCUCallback() {}
/** callback method that is called once for each incoming C-FIND-RSP message.
* @param request DIMSE command of the original C-FIND request
* @param responseCount number of current response
* @param rsp DIMSE command of incoming C-FIND response
* @param responseIdentifiers dataset of incoming C-FIND response
*/
virtual void callback(
T_DIMSE_C_FindRQ *request,
int responseCount,
T_DIMSE_C_FindRSP *rsp,
DcmDataset *responseIdentifiers) = 0;
/** assigns a value to member variable assoc_. Used by FindSCU code
* (class DcmFindSCU) to store a pointer to the current association
* before the callback object is used.
* @param assoc pointer to current association
*/
void setAssociation(T_ASC_Association *assoc);
/** assigns a value to member variable presId_. Used by FindSCU code
* (class DcmFindSCU) to store the current presentation context ID
* before the callback object is used.
* @param presId current presentation context ID
*/
void setPresentationContextID(T_ASC_PresentationContextID presId);
protected: /* the two member variables are protected and can be accessed from derived classes */
/// pointer to current association. Will contain valid value when callback() is called.
T_ASC_Association *assoc_;
/// current presentation context ID. Will contain valid value when callback() is called.
T_ASC_PresentationContextID presId_;
private:
/// private undefined copy constructor
DcmFindSCUCallback(const DcmFindSCUCallback& other);
/// private undefined assignment operator
DcmFindSCUCallback& operator=(const DcmFindSCUCallback& other);
};
/** Default implementation of FindSCU callback class. This implementation is
* used when no explicit callback is passed by the user, e.g. in the findscu tool.
*/
class DCMTK_DCMNET_EXPORT DcmFindSCUDefaultCallback: public DcmFindSCUCallback
{
public:
/** constructor
* @param extractResponsesToFile if true, C-FIND-RSP datasets will be stored as DICOM files
* @param cancelAfterNResponses if non-negative, a C-FIND-CANCEL will be issued after the
* given number of incoming C-FIND-RSP messages
* @param outputDirectory directory used to store the output files (e.g. response messages).
* If NULL, the current directory is used.
*/
DcmFindSCUDefaultCallback(
OFBool extractResponsesToFile,
int cancelAfterNResponses,
const char *outputDirectory = NULL);
/// destructor
virtual ~DcmFindSCUDefaultCallback() {}
/** callback method that is called once for each incoming C-FIND-RSP message.
* @param request DIMSE command of the original C-FIND request
* @param responseCount number of current response
* @param rsp DIMSE command of incoming C-FIND response
* @param responseIdentifiers dataset of incoming C-FIND response
*/
virtual void callback(
T_DIMSE_C_FindRQ *request,
int responseCount,
T_DIMSE_C_FindRSP *rsp,
DcmDataset *responseIdentifiers);
private:
/// if true, C-FIND-RSP datasets will be stored as DICOM files
OFBool extractResponsesToFile_;
/// if non-negative, a C-FIND-CANCEL will be issued after the given number of incoming C-FIND-RSP messages
int cancelAfterNResponses_;
/// directory used to store the output files (e.g. response messages)
OFString outputDirectory_;
};
/** This class implements a complete DICOM C-FIND SCU, including association set-up, execution of the
* C-FIND transaction including processing of results, and closing of the association. By default,
* incoming C-FIND-RSP messages will be displayed on console and, optionally, also stored in files.
* By providing a user-defined callback, other types of processing are possible.
*/
class DCMTK_DCMNET_EXPORT DcmFindSCU
{
public:
/// constructor, does not execute any network-related code
DcmFindSCU();
/// destructor. Destroys network structure if not done already.
virtual ~DcmFindSCU();
/** initialize the network structure. This should be done only once.
* @param acse_timeout timeout for ACSE operations, in seconds
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition initializeNetwork(int acse_timeout);
/** enable user-defined transport layer. This method is needed when
* the network association should use a non-default transport layer
* (e.g. a TLS connection). In this case a fully initialized transport
* layer object must be passed with this call after a call to
* initializeNetwork(), but prior to any call to performQuery().
* The transport layer object will not be deleted by this class and
* must remain alive until this object is deleted or a new transport
* layer is set.
* @param tLayer pointer to transport layer object
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition setTransportLayer(DcmTransportLayer *tLayer);
/** destroy network struct. This should be done only once.
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition dropNetwork();
/** main worker method that negotiates an association, executes one or more
* C-FIND-RQ transactions, processes the responses and closes the association
* once everything is finished (or an error has occurred).
* @param peer hostname or IP address of peer SCP host
* @param port TCP port number of peer SCP host
* @param ourTitle calling AE title
* @param peerTitle called AE title
* @param abstractSyntax SOP Class UID or Meta SOP Class UID of service
* @param preferredTransferSyntax May be Unknown, Implicit Little Endian, or any of the
* two uncompressed explicit VR transfer syntaxes. By default (unknown), local endian
* explicit VR is proposed first, followed by opposite endian explicit VR, followed by
* implicit VR. This behavior can be modified by explicitly specifying the preferred
* explicit VR transfer syntax. With Little Endian Implicit, only Implicit VR is proposed.
* @param blockMode DIMSE blocking mode
* @param dimse_timeout timeout for DIMSE operations (in seconds)
* @param maxReceivePDULength limit the maximum PDU size for incoming PDUs to the given value.
* This value should be less than or equal to ASC_DEFAULTMAXPDU, and is usually identical
* to ASC_DEFAULTMAXPDU (other values are only useful for debugging purposes).
* @param secureConnection this flag, if true, requests a secure TLS connection to be used
* instead of a normal connection. This will only work if DCMTK has been compiled with
* OpenSSL support (WITH_OPENSSL) and if a transport layer object supporting secure
* connections has been set with setTransportLayer() prior to this call.
* @param abortAssociation abort association instead of releasing it (for debugging purposes)
* @param repeatCount number of times this query should be repeated
* (for debugging purposes, works only with default callback)
* @param extractResponsesToFile if true, extract incoming response messages to file
* (works only with default callback)
* @param cancelAfterNResponses issue C-FIND-CANCEL after given number of responses
* (works only with default callback)
* @param overrideKeys list of keys/paths that override those in the query files, if any.
* Either the list of query files or override keys or both should be non-empty, because the
* query dataset will be empty otherwise. For path syntax see DcmPath.
* @param callback user-provided non-default callback handler object.
* For default callback, pass NULL.
* @param fileNameList list of query files. Each file is expected to be a DICOM file
* containing a dataset that is used as a query, possibly modified by override keys, if any.
* This parameter, if non-NULL, points to a list of filenames (paths).
* @param outputDirectory directory used to store the output files (e.g. response messages).
* If NULL, the current directory is used.
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition performQuery(
const char *peer,
unsigned int port,
const char *ourTitle,
const char *peerTitle,
const char *abstractSyntax,
E_TransferSyntax preferredTransferSyntax,
T_DIMSE_BlockingMode blockMode,
int dimse_timeout,
Uint32 maxReceivePDULength,
OFBool secureConnection,
OFBool abortAssociation,
unsigned int repeatCount,
OFBool extractResponsesToFile,
int cancelAfterNResponses,
OFList<OFString> *overrideKeys,
DcmFindSCUCallback *callback = NULL,
OFList<OFString> *fileNameList = NULL,
const char *outputDirectory = NULL);
/** static helper function that writes the content of the given dataset
* into a DICOM file (using the DICOM file format with metaheader).
* This method produces a temporary copy of the dataset and should, therefore,
* not be used with very large datasets.
* @param ofname filename to write
* @param dataset dataset to store in file
* @return EC_Normal if successful, an error code otherwise
*/
static OFBool writeToFile(const char* ofname, DcmDataset *dataset);
private:
/** add presentation context for given abstract syntax and given preferred transfer syntax
* to the ACSE parameter struct.
* @param params ACSE parameter struct to be modified
* @param abstractSyntax SOP Class UID or Meta SOP Class UID of service
* @param preferredTransferSyntax May be Unknown, Implicit Little Endian, or any of the
* two uncompressed explicit VR transfer syntaxes. By default (unknown), local endian
* explicit VR is proposed first, followed by opposite endian explicit VR, followed by
* implicit VR. This behavior can be modified by explicitly specifying the preferred
* explicit VR transfer syntax. With Little Endian Implicit, only Implicit VR is proposed.
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition addPresentationContext(
T_ASC_Parameters *params,
const char *abstractSyntax,
E_TransferSyntax preferredTransferSyntax);
/** perform a single C-FIND transaction on association that is already open.
* @param assoc DIMSE association
* @param fname file name for the query file to be used with this query. May be NULL.
* @param repeatCount number of times this query should be repeated
* (for debugging purposes, works only with default callback)
* @param abstractSyntax SOP Class UID or Meta SOP Class UID of service
* @param blockMode DIMSE blocking mode
* @param dimse_timeout timeout for DIMSE operations (in seconds)
* @param extractResponsesToFile if true, extract incoming response messages to file
* (works only with default callback)
* @param cancelAfterNResponses issue C-FIND-CANCEL after given number of responses
* (works only with default callback)
* @param overrideKeys list of keys/paths that override those in the query files, if any.
* Either the list of query files or override keys or both should be non-empty, because
* the query dataset will be empty otherwise. For path syntax see DcmPath.
* @param callback user-provided non-default callback handler object.
* For default callback, pass NULL.
* @param outputDirectory directory used to store the output files (e.g. response messages).
* If NULL, the current directory is used.
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition findSCU(
T_ASC_Association * assoc,
const char *fname,
int repeatCount,
const char *abstractSyntax,
T_DIMSE_BlockingMode blockMode,
int dimse_timeout,
OFBool extractResponsesToFile,
int cancelAfterNResponses,
OFList<OFString> *overrideKeys,
DcmFindSCUCallback *callback = NULL,
const char *outputDirectory = NULL) const;
/// Private undefined copy constructor
DcmFindSCU(const DcmFindSCU& other);
/// Private undefined assignment operator
DcmFindSCU& operator=(const DcmFindSCU& other);
private:
/// pointer to network structure
T_ASC_Network *net_;
};
#endif