314 lines
12 KiB
C
314 lines
12 KiB
C
|
/*
|
||
|
*
|
||
|
* Copyright (C) 2000-2012, 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: dcmpstat
|
||
|
*
|
||
|
* Author: Marco Eichelberg
|
||
|
*
|
||
|
* Purpose:
|
||
|
* classes: DVPSPrintSCP
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef DVPSPRT_H
|
||
|
#define DVPSPRT_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||
|
|
||
|
#include "dcmtk/ofstd/ofstream.h"
|
||
|
#include "dcmtk/ofstd/ofstring.h"
|
||
|
#include "dcmtk/dcmpstat/dvpstyp.h" /* for enum types */
|
||
|
#include "dcmtk/dcmpstat/dvpspll.h" /* for class DVPSPresentationLUT_PList */
|
||
|
#include "dcmtk/dcmpstat/dvpsspl.h" /* for class DVPSStoredPrint_PList */
|
||
|
#include "dcmtk/dcmnet/assoc.h"
|
||
|
#include "dcmtk/dcmnet/dimse.h"
|
||
|
|
||
|
class DVInterface;
|
||
|
class DVPSFilmSession;
|
||
|
|
||
|
/** the representation of a Print Management SCP. This class implements most of the
|
||
|
* DIMSE behaviour of a DICOM Print SCP and uses Stored Print and Hardcopy Grayscale
|
||
|
* objects to store received print jobs in the local database.
|
||
|
*/
|
||
|
class DCMTK_DCMPSTAT_EXPORT DVPSPrintSCP
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
/** constructor
|
||
|
* @param iface Interface to database and config file
|
||
|
* @param cfname symbolic name of print SCP in config file
|
||
|
*/
|
||
|
DVPSPrintSCP(DVInterface &iface, const char *cfname);
|
||
|
|
||
|
/// destructor
|
||
|
virtual ~DVPSPrintSCP();
|
||
|
|
||
|
/** activates or deactivates dumping of the DIMSE communication
|
||
|
* in DICOM file format. This method should be called prior to
|
||
|
* association negotiation with negotiateAssociation().
|
||
|
* @param fname full path name of the file into which a log
|
||
|
* of the DIMSE communication is written after association release.
|
||
|
* NULL disables the DICOM DIMSE dump completely.
|
||
|
*/
|
||
|
void setDimseLogPath(const char *fname);
|
||
|
|
||
|
/** performs association negotiation for the Print SCP. Depending on the
|
||
|
* configuration file settings, Basic Grayscale Print and Presentation LUT
|
||
|
* are accepted with all uncompressed transfer syntaxes.
|
||
|
* If association negotiation is unsuccessful, an A-ASSOCIATE-RQ is sent
|
||
|
* and the association is dropped. If successful, an A-ASSOCIATE-AC is
|
||
|
* prepared but not (yet) sent.
|
||
|
* @param net DIMSE network over which to receive the association request
|
||
|
* @return result indicating whether association negotiation was successful,
|
||
|
* unsuccessful or whether termination of the server was requested.
|
||
|
*/
|
||
|
DVPSAssociationNegotiationResult negotiateAssociation(T_ASC_Network &net);
|
||
|
|
||
|
/** confirms an association negotiated with negotiateAssociation() and handles
|
||
|
* all DIMSE communication for the Print SCP. Returns after the association
|
||
|
* has been released or aborted.
|
||
|
*/
|
||
|
void handleClient();
|
||
|
|
||
|
private:
|
||
|
|
||
|
/// private undefined assignment operator
|
||
|
DVPSPrintSCP& operator=(const DVPSPrintSCP&);
|
||
|
|
||
|
/// private undefined copy constructor
|
||
|
DVPSPrintSCP(const DVPSPrintSCP& copy);
|
||
|
|
||
|
/** if the given condition indicates an error, prints the given string
|
||
|
* to the error log and returns true (nonzero), otherwise returns false.
|
||
|
* @param cond condition to be checked
|
||
|
* @param message to be printed, must not be NULL
|
||
|
* @return nonzero if cond indicates error, zero otherwise.
|
||
|
*/
|
||
|
int errorCond(OFCondition cond, const char *message);
|
||
|
|
||
|
/** sends A-ASSOCIATION-RQ as the result of an unsuccesful association
|
||
|
* negotiation.
|
||
|
* @param isBadContext defines the reason for the A-ASSOCIATE-RQ.
|
||
|
* true indicates an incorrect application context, false sends back
|
||
|
* an unspecified reject with no reason and is used when termination
|
||
|
* of the server application has been initiated.
|
||
|
* @return ASC_NORMAL if successful, an error code otherwise.
|
||
|
*/
|
||
|
OFCondition refuseAssociation(OFBool isBadContext);
|
||
|
|
||
|
/** destroys the association managed by this object.
|
||
|
*/
|
||
|
void dropAssociation();
|
||
|
|
||
|
/** handles any incoming N-GET-RQ message and sends back N-GET-RSP.
|
||
|
* @param rq request message
|
||
|
* @param presID presentation context over which the message was received
|
||
|
* @return DIMSE_NORMAL if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition handleNGet(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID);
|
||
|
|
||
|
/** handles any incoming N-SET-RQ message and sends back N-SET-RSP.
|
||
|
* @param rq request message
|
||
|
* @param presID presentation context over which the message was received
|
||
|
* @return DIMSE_NORMAL if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition handleNSet(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID);
|
||
|
|
||
|
/** handles any incoming N-ACTION-RQ message and sends back N-ACTION-RSP.
|
||
|
* @param rq request message
|
||
|
* @param presID presentation context over which the message was received
|
||
|
* @return DIMSE_NORMAL if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition handleNAction(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID);
|
||
|
|
||
|
/** handles any incoming N-CREATE-RQ message and sends back N-CREATE-RSP.
|
||
|
* @param rq request message
|
||
|
* @param presID presentation context over which the message was received
|
||
|
* @return DIMSE_NORMAL if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition handleNCreate(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID);
|
||
|
|
||
|
/** handles any incoming N-DELETE-RQ message and sends back N-DELETE-RSP.
|
||
|
* @param rq request message
|
||
|
* @param presID presentation context over which the message was received
|
||
|
* @return DIMSE_NORMAL if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition handleNDelete(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID);
|
||
|
|
||
|
/** handles any incoming C-ECHO-RQ message and sends back C-ECHO-RSP.
|
||
|
* @param rq request message
|
||
|
* @param presID presentation context over which the message was received
|
||
|
* @return DIMSE_NORMAL if successful, an error code otherwise
|
||
|
*/
|
||
|
OFCondition handleCEcho(T_DIMSE_Message& rq, T_ASC_PresentationContextID presID);
|
||
|
|
||
|
/** implements the N-GET operation for the Printer SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void printerNGet(T_DIMSE_Message& rq, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-SET operation for the Basic Film Session SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rqDataset request dataset, may be NULL
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void filmSessionNSet(T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-SET operation for the Basic Film Box SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rqDataset request dataset, may be NULL
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void filmBoxNSet(T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-SET operation for the Basic Grayscale Image Box SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rqDataset request dataset, may be NULL
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void imageBoxNSet(T_DIMSE_Message& rq, DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-ACTION operation for the Basic Film Session SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rsp response message, already initialized
|
||
|
*/
|
||
|
void filmSessionNAction(T_DIMSE_Message& rq, T_DIMSE_Message& rsp);
|
||
|
|
||
|
/** implements the N-ACTION operation for the Basic Film Box SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rsp response message, already initialized
|
||
|
*/
|
||
|
void filmBoxNAction(T_DIMSE_Message& rq, T_DIMSE_Message& rsp);
|
||
|
|
||
|
/** implements the N-CREATE operation for the Basic Film Session SOP Class.
|
||
|
* @param rqDataset request dataset, may be NULL
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void filmSessionNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-CREATE operation for the Basic Film Box SOP Class.
|
||
|
* @param rqDataset request dataset, may be NULL
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void filmBoxNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-CREATE operation for the Presentation LUT SOP Class.
|
||
|
* @param rqDataset request dataset, may be NULL
|
||
|
* @param rsp response message, already initialized
|
||
|
* @param rspDataset response dataset passed back in this parameter (if any)
|
||
|
*/
|
||
|
void presentationLUTNCreate(DcmDataset *rqDataset, T_DIMSE_Message& rsp, DcmDataset *& rspDataset);
|
||
|
|
||
|
/** implements the N-DELETE operation for the Basic Film Session SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rsp response message, already initialized
|
||
|
*/
|
||
|
void filmSessionNDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp);
|
||
|
|
||
|
/** implements the N-DELETE operation for the Basic Film Box SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rsp response message, already initialized
|
||
|
*/
|
||
|
void filmBoxNDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp);
|
||
|
|
||
|
/** implements the N-DELETE operation for the Presentation LUT SOP Class.
|
||
|
* @param rq request message
|
||
|
* @param rsp response message, already initialized
|
||
|
*/
|
||
|
void presentationLUTNDelete(T_DIMSE_Message& rq, T_DIMSE_Message& rsp);
|
||
|
|
||
|
/** stores the binary log of the DIMSE communication in a DICOM file
|
||
|
* in the log directory. Called upon association release or abort.
|
||
|
*/
|
||
|
void saveDimseLog();
|
||
|
|
||
|
/** adds an item to the given sequence containing the current date, time
|
||
|
* and the given text.
|
||
|
* @param seq sequence to which the item is added
|
||
|
* @param text text to be added, must not be NULL
|
||
|
*/
|
||
|
static void addLogEntry(DcmSequenceOfItems *seq, const char *text);
|
||
|
|
||
|
/** prints a dump of the given DIMSE message to the log stream.
|
||
|
* @param msg DIMSE message to be dumped
|
||
|
* @param dataset dataset to be dumped, may be NULL
|
||
|
* @param outgoing flag defining whether we are dumping an outgoing or an
|
||
|
* incoming message.
|
||
|
*/
|
||
|
void dumpNMessage(T_DIMSE_Message &msg, DcmItem *dataset, OFBool outgoing);
|
||
|
|
||
|
|
||
|
/* class data */
|
||
|
|
||
|
/* Interface to database and config file
|
||
|
*/
|
||
|
DVInterface& dviface;
|
||
|
|
||
|
/* symbolic name of print SCP in config file, not NULL.
|
||
|
*/
|
||
|
const char *cfgname;
|
||
|
|
||
|
/** blocking mode for receive
|
||
|
*/
|
||
|
T_DIMSE_BlockingMode blockMode;
|
||
|
|
||
|
/** timeout for receive
|
||
|
*/
|
||
|
int timeout;
|
||
|
|
||
|
/** basic film session instance
|
||
|
*/
|
||
|
DVPSFilmSession *filmSession;
|
||
|
|
||
|
/* Presentation LUT List
|
||
|
*/
|
||
|
DVPSPresentationLUT_PList presentationLUTList;
|
||
|
|
||
|
/* Stored Print List (contains Basic Film Boxes plus hierarchy)
|
||
|
*/
|
||
|
DVPSStoredPrint_PList storedPrintList;
|
||
|
|
||
|
/* the network association over which the print SCP is operating
|
||
|
*/
|
||
|
T_ASC_Association *assoc;
|
||
|
|
||
|
/// study UID for stored print and hardcopy images of one print session
|
||
|
DcmUniqueIdentifier studyInstanceUID;
|
||
|
|
||
|
/// series UID for presentation state objects
|
||
|
DcmUniqueIdentifier psSeriesInstanceUID;
|
||
|
|
||
|
/// series UID for hardcopy image objects
|
||
|
DcmUniqueIdentifier imageSeriesInstanceUID;
|
||
|
|
||
|
/// DIMSE communication logged in this object if present
|
||
|
DcmSequenceOfItems *logSequence;
|
||
|
|
||
|
/// ACSE communication logged in this object if present
|
||
|
DcmSequenceOfItems *acseSequence;
|
||
|
|
||
|
/// full path of the file into which the DIMSE log is written
|
||
|
OFString logPath;
|
||
|
|
||
|
};
|
||
|
|
||
|
#endif
|