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

170 lines
4.9 KiB
C++

/*
*
* Copyright (C) 1993-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: dcmqrdb
*
* Author: Marco Eichelberg
*
* Purpose: class DcmQueryRetrieveSCP
*
*/
#ifndef DCMQRSRV_H
#define DCMQRSRV_H
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
#include "dcmtk/ofstd/oftypes.h"
#include "dcmtk/dcmnet/assoc.h"
#include "dcmtk/dcmnet/dimse.h"
#include "dcmtk/dcmqrdb/dcmqrptb.h"
class DcmQueryRetrieveConfig;
class DcmQueryRetrieveOptions;
class DcmQueryRetrieveDatabaseHandle;
class DcmQueryRetrieveDatabaseHandleFactory;
/// enumeration describing reasons for refusing an association request
enum CTN_RefuseReason
{
/// too many concurrent associations
CTN_TooManyAssociations,
/// fork system function failed
CTN_CannotFork,
/// bad application context (not DICOM)
CTN_BadAppContext,
/// unknown peer application entity title (access not authorised)
CTN_BadAEPeer,
/// unknown peer application entity title (access not authorised)
CTN_BadAEService,
/// other non-specific reason
CTN_NoReason
};
/** main class for Query/Retrieve Service Class Provider
*/
class DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveSCP
{
public:
/** constructor
* @param config SCP configuration facility
* @param options SCP configuration options
* @param factory factory object used to create database handles
*/
DcmQueryRetrieveSCP(
const DcmQueryRetrieveConfig& config,
const DcmQueryRetrieveOptions& options,
const DcmQueryRetrieveDatabaseHandleFactory& factory);
/// destructor
virtual ~DcmQueryRetrieveSCP() { }
/** wait for incoming A-ASSOCIATE requests, perform association negotiation
* and serve the requests. May fork child processes depending on availability
* of the fork() system function and configuration options.
* @param theNet network structure for listen socket
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition waitForAssociation(T_ASC_Network *theNet);
/** set database flags
* @param dbCheckFindIdentifier flag indicating that a check should be performed for C-FIND requests
* @param dbCheckMoveIdentifier flag indicating that a check should be performed for C-MOVE requests
*/
void setDatabaseFlags(
OFBool dbCheckFindIdentifier,
OFBool dbCheckMoveIdentifier);
/** clean up terminated child processes.
*/
void cleanChildren();
private:
/// private undefined copy constructor
DcmQueryRetrieveSCP(const DcmQueryRetrieveSCP& other);
/// private undefined assignment operator
DcmQueryRetrieveSCP& operator=(const DcmQueryRetrieveSCP& other);
/** perform association negotiation for an incoming A-ASSOCIATE request based
* on the SCP configuration and option flags. No A-ASSOCIATE response is generated,
* this is left to the caller.
* @param assoc incoming association
* @return EC_Normal if successful, an error code otherwise
*/
OFCondition negotiateAssociation(T_ASC_Association * assoc);
OFCondition refuseAssociation(T_ASC_Association ** assoc, CTN_RefuseReason reason);
OFCondition handleAssociation(
T_ASC_Association * assoc,
OFBool correctUIDPadding);
OFCondition echoSCP(
T_ASC_Association * assoc,
T_DIMSE_C_EchoRQ * req,
T_ASC_PresentationContextID presId);
OFCondition findSCP(
T_ASC_Association * assoc,
T_DIMSE_C_FindRQ * request,
T_ASC_PresentationContextID presID,
DcmQueryRetrieveDatabaseHandle& dbHandle);
OFCondition getSCP(
T_ASC_Association * assoc,
T_DIMSE_C_GetRQ * request,
T_ASC_PresentationContextID presID,
DcmQueryRetrieveDatabaseHandle& dbHandle);
OFCondition moveSCP(
T_ASC_Association * assoc,
T_DIMSE_C_MoveRQ * request,
T_ASC_PresentationContextID presID,
DcmQueryRetrieveDatabaseHandle& dbHandle);
OFCondition storeSCP(
T_ASC_Association * assoc,
T_DIMSE_C_StoreRQ * req,
T_ASC_PresentationContextID presId,
DcmQueryRetrieveDatabaseHandle& dbHandle,
OFBool correctUIDPadding);
OFCondition dispatch(
T_ASC_Association *assoc,
OFBool correctUIDPadding);
static void refuseAnyStorageContexts(T_ASC_Association *assoc);
/// configuration facility
const DcmQueryRetrieveConfig *config_;
/// child process table, only used in multi-processing mode
DcmQueryRetrieveProcessTable processtable_;
/// flag for database interface: check C-FIND identifier
OFBool dbCheckFindIdentifier_;
/// flag for database interface: check C-MOVE identifier
OFBool dbCheckMoveIdentifier_;
/// factory object used to create database handles
const DcmQueryRetrieveDatabaseHandleFactory& factory_;
/// SCP configuration options
const DcmQueryRetrieveOptions& options_;
};
#endif