170 lines
4.9 KiB
C++
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
|