00001 /* 00002 Copyright (C) 1993, 1994, RSNA and Washington University 00003 00004 The software and supporting documentation for the Radiological 00005 Society of North America (RSNA) 1993, 1994 Digital Imaging and 00006 Communications in Medicine (DICOM) Demonstration were developed 00007 at the 00008 Electronic Radiology Laboratory 00009 Mallinckrodt Institute of Radiology 00010 Washington University School of Medicine 00011 510 S. Kingshighway Blvd. 00012 St. Louis, MO 63110 00013 as part of the 1993, 1994 DICOM Central Test Node project for, and 00014 under contract with, the Radiological Society of North America. 00015 00016 THIS SOFTWARE IS MADE AVAILABLE, AS IS, AND NEITHER RSNA NOR 00017 WASHINGTON UNIVERSITY MAKE ANY WARRANTY ABOUT THE SOFTWARE, ITS 00018 PERFORMANCE, ITS MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR 00019 USE, FREEDOM FROM ANY COMPUTER DISEASES OR ITS CONFORMITY TO ANY 00020 SPECIFICATION. THE ENTIRE RISK AS TO QUALITY AND PERFORMANCE OF 00021 THE SOFTWARE IS WITH THE USER. 00022 00023 Copyright of the software and supporting documentation is 00024 jointly owned by RSNA and Washington University, and free access 00025 is hereby granted as a license to use this software, copy this 00026 software and prepare derivative works based upon this software. 00027 However, any distribution of this software source code or 00028 supporting documentation or derivative works (source code and 00029 supporting documentation) must include the three paragraphs of 00030 the copyright notice. 00031 */ 00032 /* Copyright marker. Copyright will be inserted above. Do not remove */ 00033 /* 00034 ** @$=@$=@$= 00035 */ 00036 /* 00037 ** DICOM 93 00038 ** Electronic Radiology Laboratory 00039 ** Mallinckrodt Institute of Radiology 00040 ** Washington University School of Medicine 00041 ** 00042 ** Module Name(s): 00043 ** Author, Date: Stephen M. Moore, 14-Apr-1993 00044 ** Intent: This file defines the public structures and constants 00045 ** and the function prototypes for the DUL (DICOM Upper 00046 ** Layer) facility. 00047 ** Last Update: $Author: meichel $, $Date: 2005/12/12 15:15:08 $ 00048 ** Source File: $RCSfile: dul.h,v $ 00049 ** Revision: $Revision: 1.23 $ 00050 ** Status: $State: Exp $ 00051 */ 00052 00053 00054 #ifndef DUL_IS_IN 00055 #define DUL_IS_IN 1 00056 00057 #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ 00058 #include "dcmtk/ofstd/ofglobal.h" 00059 #include "dcmtk/ofstd/oftypes.h" 00060 #include "dcmtk/ofstd/ofcast.h" 00061 #include "dcmtk/dcmnet/extneg.h" 00062 #include "dcmtk/dcmnet/dicom.h" 00063 00064 class DcmTransportConnection; 00065 class DcmTransportLayer; 00066 class LST_HEAD; 00067 00074 extern OFGlobal<OFBool> dcmDisableGethostbyaddr; /* default OFFalse */ 00075 00079 extern OFGlobal<Sint32> dcmConnectionTimeout; /* default -1 */ 00080 00085 extern OFGlobal<int> dcmExternalSocketHandle; /* default -1 */ 00086 00093 extern OFGlobal<const char *> dcmTCPWrapperDaemonName; /* default NULL */ 00094 00095 /* Global option flag for compatibility with DCMTK releases prior to 3.0 00096 * Default (0) is automatic handling, which should work in most cases. 00097 */ 00098 extern OFGlobal<unsigned long> dcmEnableBackwardCompatibility; 00099 00100 #ifndef DUL_KEYS 00101 #define DUL_KEYS 1 00102 typedef void DUL_NETWORKKEY; 00103 typedef void DUL_ASSOCIATIONKEY; 00104 typedef unsigned char DUL_PRESENTATIONCONTEXTID; 00105 #endif 00106 00107 /* Define a structure containing fixed length fields that can 00108 * be used for requesting or accepting an association. The 00109 * lengths of "titles" and "names" are specified by the DICOM 00110 * protocol document. The fields in the structure are made 00111 * longer to allow for zero-terminators. DICOM doesn't know 00112 * about node names, but the DUL_ package needs them. 00113 */ 00114 00115 #define DUL_LEN_TITLE OFstatic_cast(size_t, 16) /* required by DICOM protocol */ 00116 #define DUL_LEN_NAME OFstatic_cast(size_t, 64) /* required by DICOM protocol */ 00117 #define DUL_LEN_UID OFstatic_cast(size_t, 64) /* required by DICOM protocol */ 00118 #define DUL_LEN_NODE OFstatic_cast(size_t, 127) /* should be "big enough" */ 00119 00120 00121 /* DICOM PDU Types */ 00122 00123 #define DUL_TYPEASSOCIATERQ OFstatic_cast(unsigned char, 0x01) 00124 #define DUL_TYPEASSOCIATEAC OFstatic_cast(unsigned char, 0x02) 00125 #define DUL_TYPEASSOCIATERJ OFstatic_cast(unsigned char, 0x03) 00126 #define DUL_TYPEDATA OFstatic_cast(unsigned char, 0x04) 00127 #define DUL_TYPERELEASERQ OFstatic_cast(unsigned char, 0x05) 00128 #define DUL_TYPERELEASERP OFstatic_cast(unsigned char, 0x06) 00129 #define DUL_TYPEABORT OFstatic_cast(unsigned char, 0x07) 00130 00131 #define DUL_MAXTYPE OFstatic_cast(unsigned char, 0x07) 00132 00135 class DUL_ModeCallback 00136 { 00137 public: 00138 00140 virtual ~DUL_ModeCallback() {} 00141 00145 virtual void callback(unsigned long mode) = 0; 00146 }; 00147 00148 typedef struct { 00149 char applicationContextName[DUL_LEN_NAME + 1]; 00150 char callingAPTitle[DUL_LEN_TITLE + 1]; 00151 char calledAPTitle[DUL_LEN_TITLE + 1]; 00152 char respondingAPTitle[DUL_LEN_TITLE + 1]; 00153 unsigned long maxPDU; 00154 unsigned short result; 00155 unsigned short resultSource; 00156 unsigned short diagnostic; 00157 char callingPresentationAddress[64]; 00158 char calledPresentationAddress[64]; 00159 LST_HEAD *requestedPresentationContext; 00160 LST_HEAD *acceptedPresentationContext; 00161 unsigned short maximumOperationsInvoked; 00162 unsigned short maximumOperationsPerformed; 00163 char callingImplementationClassUID[DICOM_UI_LENGTH + 1]; 00164 char callingImplementationVersionName[16 + 1]; 00165 char calledImplementationClassUID[DICOM_UI_LENGTH + 1]; 00166 char calledImplementationVersionName[16 + 1]; 00167 unsigned long peerMaxPDU; 00168 SOPClassExtendedNegotiationSubItemList *requestedExtNegList; 00169 SOPClassExtendedNegotiationSubItemList *acceptedExtNegList; 00170 OFBool useSecureLayer; 00171 } DUL_ASSOCIATESERVICEPARAMETERS; 00172 00173 typedef enum { 00174 DUL_SC_ROLE_DEFAULT, 00175 DUL_SC_ROLE_SCU, 00176 DUL_SC_ROLE_SCP, 00177 DUL_SC_ROLE_SCUSCP 00178 } DUL_SC_ROLE; 00179 00180 #define DUL_PRESENTATION_ACCEPT 0 00181 #define DUL_PRESENTATION_REJECT_USER 1 00182 #define DUL_PRESENTATION_REJECT_NOREASON 2 00183 #define DUL_PRESENTATION_REJECT_ABSTRACT_SYNTAX 3 00184 #define DUL_PRESENTATION_REJECT_TRANSFER_SYNTAX 4 00185 00186 typedef OFList<char *> DUL_TRANSFERSYNTAXLIST; 00187 00188 typedef struct { 00189 void *reserved[2]; 00190 DUL_PRESENTATIONCONTEXTID presentationContextID; 00191 char abstractSyntax[DUL_LEN_UID + 1]; 00192 LST_HEAD *proposedTransferSyntax; 00193 char acceptedTransferSyntax[DUL_LEN_UID + 1]; 00194 unsigned char result; 00195 DUL_SC_ROLE proposedSCRole; 00196 DUL_SC_ROLE acceptedSCRole; 00197 } DUL_PRESENTATIONCONTEXT; 00198 00199 typedef struct { 00200 void *reserved[2]; 00201 char transferSyntax[DUL_LEN_UID + 1]; 00202 } DUL_TRANSFERSYNTAX; 00203 00204 typedef struct dul_abortitems { 00205 unsigned char result; 00206 unsigned char source; 00207 unsigned char reason; 00208 } DUL_ABORTITEMS; 00209 00210 typedef enum { 00211 DUL_COMMANDPDV, /* A command PDV inside a data PDU */ 00212 DUL_DATASETPDV 00213 } /* A data set PDV inside a data PDU */ 00214 DUL_DATAPDV; 00215 00216 typedef enum { 00217 DUL_BLOCK, /* Block on an operation (read, request) */ 00218 DUL_NOBLOCK 00219 } /* Or return immediately if nothing avail */ 00220 DUL_BLOCKOPTIONS; 00221 00222 typedef struct { 00223 unsigned long fragmentLength; 00224 unsigned char presentationContextID; 00225 DUL_DATAPDV pdvType; 00226 OFBool lastPDV; 00227 void *data; 00228 } DUL_PDV; 00229 00230 typedef struct { 00231 unsigned long count; 00232 void *scratch; 00233 unsigned long scratchLength; 00234 DUL_ABORTITEMS abort; 00235 DUL_PDV *pdv; 00236 } DUL_PDVLIST; 00237 00238 /* Define the bits that go in the options field for InitializeNetwork 00239 ** 00240 ** The low two bits define the byte order of messages at the DICOM 00241 ** level. This does not define the order of user data inside of a 00242 ** DICOM PDU. 00243 */ 00244 00245 #define DUL_ORDERMASK 0x03 /* The bottom two bits */ 00246 #define DUL_ORDERLITTLEENDIAN 0x01 00247 #define DUL_ORDERBIGENDIAN 0x02 00248 00249 #define DUL_DOMAINMASK 0x04 00250 #define DUL_FULLDOMAINNAME 0x04 00251 00252 #define DUL_AEREQUESTOR "AE REQUESTOR" 00253 #define DUL_AEACCEPTOR "AE ACCEPTOR" 00254 #define DUL_AEBOTH "AE BOTH" 00255 00256 /* These macros define results and reasons for rejecting an association 00257 ** request. Result is permanent or transient. There are a number of 00258 ** different reasons for rejecting requests that occur at different layers 00259 */ 00260 #define DUL_REJ_RSLTPERMANENT 0x01 00261 #define DUL_REJ_RSLTTRANSIENT 0x02 00262 00263 /* These macros define parameters used to construct an ABORT PDU. 00264 ** These include the source of the abort (SCU or SCP) and the 00265 ** reason for the abort. 00266 */ 00267 00268 #define DUL_SCU_INITIATED_ABORT 0x00 00269 #define DUL_SCP_INITIATED_ABORT 0x02 00270 00271 #define DUL_ABORTSERVICEUSER 0x00 00272 #define DUL_ABORTSERVICEPROVIDER 0x02 00273 00274 00275 #define DUL_ABORTNOREASON 0x00 00276 #define DUL_ABORTUNRECOGNIZEDPDU 0x01 00277 #define DUL_ABORTUNEXPECTEDPDU 0x02 00278 #define DUL_ABORTUNRECOGNIZEDPDUPARAM 0x04 00279 #define DUL_ABORTUNEXPECTEDPDUPARAM 0x05 00280 #define DUL_ABORTINVALIDPDUPARAM 0x06 00281 00282 /* These macros define parameters used to construct a REJECT PDU. 00283 ** These include the source of the reject (DICOM UL service-user, 00284 ** (DICOM UL service-provider) and the reason for the reject. 00285 */ 00286 #define DUL_REJECT_PERMANENT 0x01 00287 #define DUL_REJECT_TRANSIENT 0x02 00288 00289 #define DUL_ULSU_REJECT 0x01 00290 #define DUL_ULSP_ACSE_REJECT 0x02 00291 #define DUL_ULSP_PRESENTATION_REJECT 0x03 00292 00293 #define DUL_ULSU_REJ_NOREASON 0x01 00294 #define DUL_ULSU_REJ_UNSUP_APP_CTX_NAME 0x02 00295 #define DUL_ULSU_REJ_UNREC_CALLING_TITLE 0x03 00296 #define DUL_ULSU_REJ_UNREC_CALLED_TITLE 0x07 00297 00298 #define DUL_ULSP_ACSE_REJ_NOREASON 0x01 00299 #define DUL_ULSP_ACSE_UNSUP_PROTOCOL 0x02 00300 00301 #define DUL_ULSP_PRES_REJ_TEMP_CONGEST 0x01 00302 #define DUL_ULSP_PRES_REJ_LIMIT 0x02 00303 00304 #define DUL_ABORTNOREASON 0x00 00305 #define DUL_ABORTUNRECOGNIZEDPDU 0x01 00306 #define DUL_ABORTUNEXPECTEDPDU 0x02 00307 #define DUL_ABORTUNRECOGNIZEDPDUPARAM 0x04 00308 #define DUL_ABORTUNEXPECTEDPDUPARAM 0x05 00309 #define DUL_ABORTINVALIDPDUPARAM 0x06 00310 00311 /* Define a set of constants and types that let the user get information 00312 ** about the Association 00313 */ 00314 00315 typedef enum { 00316 DUL_K_INTEGER, /* An integer type */ 00317 DUL_K_STRING /* A string type */ 00318 } DUL_DATA_TYPE; 00319 typedef enum { 00320 DUL_K_MAX_PDV_XMIT 00321 } DUL_ASSOCIATION_PARAMETER; 00322 00323 #define DUL_TIMEOUT 180 00324 00325 /* Operating mode flags as defined in the 1993 toolkit specification. 00326 ** Needed for backward compatibility with DCMTK releases prior to 3.0 00327 ** (and possibly older CTN releases). 00328 */ 00329 00330 #define DUL_DULCOMPAT 2768240730UL 00331 #define DUL_DIMSECOMPAT 262144UL 00332 #define DUL_MAXPDUCOMPAT 4278190335UL 00333 00334 /* Define the function prototypes for this facility. 00335 ** 00336 ** First set of functions are for establishing the network and associations. 00337 */ 00338 00339 OFCondition 00340 DUL_AcknowledgeAssociationRQ( 00341 DUL_ASSOCIATIONKEY ** association, 00342 DUL_ASSOCIATESERVICEPARAMETERS * params, 00343 int activatePDUStorage); 00344 00345 OFCondition 00346 DUL_InitializeNetwork( 00347 const char *mode, 00348 void *param, 00349 int timeout, 00350 unsigned long 00351 options, 00352 DUL_NETWORKKEY ** network); 00353 00354 OFCondition 00355 DUL_ReceiveAssociationRQ( 00356 DUL_NETWORKKEY ** net, 00357 DUL_BLOCKOPTIONS blk, 00358 int timeout, 00359 DUL_ASSOCIATESERVICEPARAMETERS * parameters, 00360 DUL_ASSOCIATIONKEY ** association, 00361 int activatePDUStorage); 00362 00363 OFCondition 00364 DUL_RejectAssociationRQ( 00365 DUL_ASSOCIATIONKEY ** association, 00366 DUL_ABORTITEMS * params, 00367 int activatePDUStorage); 00368 00369 OFCondition 00370 DUL_RequestAssociation( 00371 DUL_NETWORKKEY ** network, 00372 DUL_ASSOCIATESERVICEPARAMETERS * params, 00373 DUL_ASSOCIATIONKEY ** association, 00374 int activatePDUStorage); 00375 00376 /* Define functions for releasing/aborting Associations. 00377 */ 00378 OFCondition DUL_AbortAssociation(DUL_ASSOCIATIONKEY ** association); 00379 OFCondition DUL_DropAssociation(DUL_ASSOCIATIONKEY ** association); 00380 OFCondition DUL_DropNetwork(DUL_NETWORKKEY ** network); 00381 OFCondition DUL_ReleaseAssociation(DUL_ASSOCIATIONKEY ** association); 00382 OFCondition DUL_AcknowledgeRelease(DUL_ASSOCIATIONKEY ** association); 00383 00384 /* Functions for reading/write PDVs inside P DATA PDUs. 00385 */ 00386 OFCondition 00387 DUL_ReadPDVs(DUL_ASSOCIATIONKEY ** association, 00388 DUL_PDVLIST * pdvList, DUL_BLOCKOPTIONS block, int timeout); 00389 OFCondition 00390 DUL_WritePDVs(DUL_ASSOCIATIONKEY ** association, 00391 DUL_PDVLIST * pdvList); 00392 OFCondition DUL_NextPDV(DUL_ASSOCIATIONKEY ** association, DUL_PDV * pdv); 00393 00394 00395 /* Miscellaneous functions. 00396 */ 00397 const char *DUL_Message(OFCondition cond); 00398 void DUL_Debug(OFBool flag); 00399 OFCondition 00400 DUL_AssociationParameter(DUL_ASSOCIATIONKEY ** association, 00401 DUL_ASSOCIATION_PARAMETER param, DUL_DATA_TYPE type, 00402 void *address, size_t length); 00403 OFCondition 00404 DUL_MakePresentationCtx(DUL_PRESENTATIONCONTEXT ** ctx, 00405 DUL_SC_ROLE proposedSCRole, DUL_SC_ROLE acceptedSCRole, 00406 DUL_PRESENTATIONCONTEXTID ctxID, unsigned char reason, const char *abstractSyntax, 00407 const char *transferSyntax,...); 00408 void DUL_DumpParams(DUL_ASSOCIATESERVICEPARAMETERS * params); 00409 void DUL_DumpConnectionParameters(DUL_ASSOCIATIONKEY *association, ostream& outstream); 00410 00411 OFCondition DUL_ClearServiceParameters(DUL_ASSOCIATESERVICEPARAMETERS * params); 00412 void DUL_DefaultServiceParameters(DUL_ASSOCIATESERVICEPARAMETERS * params); 00413 void dumpExtNegList(SOPClassExtendedNegotiationSubItemList& lst); 00414 00415 /* 00416 ** Additional functions (from dulextra.cc) needed to support 00417 ** selecting amongst several concurrent associations. 00418 ** Andrew Hewett, Institute OFFIS, Oldenburg, Germany. 00419 */ 00420 00421 OFBool 00422 DUL_dataWaiting(DUL_ASSOCIATIONKEY * callerAssociation, int timeout); 00423 int 00424 DUL_networkSocket(DUL_NETWORKKEY * callerNet); 00425 OFBool 00426 DUL_associationWaiting(DUL_NETWORKKEY * callerNet, int timeout); 00427 00428 /* 00429 * functions allowing to retrieve raw A-ASSOCIATE PDUs from the DUL layer 00430 */ 00431 void DUL_activateAssociatePDUStorage(DUL_ASSOCIATIONKEY *dulassoc); 00432 void DUL_returnAssociatePDUStorage(DUL_ASSOCIATIONKEY *dulassoc, void *& pdu, unsigned long& pdusize); 00433 00434 /* get pointer to transport connection from opaque association pointer */ 00435 DcmTransportConnection *DUL_getTransportConnection(DUL_ASSOCIATIONKEY * callerAssociation); 00436 00437 /* change transport layer */ 00438 OFCondition DUL_setTransportLayer(DUL_NETWORKKEY *callerNetworkKey, DcmTransportLayer *newLayer, int takeoverOwnership); 00439 00440 /* activate compatibility mode and callback */ 00441 void DUL_activateCompatibilityMode(DUL_ASSOCIATIONKEY *dulassoc, unsigned long mode); 00442 void DUL_activateCallback(DUL_ASSOCIATIONKEY *dulassoc, DUL_ModeCallback *cb); 00443 00444 /* 00445 * function allowing to retrieve the peer certificate from the DUL layer 00446 */ 00447 unsigned long DUL_getPeerCertificateLength(DUL_ASSOCIATIONKEY *dulassoc); 00448 unsigned long DUL_getPeerCertificate(DUL_ASSOCIATIONKEY *dulassoc, void *buf, unsigned long bufLen); 00449 00450 /* 00451 * functions for multi-process servers 00452 */ 00453 00459 OFBool DUL_processIsForkedChild(); 00460 00465 void DUL_markProcessAsForkedChild(); 00466 00479 void DUL_requestForkOnTransportConnectionReceipt(int argc, char *argv[]); 00480 00481 #endif 00482 00483 /* 00484 ** CVS Log 00485 ** $Log: dul.h,v $ 00486 ** Revision 1.23 2005/12/12 15:15:08 meichel 00487 ** Added missing include dependency 00488 ** 00489 ** Revision 1.22 2005/12/09 14:48:35 meichel 00490 ** Added missing virtual destructors 00491 ** 00492 ** Revision 1.21 2005/12/08 16:02:23 meichel 00493 ** Changed include path schema for all DCMTK header files 00494 ** 00495 ** Revision 1.20 2005/11/25 11:31:11 meichel 00496 ** StoreSCP now supports multi-process mode both on Posix and Win32 platforms 00497 ** where a separate client process is forked for each incoming association. 00498 ** 00499 ** Revision 1.19 2004/02/25 12:31:15 meichel 00500 ** Added global option flag for compatibility with very old DCMTK releases in the 00501 ** DICOM upper layer and ACSE code. Default is automatic handling, which should 00502 ** work in most cases. 00503 ** 00504 ** Revision 1.18 2003/08/14 09:01:37 meichel 00505 ** Adapted type casts to new-style typecast operators defined in ofcast.h 00506 ** 00507 ** Revision 1.17 2003/06/10 13:37:36 meichel 00508 ** Added support for TCP wrappers in DICOM network layer 00509 ** 00510 ** Revision 1.16 2003/06/06 13:07:29 meichel 00511 ** Introduced global flag dcmExternalSocketHandle which allows 00512 ** to pass an already opened socket file descriptor to dcmnet. 00513 ** 00514 ** Revision 1.15 2003/06/02 16:44:11 meichel 00515 ** Renamed local variables to avoid name clashes with STL 00516 ** 00517 ** Revision 1.14 2002/11/28 16:57:36 meichel 00518 ** Added global flag dcmConnectionTimeout that defines a timeout for 00519 ** outgoing association requests in the DICOM upper layer. 00520 ** 00521 ** Revision 1.13 2001/11/27 09:54:33 wilkens 00522 ** Updated storescp. 6 new options (--output-directory, --sort-conc-studies, 00523 ** --exec-on-reception, --exec-on-eostudy, --rename-on-eostudy, and 00524 ** --eostudy-timeout) implemented (requirements from GO-Kard). 00525 ** 00526 ** Revision 1.12 2001/10/12 10:18:27 meichel 00527 ** Replaced the CONDITION types, constants and functions in the dcmnet module 00528 ** by an OFCondition based implementation which eliminates the global condition 00529 ** stack. This is a major change, caveat emptor! 00530 ** 00531 ** Revision 1.11 2001/09/26 12:28:59 meichel 00532 ** Implemented changes in dcmnet required by the adaptation of dcmdata 00533 ** to class OFCondition. Removed some unused code. 00534 ** 00535 ** Revision 1.10 2001/06/01 11:02:02 meichel 00536 ** Implemented global flag and command line option to disable reverse 00537 ** DNS hostname lookup using gethostbyaddr when accepting associations. 00538 ** 00539 ** Revision 1.9 2000/10/10 12:06:54 meichel 00540 ** Updated transport layer error codes and routines for printing 00541 ** connection parameters. 00542 ** 00543 ** Revision 1.8 2000/08/10 14:50:54 meichel 00544 ** Added initial OpenSSL support. 00545 ** 00546 ** Revision 1.7 2000/06/07 08:57:22 meichel 00547 ** dcmnet ACSE routines now allow to retrieve a binary copy of the A-ASSOCIATE 00548 ** RQ/AC/RJ PDUs, e.g. for logging purposes. 00549 ** 00550 ** Revision 1.6 1999/04/19 08:39:27 meichel 00551 ** Added experimental support for extended SOP class negotiation. 00552 ** 00553 ** Revision 1.5 1999/03/29 11:19:59 meichel 00554 ** Cleaned up dcmnet code for char* to const char* assignments. 00555 ** 00556 ** Revision 1.4 1998/06/29 12:14:27 meichel 00557 ** Removed some name clashes (e.g. local variable with same 00558 ** name as class member) to improve maintainability. 00559 ** Applied some code purifications proposed by the gcc 2.8.1 -Weffc++ option. 00560 ** 00561 ** Revision 1.3 1997/07/21 08:40:11 andreas 00562 ** - Replace all boolean types (BOOLEAN, CTNBOOLEAN, DICOM_BOOL, BOOL) 00563 ** with one unique boolean type OFBool. 00564 ** 00565 ** Revision 1.2 1997/01/13 15:53:02 hewett 00566 ** Added missing function prototypes (required for CodeWarrior 10). 00567 ** 00568 ** Revision 1.1.1.1 1996/03/26 18:38:44 hewett 00569 ** Initial Release. 00570 ** 00571 ** 00572 */