445 lines
11 KiB
C
445 lines
11 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 / Ralph Meyer
|
||
|
*
|
||
|
* Purpose: class DcmQueryRetrieveConfig
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef DCMQRCNF_H
|
||
|
#define DCMQRCNF_H
|
||
|
|
||
|
#include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */
|
||
|
|
||
|
#define INCLUDE_CSTDIO
|
||
|
#include "dcmtk/ofstd/ofstdinc.h"
|
||
|
#include "dcmtk/ofstd/ofcmdln.h"
|
||
|
#include "dcmtk/oflog/oflog.h"
|
||
|
#include "dcmtk/dcmqrdb/qrdefine.h"
|
||
|
|
||
|
extern DCMTK_DCMQRDB_EXPORT OFLogger DCM_dcmqrdbLogger;
|
||
|
|
||
|
#define DCMQRDB_TRACE(msg) OFLOG_TRACE(DCM_dcmqrdbLogger, msg)
|
||
|
#define DCMQRDB_DEBUG(msg) OFLOG_DEBUG(DCM_dcmqrdbLogger, msg)
|
||
|
#define DCMQRDB_INFO(msg) OFLOG_INFO(DCM_dcmqrdbLogger, msg)
|
||
|
#define DCMQRDB_WARN(msg) OFLOG_WARN(DCM_dcmqrdbLogger, msg)
|
||
|
#define DCMQRDB_ERROR(msg) OFLOG_ERROR(DCM_dcmqrdbLogger, msg)
|
||
|
#define DCMQRDB_FATAL(msg) OFLOG_FATAL(DCM_dcmqrdbLogger, msg)
|
||
|
|
||
|
/** this class describes configuration settings for the quota of a storage area
|
||
|
*/
|
||
|
struct DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfigQuota
|
||
|
{
|
||
|
/// maximum number of studies
|
||
|
int maxStudies;
|
||
|
/// maximum number of bytes per study
|
||
|
long maxBytesPerStudy;
|
||
|
};
|
||
|
|
||
|
/** this class describes configuration settings for a remote SCP peer
|
||
|
*/
|
||
|
struct DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfigPeer
|
||
|
{
|
||
|
/// remote peer AE title
|
||
|
const char *ApplicationTitle;
|
||
|
|
||
|
/// remote peer host name
|
||
|
const char *HostName;
|
||
|
|
||
|
/// remote peer port number
|
||
|
int PortNumber;
|
||
|
};
|
||
|
|
||
|
/** this class describes configuration settings for a single storage area
|
||
|
*/
|
||
|
struct DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfigAEEntry
|
||
|
{
|
||
|
/// application entity title
|
||
|
const char *ApplicationTitle;
|
||
|
|
||
|
/// name of storage area
|
||
|
const char *StorageArea;
|
||
|
|
||
|
/// access type (read-only, read/write)
|
||
|
const char *Access;
|
||
|
|
||
|
/// quota setting for this storage area
|
||
|
DcmQueryRetrieveConfigQuota *StorageQuota;
|
||
|
|
||
|
/// number of peer entries
|
||
|
int noOfPeers;
|
||
|
|
||
|
/// array of peer entries describing remote SCP peers
|
||
|
DcmQueryRetrieveConfigPeer *Peers;
|
||
|
};
|
||
|
|
||
|
/** this class describes configuration settings for a list of storage areas
|
||
|
*/
|
||
|
struct DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfigConfiguration
|
||
|
{
|
||
|
/// number of storage areas (aetitles)
|
||
|
int noOfAEEntries;
|
||
|
|
||
|
/// array of entries for each storage area
|
||
|
DcmQueryRetrieveConfigAEEntry *AEEntries;
|
||
|
};
|
||
|
|
||
|
/** this class describes configuration settings for one symbolic host or vendor
|
||
|
*/
|
||
|
struct DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfigHostEntry
|
||
|
{
|
||
|
/// symbolic name of host
|
||
|
const char *SymbolicName;
|
||
|
|
||
|
/// number of peer entries
|
||
|
int noOfPeers;
|
||
|
|
||
|
/// array of peer entries describing remote SCP peers
|
||
|
DcmQueryRetrieveConfigPeer *Peers;
|
||
|
};
|
||
|
|
||
|
/** this class describes configuration settings for a list of symbolic hosts or vendors
|
||
|
*/
|
||
|
struct DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfigHostTable
|
||
|
{
|
||
|
/// number of entries
|
||
|
int noOfHostEntries;
|
||
|
|
||
|
/// array of entries
|
||
|
DcmQueryRetrieveConfigHostEntry *HostEntries;
|
||
|
};
|
||
|
|
||
|
/** this class describes configuration settings for a Query/Retrieve SCP Service
|
||
|
*/
|
||
|
class DCMTK_DCMQRDB_EXPORT DcmQueryRetrieveConfig
|
||
|
{
|
||
|
|
||
|
public:
|
||
|
|
||
|
DcmQueryRetrieveConfig()
|
||
|
: UserName_()
|
||
|
, GroupName_()
|
||
|
, networkTCPPort_(0)
|
||
|
, maxPDUSize_(0)
|
||
|
, maxAssociations_(0)
|
||
|
, CNF_Config()
|
||
|
, CNF_HETable()
|
||
|
, CNF_VendorTable()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
~DcmQueryRetrieveConfig();
|
||
|
|
||
|
/*
|
||
|
* read configuration file and initialize the
|
||
|
* intern configuration structure
|
||
|
* Input : configuration file name
|
||
|
* Return : 1 - ok
|
||
|
* 0 - error
|
||
|
*/
|
||
|
int init(const char *ConfigurationFile);
|
||
|
|
||
|
/*
|
||
|
* search for peer with AETitle
|
||
|
* Input : AETitle
|
||
|
* Ouput : Host Name, Port Number
|
||
|
* Return : 1 - found in AETable
|
||
|
* 2 - found in HostTable
|
||
|
* 0 - not found
|
||
|
*/
|
||
|
int peerForAETitle(const char *AETitle, const char **HostName, int *PortNumber) const;
|
||
|
|
||
|
/*
|
||
|
* check if given AETitles exist in same
|
||
|
* Vendor Group
|
||
|
* Input : two AETitles
|
||
|
* Return : 1 - same group
|
||
|
* 0 - else
|
||
|
*/
|
||
|
int checkForSameVendor(const char *AETitle1, const char *AETitle2) const;
|
||
|
|
||
|
/*
|
||
|
* get Storage Area for AETitle
|
||
|
* Input : AETitle
|
||
|
* Return : Storage Area
|
||
|
*/
|
||
|
const char *getStorageArea(const char *AETitle) const;
|
||
|
|
||
|
/*
|
||
|
* get Number of Maximal Studies
|
||
|
* Input : AETitle
|
||
|
* Return : Number of Maximal Studies
|
||
|
*/
|
||
|
int getMaxStudies(const char *AETitle) const;
|
||
|
|
||
|
/*
|
||
|
* get Number of maximal Bytes per Study
|
||
|
* Input : AETitle
|
||
|
* Return : Number of maximal Bytes per Study
|
||
|
*/
|
||
|
long getMaxBytesPerStudy(const char *AETitle) const;
|
||
|
|
||
|
/*
|
||
|
* get Max Associations
|
||
|
* Input :
|
||
|
* Return : Max Associations
|
||
|
*/
|
||
|
int getMaxAssociations() const;
|
||
|
|
||
|
/*
|
||
|
* get Network TCP Port
|
||
|
* Input :
|
||
|
* Return : Network TCP Port
|
||
|
*/
|
||
|
int getNetworkTCPPort() const;
|
||
|
|
||
|
/*
|
||
|
* get Max PDU Size
|
||
|
* Input :
|
||
|
* Return : Max PDU Size
|
||
|
*/
|
||
|
OFCmdUnsignedInt getMaxPDUSize() const;
|
||
|
|
||
|
/*
|
||
|
* check if there is an peer with calling AETitle
|
||
|
* on HostName
|
||
|
* Input : called AETitle, calling AETitle, Host Name
|
||
|
* Return : 1 -- yes
|
||
|
* 0 -- no
|
||
|
*/
|
||
|
int peerInAETitle(const char *calledAETitle, const char *callingAETitle, const char *HostName) const;
|
||
|
|
||
|
/*
|
||
|
* get Access mode
|
||
|
* Input : AETitle
|
||
|
* Return : Access mode
|
||
|
*/
|
||
|
const char *getAccess(const char *AETitle) const;
|
||
|
|
||
|
/*
|
||
|
* check if given storage area is read/write
|
||
|
* Input : AETitle
|
||
|
* Return : true if storage area is writable
|
||
|
*/
|
||
|
OFBool writableStorageArea(const char *aeTitle) const;
|
||
|
|
||
|
// methods only used by TI
|
||
|
|
||
|
/*
|
||
|
* searches in the host table for all AE titles
|
||
|
* known for peer hostName. Creates an array of string pointers
|
||
|
* containing the known AE titles. The AE titles contained
|
||
|
* in the array are privately owned by the config facility (you
|
||
|
* may not free them). You may free the array when no longer needed.
|
||
|
*
|
||
|
* Input Parameter: peer host name
|
||
|
* Output Parameter: malloc'ed array of private string pointers.
|
||
|
* Returns : number of entries in the malloced array.
|
||
|
* 0 if no entries found.
|
||
|
*/
|
||
|
|
||
|
int aeTitlesForPeer(const char *hostName, const char *** aeTitleList) const;
|
||
|
|
||
|
/*
|
||
|
* Creates an array of string pointers
|
||
|
* containing the known AE titles for CTN storage areas.
|
||
|
* The AE titles contained in the array are privately owned
|
||
|
* by the config facility (you may not free them). You may
|
||
|
* free the array when no longer needed.
|
||
|
*
|
||
|
* Output Parameter: malloc'ed array of private string pointers.
|
||
|
* Returns : number of entries in the malloced array.
|
||
|
* 0 if no entries exist.
|
||
|
*/
|
||
|
|
||
|
int ctnTitles(const char *** ctnTitleList) const;
|
||
|
|
||
|
/*
|
||
|
* Creates an array of string pointers
|
||
|
* containing the kown Host Names for given Vendor Name.
|
||
|
* The Host Names contained in the array are privately owned
|
||
|
* by the config facility (you may not free them). You may
|
||
|
* free the array when no longer needed.
|
||
|
* Input : Vendor Name
|
||
|
* Ouput : array of string pointers
|
||
|
* Return : number of entries in array
|
||
|
* 0 if no entries exist
|
||
|
*/
|
||
|
int HostNamesForVendor(const char *Vendor, const char ***HostNameArray) const;
|
||
|
|
||
|
/*
|
||
|
* searches in the host table for all AE titles
|
||
|
* known for a symbolic name. Creates an array of string pointers
|
||
|
* containing the known AE titles. The AE titles contained
|
||
|
* in the array are privately owned by the config facility (you
|
||
|
* may not free them). You may free the array when no longer needed.
|
||
|
*
|
||
|
* Input Parameter: symbolic name
|
||
|
* Output Parameter: malloc'ed array of private string pointers.
|
||
|
* Returns : number of entries in the malloced array.
|
||
|
* 0 if no entries found.
|
||
|
*/
|
||
|
int aeTitlesForSymbolicName(const char *symbolicName, const char ***aeTitleList) const;
|
||
|
|
||
|
/*
|
||
|
* printf contents of configuration stucture
|
||
|
* to stdout
|
||
|
*/
|
||
|
void printConfig();
|
||
|
|
||
|
/*
|
||
|
* get User Name
|
||
|
* Input :
|
||
|
* Return : User Name
|
||
|
*/
|
||
|
const char *getUserName() const;
|
||
|
|
||
|
/*
|
||
|
* get Group Name
|
||
|
* Input :
|
||
|
* Return : Group Name
|
||
|
*/
|
||
|
const char *getGroupName() const;
|
||
|
|
||
|
private:
|
||
|
|
||
|
const char* vendorForPeerAETitle(const char *peerAETitle) const;
|
||
|
|
||
|
int countCtnTitles() const;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* initialize configuration storage structure
|
||
|
*/
|
||
|
void initConfigStruct();
|
||
|
|
||
|
/*
|
||
|
* read configuration file line by line
|
||
|
* Input : configuration file pointer
|
||
|
* Return : 1 - ok
|
||
|
* 0 - error
|
||
|
*/
|
||
|
int readConfigLines(FILE *cnffp);
|
||
|
|
||
|
/*
|
||
|
* read HostTable in configuration file
|
||
|
* Input : configuration file pointer, line number
|
||
|
* Output : line number
|
||
|
* Return : 1 - ok
|
||
|
* 0 - error
|
||
|
*/
|
||
|
int readHostTable(FILE *cnffp, int *lineno);
|
||
|
|
||
|
/*
|
||
|
* read VendorTable in configuration file
|
||
|
* Input : configuration file pointer, line number
|
||
|
* Output : line number
|
||
|
* Return : 1 - ok
|
||
|
* 0 - error
|
||
|
*/
|
||
|
int readVendorTable(FILE *cnffp, int *lineno);
|
||
|
|
||
|
/*
|
||
|
* read AETable in configuration file
|
||
|
* Input : configuration file pointer, line number
|
||
|
* Output : line number
|
||
|
* Return : 1 - ok
|
||
|
* 0 - error
|
||
|
*/
|
||
|
int readAETable(FILE *cnffp, int *lineno);
|
||
|
|
||
|
/*
|
||
|
* separate the peer list from value list
|
||
|
* Input : pointer to value list
|
||
|
* Output : number of peers
|
||
|
* Return : pointer to peer list
|
||
|
*/
|
||
|
DcmQueryRetrieveConfigPeer *parsePeers(char **valuehandle, int *peers);
|
||
|
|
||
|
/*
|
||
|
* extract peers from peer list
|
||
|
* Input : pointer to value list
|
||
|
* Output : number of peers
|
||
|
* Return : pointer to peer list
|
||
|
*/
|
||
|
DcmQueryRetrieveConfigPeer *readPeerList(char **valuehandle, int *peers);
|
||
|
|
||
|
/*
|
||
|
* separate a quota from value list
|
||
|
* Input : pointer to value list
|
||
|
* Return : pointer to quota structure
|
||
|
*/
|
||
|
static DcmQueryRetrieveConfigQuota *parseQuota(char **valuehandle);
|
||
|
|
||
|
/*
|
||
|
* check if character is white space or separator
|
||
|
* Input : character
|
||
|
* Return : 1 - yes
|
||
|
* 0 - no
|
||
|
*/
|
||
|
static int isgap (char gap);
|
||
|
|
||
|
/*
|
||
|
* check if character is quote
|
||
|
* Input : character
|
||
|
* Return : 1 - yes
|
||
|
* 0 - no
|
||
|
*/
|
||
|
static int isquote (char quote);
|
||
|
|
||
|
/*
|
||
|
* print a panic message to stderr
|
||
|
* Input : variable
|
||
|
*/
|
||
|
static void panic(const char *fmt, ...);
|
||
|
|
||
|
/*
|
||
|
* convert string to long
|
||
|
* Input : parameter string value
|
||
|
* Return : parameter as long
|
||
|
* -1 on error
|
||
|
*/
|
||
|
static long quota (const char *value);
|
||
|
|
||
|
/*
|
||
|
* skip mnemonic and first gap in rc line
|
||
|
* Input : rc line
|
||
|
* Return : pointer to value list
|
||
|
*/
|
||
|
static char *skipmnemonic (char *rcline);
|
||
|
|
||
|
/*
|
||
|
* separate on value from value list
|
||
|
* Input : pointer to value list
|
||
|
* Return : pointer to next value
|
||
|
*/
|
||
|
static char *parsevalues (char **valuehandle);
|
||
|
|
||
|
/* Configuration Parameters */
|
||
|
OFString UserName_;
|
||
|
OFString GroupName_;
|
||
|
int networkTCPPort_;
|
||
|
Uint32 maxPDUSize_;
|
||
|
int maxAssociations_;
|
||
|
DcmQueryRetrieveConfigConfiguration CNF_Config; /* configuration file contents */
|
||
|
DcmQueryRetrieveConfigHostTable CNF_HETable; /* HostEntries Table */
|
||
|
DcmQueryRetrieveConfigHostTable CNF_VendorTable; /* Vendor Table */
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif
|